{"id":254408,"date":"2015-04-02T23:19:02","date_gmt":"2015-04-02T19:19:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=254408"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=254408","title":{"rendered":"Qooxdoo. \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c TODO List"},"content":{"rendered":"<p> \t\t\t\u041d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u043b\u0438\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e javascript \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432, \u043f\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0438\u0437 \u043d\u0438\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0433\u043e\u0440\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u042f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043f\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043c\u043d\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e \u0443 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<p>  \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f qooxdoo. \u041f\u0440\u043e\u0438\u0437\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u00ab\u043a\u0443\u043a\u0441\u0434\u0443\u00bb (\u043a\u043e\u043c\u0443 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u0442\u0440\u0438\u043f\u0446\u0438\u044f: [&#8216;kuksdu:]).<\/p>\n<p>  \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u0441\u0432\u0435\u043b\u0438\u0441\u044c \u043a \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c \u043e \u0432\u044b\u0445\u043e\u0434\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u043b\u0438 \u043a \u043f\u0430\u0440\u0430\u043c \u0430\u0431\u0437\u0430\u0446\u0435\u0432 \u0432 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0442\u0438\u043f\u0430 \u00ab\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u0430\u043a\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u043f\u043e\u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438\u00bb. \u042f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 qooxdoo \u0438 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0437\u0432\u0435\u0440\u044c \u0438 \u0441 \u0447\u0435\u043c \u0435\u0433\u043e \u0435\u0434\u044f\u0442. \u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u00ab\u043f\u043e\u0445\u043e\u0436\u00bb \u043d\u0430 ExtJS. \u0421\u043b\u043e\u0432\u043e \u00ab\u043f\u043e\u0445\u043e\u0436\u00bb \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u043e \u044f \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u044e\u0441\u044c \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u043d\u0435\u0434\u0440\u0430\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <a href=\"http:\/\/www.1and1.com\/\">1&#038;1 Internet AG<\/a>. \u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f 0.1 \u0432\u044b\u0448\u043b\u0430 \u0432 2005 \u0433\u043e\u0434\u0443. \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f 4.1, \u043f\u0440\u043e \u043d\u0435\u0435 \u0438 \u0431\u0443\u0434\u0435\u043c \u0432\u0435\u0441\u0442\u0438 \u0440\u0435\u0447\u044c. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043c\u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u043b\u0438\u0441\u044c Qt \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u0435\u0442\u0438\u0449\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0443\u043c\u043a\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043b\u044e\u0434\u044f\u043c \u0431\u0435\u0437 \u0437\u043d\u0430\u043d\u0438\u044f HTML, CSS \u0438 DOM \u043c\u043e\u0434\u0435\u043b\u0438. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e qooxdoo \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041d\u043e\u0432\u0438\u0447\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0434\u043c\u0438\u043d\u043a\u0443 \u0432 \u0432\u0438\u0434\u0435 single page application (\u0434\u0430\u043b\u0435\u0435 SPA) \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e HTML \u0442\u0435\u0433\u0430, \u0430 \u043f\u0440\u043e CSS \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u042d\u0442\u043e \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u044f HTML, CSS \u0438 DOM \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0440\u0435\u0437\u043a\u043e \u0441\u0442\u0430\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u041f\u0440\u043e\u0441\u0442\u043e, \u043f\u043e\u043d\u0430\u0447\u0430\u043b\u0443, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043d\u0438\u0445. \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0432\u0435\u0431\u0435.<\/p>\n<p>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 <a href=\"http:\/\/qooxdoo.org\/demos\">\u0434\u0435\u043c\u043e<\/a> \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b <a href=\"http:\/\/qooxdoo.org\/community\/real_life_examples\">\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/a> \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435.<\/p>\n<p>  \u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0441\u043a\u0443\u0448\u043d\u043e \u0438 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u044d\u0442\u043e \u0443\u0436\u0435 \u0438 \u0442\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043b\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u041c\u043d\u043e\u0433\u0438\u0435 \u0437\u043d\u0430\u044e\u0442 \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <a href=\"http:\/\/todomvc.com\/\">http:\/\/todomvc.com\/<\/a>. \u0412\u043e\u0442 \u0438 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c qooxdoo. \u0421\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 <a href=\"http:\/\/demo.qooxdoo.org\/current\/todo\/\">\u0434\u0435\u043c\u043e todo \u043b\u0438\u0441\u0442\u0430<\/a>, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e SPA (Desktop \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 qooxdoo). \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c qooxdoo sdk. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e <a href=\"http:\/\/qooxdoo.org\/downloads\">\u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435<\/a>. SDK \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u044f\u0434 \u0443\u0442\u0438\u043b\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0443\u044e \u0438 \u0440\u0435\u043b\u0438\u0437\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u043e\u043a\u0443\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0442\u0443\u0442\u044b \u0438 \u0442.\u0434. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u043f\u043e \u0442\u0443\u043b\u0447\u0435\u0439\u043d\u0443 \u043c\u043e\u0436\u043d\u043e <a href=\"http:\/\/manual.qooxdoo.org\/current\/pages\/tool.html\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c:<\/p>\n<pre><code class=\"bash\">create-application.py --name=todos <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u0430\u0440\u043a\u0430\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/b2f\/8d6\/e61\/b2f8d6e619794755a19232f7ced2c7a7.png\"\/><\/p>\n<p>  \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u043f\u0443\u0441\u0442\u044b\u043c. \u041e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443, \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f alert.<br \/>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b Application.js \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"javascript\">\/**  * This is the main application class of your custom application &quot;todos&quot;  *  * @asset(todos\/*)  *\/ qx.Class.define(&quot;todos.Application&quot;, {   extend : qx.application.Standalone,   members : {     \/**      * This method contains the initial application code and gets called       * during startup of the application      *       * @lint ignoreDeprecated(alert)      *\/     main : function() {       \/\/ Call super class       this.base(arguments);        \/\/ Enable logging in debug variant       if (qx.core.Environment.get(&quot;qx.debug&quot;)) {         \/\/ support native logging capabilities, e.g. Firebug for Firefox         qx.log.appender.Native;         \/\/ support additional cross-browser console. Press F7 to toggle visibility         qx.log.appender.Console;       }        \/*       -------------------------------------------------------------------------         Below is your actual application code...       -------------------------------------------------------------------------       *\/        \/\/ Create a button       var button1 = new qx.ui.form.Button(&quot;First Button&quot;, &quot;todos\/test.png&quot;);        \/\/ Document is the application root       var doc = this.getRoot();        \/\/ Add button to document at fixed coordinates       doc.add(button1, {left: 100, top: 50});        \/\/ Add an event listener       button1.addListener(&quot;execute&quot;, function(e) {         alert(&quot;Hello World!&quot;);       });     }   } }); <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0437\u0430\u0434\u0443\u043c\u043a\u0443 \u0430\u0432\u0442\u043e\u0440\u043e\u0432, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0435\u0431\u0430\u0436\u043d\u0443\u044e \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<br \/>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c:<\/p>\n<pre><code class=\"bash\">.\/generate.py source <\/code><\/pre>\n<p>  \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<\/p>\n<pre><code class=\"bash\">.\/generate.py build <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u0440\u0443\u0437\u0438\u043c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 index.html \u0444\u0430\u0439\u043b \u0438 \u0432\u0438\u0434\u0438\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/59a\/f81\/6bb\/59af816bbc89433090603c56d41d408b.png\"\/><\/p>\n<p>  \u041d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c, \u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c. <s>\u041c\u043e\u0436\u043d\u043e \u0433\u0440\u0430\u0431\u0438\u0442\u044c \u043a\u043e\u0440\u043e\u0432\u0430\u043d\u044b.<\/s> \u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u0427\u0443\u0434\u0430 \u043d\u0435 \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u0447\u0435\u043c \u043c\u044b, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0445 \u0441\u0440\u0430\u0437\u0443 \u0434\u0430\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <a href=\"https:\/\/github.com\/VasisualyLokhankin\/todolist_qooxdoo\">github<\/a> \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043a\u0440\u043e\u043c\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0441 \u0433\u0438\u0442\u0445\u0430\u0431\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c SDK \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435 config.json \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u00abQOOXDOO_PATH\u00bb. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435.<\/p>\n<p>  \u041d\u0443 \u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0432 \u0435\u0433\u043e \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435.<br \/>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043e\u043a\u043d\u0430 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e todo \u043b\u0438\u0441\u0442\u0430 \u0438 \u0431\u0435\u0437\u0436\u0430\u043b\u043e\u0441\u0442\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u043c \u0438\u0437 Application.js \u0432\u0441\u0435 \u0447\u0442\u043e \u0442\u0430\u043c \u043d\u0430\u043c \u043d\u0430\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0443 \u043d\u0430\u0441 \u0441\u043b\u0435\u0434\u0443\u0449\u0435\u0435.<\/p>\n<p>  Window.js  <\/p>\n<pre><code class=\"javascript\">qx.Class.define(&quot;todos.Window&quot;, {   extend : qx.ui.window.Window,    construct: function(){     this.base(arguments);      this.set({       caption: &quot;todos&quot;,       width: 480,       height: 640,       allowMinimize: false,       allowMaximize: false,       allowClose: false     });      this.addListenerOnce(&quot;appear&quot;, function(){       this.center();     }, this);   } }); <\/code><\/pre>\n<p>  Application.js  <\/p>\n<pre><code class=\"javascript\">\/**  * @asset(todos\/*)  *\/ qx.Class.define(&quot;todos.Application&quot;, {   extend : qx.application.Standalone,   members : {     main : function() {       \/\/ Call super class       this.base(arguments);        var wnd = new todos.Window;       wnd.show();     }   } }); <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043a\u0440\u0430\u0441\u043e\u0442\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/10a\/d2e\/39b\/10ad2e39bc534dd1ab3256063ce9327c.png\"\/><\/p>\n<p>  \u041f\u043e\u0440\u0430 \u043d\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0435 \u0441\u043c\u044b\u0441\u043b\u043e\u043c. \u041d\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b: \u0442\u0443\u043b\u0431\u0430\u0440, \u0437\u0430\u043f\u0438\u0441\u044c todo \u043b\u0438\u0441\u0442\u0430 \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043b\u0438\u0441\u0442. \u0417\u0430\u043f\u0438\u0441\u044c todo \u043b\u0438\u0441\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c, \u043e\u0444\u043e\u0440\u043c\u0438\u043c \u0435\u0433\u043e \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430. \u0422\u0443\u043b\u0431\u0430\u0440 \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043b\u0438\u0441\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e, \u0442\u0430\u043a \u0438 \u0447\u0430\u0441\u0442\u044c\u044e Window. \u0422\u0443\u043b\u0431\u0430\u0440 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u043c, \u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0447\u0430\u0441\u0442\u044c\u044e Window, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u0442\u0430\u043a \u0438 \u0442\u0430\u043a. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0436\u0438\u0437\u043d\u044c\u044e.<\/p>\n<p>  ToDo.js  <\/p>\n<pre><code class=\"javascript\">qx.Class.define(&quot;todos.ToDo&quot;, {   extend: qx.ui.core.Widget,    events : {     remove : &quot;qx.event.type.Event&quot;   },    properties: {     completed: {       init: false,       check: &quot;Boolean&quot;,       event: &quot;completedChanged&quot;     },      appearance: {       refine: true,       init: &quot;todo&quot;     }   },    construct: function(text){     this.base(arguments);      var grid = new qx.ui.layout.Grid;     grid.setColumnWidth(0, 20);     grid.setColumnFlex(1, 1);     grid.setColumnWidth(2, 20);     grid.setColumnAlign(0, &quot;center&quot;, &quot;middle&quot;);     grid.setColumnAlign(1, &quot;left&quot;, &quot;middle&quot;);     grid.setColumnAlign(2, &quot;center&quot;, &quot;middle&quot;);      this._setLayout(grid);     this._add(this.getChildControl(&quot;checkbox&quot;), {row: 0, column: 0});     this._add(this.getChildControl(&quot;text-container&quot;), {row: 0, column: 1});     this._add(this.getChildControl(&quot;icon&quot;), {row: 0, column: 2});      this.getChildControl(&quot;label&quot;).setValue(text);      this.addListener(&quot;mouseover&quot;, function(){this.getChildControl(&quot;icon&quot;).show();}, this);     this.addListener(&quot;mouseout&quot;, function(){this.getChildControl(&quot;icon&quot;).hide();}, this);     this.getChildControl(&quot;icon&quot;).hide();      this.getChildControl(&quot;text-container&quot;).addListener(&quot;dblclick&quot;, this.__editToDo, this);   },    members : {      \/\/ overridden     _createChildControlImpl: function(id) {       var control;        switch(id) {         case &quot;checkbox&quot;:           control = new qx.ui.form.CheckBox;           this.bind(&quot;completed&quot;, control, &quot;value&quot;);           control.bind(&quot;value&quot;, this, &quot;completed&quot;);           break;         case &quot;text-container&quot;:           control = new qx.ui.container.Composite(new qx.ui.layout.HBox);           control.add(this.getChildControl(&quot;label&quot;), {flex: 1});           break;         case &quot;label&quot;:           control = new qx.ui.basic.Label;           control.bind(&quot;value&quot;, control, &quot;toolTipText&quot;);           break;         case &quot;textfield&quot;:           control = new qx.ui.form.TextField;           control.addListener(&quot;keypress&quot;, function(event){             var key = event.getKeyIdentifier();             switch(key) {               case &quot;Enter&quot;:                 this.__editComplete();                 break;               case &quot;Escape&quot;:                 this.__editCancel();                 break;             }           }, this);           control.addListener(&quot;blur&quot;, this.__editComplete, this);           break;         case &quot;icon&quot;:           control = new qx.ui.basic.Image(&quot;todos\/icon-remove-circle.png&quot;);           control.addListener(&quot;click&quot;, function(){             this.fireEvent(&quot;remove&quot;);           }, this);           break;       }       return control || this.base(arguments, id);     },      __editToDo : function() {       var tc = this.getChildControl(&quot;text-container&quot;);       var tf = this.getChildControl(&quot;textfield&quot;);       tc.removeAll();       tc.add(tf, {flex: 1});       tf.setValue(this.getChildControl(&quot;label&quot;).getValue());       tf.focus();       tf.activate();     },      __editComplete : function() {       this.getChildControl(&quot;label&quot;).setValue(this.getChildControl(&quot;textfield&quot;).getValue());       this.__editCancel();     },      __editCancel : function() {       var tc = this.getChildControl(&quot;text-container&quot;);       tc.removeAll();       tc.add(this.getChildControl(&quot;label&quot;), {flex: 1});     }   } }); <\/code><\/pre>\n<p>  StatusBar.js  <\/p>\n<pre><code class=\"javascript\">qx.Class.define(&quot;todos.StatusBar&quot;, {   extend: qx.ui.core.Widget,    events: {     removeCompleted: &quot;qx.event.type.Event&quot;   },    properties: {     todos: {       init: [],       check: &quot;Array&quot;     },      filter: {       init: &quot;all&quot;,       check: [&quot;all&quot;, &quot;active&quot;, &quot;completed&quot;],       event: &quot;filterChanged&quot;     }   },    construct: function() {     this.base(arguments);      var grid = new qx.ui.layout.Grid;     grid.setColumnWidth(0, 100);     grid.setColumnFlex(1, 1);     grid.setColumnWidth(2, 130);     grid.setColumnAlign(0, &quot;left&quot;, &quot;middle&quot;);     grid.setColumnAlign(1, &quot;center&quot;, &quot;middle&quot;);     grid.setColumnAlign(2, &quot;right&quot;, &quot;middle&quot;);     grid.setRowHeight(0, 26);      this._setLayout(grid);     this._add(this.getChildControl(&quot;info&quot;), {row: 0, column: 0});     this._add(this.getChildControl(&quot;filter&quot;), {row: 0, column: 1});     this._add(this.getChildControl(&quot;remove-completed-button&quot;), {row: 0, column: 2});     this.update();   },    destruct: function() {     this.__rgFilter.dispose();   },    members : {     __rgFilter: null,      update: function() {       var todosCount = this.getTodos().length;       var itemsLeft = this.getTodos().filter(function(item){return !item.getCompleted();}).length;       this.getChildControl(&quot;info&quot;).setValue(&quot;&lt;b&gt;&quot;+itemsLeft+&quot;&lt;\/b&gt; items left&quot;);       if (itemsLeft === todosCount) {         this.getChildControl(&quot;remove-completed-button&quot;).exclude();       } else {         this.getChildControl(&quot;remove-completed-button&quot;).setLabel(&quot;Clear completed (&quot;+(todosCount-itemsLeft)+&quot;)&quot;);         this.getChildControl(&quot;remove-completed-button&quot;).show();       }     },      \/\/ overridden     _createChildControlImpl: function(id) {       var control;        switch(id) {         case &quot;info&quot;:           control = new qx.ui.basic.Label;           control.setRich(true);           break;         case &quot;filter&quot;:           control = new qx.ui.container.Composite(new qx.ui.layout.HBox);           control.add(this.getChildControl(&quot;rb-filter-all&quot;));           control.add(this.getChildControl(&quot;rb-filter-active&quot;));           control.add(this.getChildControl(&quot;rb-filter-completed&quot;));           this.__rgFilter = new qx.ui.form.RadioGroup(             this.getChildControl(&quot;rb-filter-all&quot;),             this.getChildControl(&quot;rb-filter-active&quot;),             this.getChildControl(&quot;rb-filter-completed&quot;)           );           this.__rgFilter.addListener(&quot;changeSelection&quot;, this.__onFilterChanged, this);           break;         case &quot;rb-filter-all&quot;:           control = new qx.ui.form.RadioButton(&quot;All&quot;);           control.setUserData(&quot;value&quot;, &quot;all&quot;);           break;         case &quot;rb-filter-active&quot;:           control = new qx.ui.form.RadioButton(&quot;Active&quot;);           control.setUserData(&quot;value&quot;, &quot;active&quot;);           break;         case &quot;rb-filter-completed&quot;:           control = new qx.ui.form.RadioButton(&quot;Completed&quot;);           control.setUserData(&quot;value&quot;, &quot;completed&quot;);           break;         case &quot;remove-completed-button&quot;:           control = new qx.ui.form.Button;           control.addListener(&quot;execute&quot;, function(){             this.fireEvent(&quot;removeCompleted&quot;);           }, this);           break;       }       return control || this.base(arguments, id);     },      __onFilterChanged : function(event) {       this.setFilter(event.getData()[0].getUserData(&quot;value&quot;));     }   } }); <\/code><\/pre>\n<p>  Window.js  <\/p>\n<pre><code class=\"javascript\">qx.Class.define(&quot;todos.Window&quot;, {   extend: qx.ui.window.Window,    properties: {     appearance: {       refine: true,       init: &quot;todo-window&quot;     },      todos: {       init: [],       check: &quot;Array&quot;,       event: &quot;todosChanged&quot;     },      filter: {       init: &quot;all&quot;,       check: [&quot;all&quot;, &quot;active&quot;, &quot;completed&quot;],       apply: &quot;__applyFilter&quot;     }   },    construct: function(){     this.base(arguments);      this.set({       caption: &quot;todos&quot;,       width: 480,       height: 640,       allowMinimize: false,       allowMaximize: false,       allowClose: false     });      this.setLayout(new qx.ui.layout.VBox(2));     this.add(this.getChildControl(&quot;todo-writer&quot;));     this.add(this.getChildControl(&quot;todos-scroll&quot;), {flex: 1});     this.add(this.getChildControl(&quot;statusbar&quot;));      this.addListenerOnce(&quot;appear&quot;, function(){       this.center();     }, this);   },    destruct : function() {     var todoItems = this.getTodos();     for (var i= 0, l=todoItems.length; i&lt;l; i++) {       todoItems[i].dispose();     }   },    members : {     \/\/ overridden     _createChildControlImpl: function(id) {       var control;        switch(id) {         case &quot;todo-writer&quot;:           var grid = new qx.ui.layout.Grid;           grid.setColumnWidth(0, 20);           grid.setColumnFlex(1, 1);           grid.setColumnAlign(0, &quot;center&quot;, &quot;middle&quot;);           grid.setColumnAlign(1, &quot;left&quot;, &quot;middle&quot;);           control = new qx.ui.container.Composite(grid);           control.add(this.getChildControl(&quot;checkbox&quot;), {row: 0, column: 0});           control.add(this.getChildControl(&quot;textfield&quot;), {row: 0, column: 1});           break;         case &quot;checkbox&quot;:           control = new qx.ui.form.CheckBox;           control.addListener(&quot;changeValue&quot;, this.__onCheckAllChanged, this);           break;         case &quot;textfield&quot;:           control = new qx.ui.form.TextField;           control.setPlaceholder(&quot;What needs to be done?&quot;);           control.addListener(&quot;keydown&quot;, this.__onWriterTextFieldKeydown, this);           break;         case &quot;todos-scroll&quot;:           control = new qx.ui.container.Scroll;           control.add(this.getChildControl(&quot;todos-container&quot;));           break;         case &quot;todos-container&quot;:           control = new qx.ui.container.Composite(new qx.ui.layout.VBox(1));           break;         case &quot;statusbar&quot;:           control = new todos.StatusBar;           control.bind(&quot;filter&quot;, this, &quot;filter&quot;);           this.bind(&quot;todos&quot;, control, &quot;todos&quot;);           control.addListener(&quot;removeCompleted&quot;, this.__onRemoveCompleted, this);           break;       }       return control || this.base(arguments, id);     },      __onWriterTextFieldKeydown : function(event) {       var key = event.getKeyIdentifier();       switch(key) {         case &quot;Enter&quot;:           var value = event.getTarget().getValue();           if (value) {             event.getTarget().setValue(&quot;&quot;);             var todo = new todos.ToDo(value);             this.getTodos().push(todo);             todo.addListenerOnce(&quot;remove&quot;, this.__onTodoRemove, this);             todo.addListener(&quot;completedChanged&quot;, this.__onTodoCompletedChanged, this);              this.__updateTodoList();             this.getChildControl(&quot;statusbar&quot;).update();              var cbAll = this.getChildControl(&quot;checkbox&quot;);             cbAll.removeListener(&quot;changeValue&quot;, this.__onCheckAllChanged, this);             cbAll.setValue(false);             cbAll.addListener(&quot;changeValue&quot;, this.__onCheckAllChanged, this);           }           break;         case &quot;Escape&quot;:           event.getTarget().setValue(&quot;&quot;);           break;       }     },      __updateTodoList : function() {       var toList;       switch(this.getFilter()) {         case &quot;all&quot;:           toList = this.getTodos();           break;         case &quot;active&quot;:           toList = this.getTodos().filter(function(item){return !item.getCompleted();});           break;         case &quot;completed&quot;:           toList = this.getTodos().filter(function(item){return item.getCompleted();});           break;       }       var container = this.getChildControl(&quot;todos-container&quot;);       container.removeAll();       toList.forEach(function(item){         container.add(item);       });     },      __applyFilter : function() {       this.__updateTodoList();     },      __onTodoRemove : function(event) {       var todo = event.getTarget();       this.setTodos(this.getTodos().filter(function(item){return item !== todo;}));       this.getChildControl(&quot;todos-container&quot;).remove(todo);       todo.dispose();       this.getChildControl(&quot;statusbar&quot;).update();     },      __onTodoCompletedChanged : function() {       var cbAll = this.getChildControl(&quot;checkbox&quot;);       cbAll.removeListener(&quot;changeValue&quot;, this.__onCheckAllChanged, this);       cbAll.setValue(this.getTodos().length === this.getTodos().filter(function(item){return item.getCompleted();}).length);       cbAll.addListener(&quot;changeValue&quot;, this.__onCheckAllChanged, this);       this.__updateTodoList();       this.getChildControl(&quot;statusbar&quot;).update();     },      __onCheckAllChanged : function(event) {       var value = event.getData();       this.getTodos().forEach(function(todo){         todo.removeListener(&quot;completedChanged&quot;, this.__onTodoCompletedChanged, this);         todo.setCompleted(value);         todo.addListener(&quot;completedChanged&quot;, this.__onTodoCompletedChanged, this);       }, this);       this.__updateTodoList();       this.getChildControl(&quot;statusbar&quot;).update();     },      __onRemoveCompleted : function() {       var completed = this.getTodos().filter(function(item){return item.getCompleted();});       this.setTodos(this.getTodos().filter(function(item){return !item.getCompleted();}));       completed.forEach(function(todo){         this.getChildControl(&quot;todos-container&quot;).remove(todo);         todo.dispose();       }, this);       this.getChildControl(&quot;statusbar&quot;).update();       this.getChildControl(&quot;checkbox&quot;).setValue(false);     }   } }); <\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0415\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441, \u043e\u043d\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u043a\u0430\u043a \u0430\u0442\u043e\u043c\u043d\u0430\u044f \u0432\u043e\u0439\u043d\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/4e5\/337\/7de\/4e53377de5b545db95be0dad4285146e.png\"\/><\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u043a \u043f\u0440\u0438\u0441\u0442\u043e\u0439\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u041e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c \u0441\u0440\u0430\u0437\u0443, \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440 \u0438\u0437 \u043c\u0435\u043d\u044f, \u043a\u0430\u043a \u0438\u0437 \u043a\u043e\u0437\u043b\u0430 \u0431\u0430\u043b\u0435\u0440\u0438\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0434\u0430\u0447\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448 todo \u043b\u0438\u0441\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e, \u0431\u0435\u0437 \u0438\u0437\u044b\u0441\u043a\u043e\u0432.<\/p>\n<p>  \u0417\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 qooxdoo \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0442\u0435\u043c\u044b. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 4 \u0442\u0435\u043c\u0430\u043c\u0438. \u0422\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438 \u0442.\u0434. \u0422\u0435\u043c\u0430 \u0432 qooxdoo \u0438\u043c\u0435\u0435\u0442 5 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"javascript\">qx.Theme.define(&quot;todos.theme.Theme&quot;, {   meta : {     color : todos.theme.Color,     decoration : todos.theme.Decoration,     font : todos.theme.Font,     icon : qx.theme.icon.Tango,     appearance : todos.theme.Appearance   } }); <\/code><\/pre>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0442\u0435\u043c\u044b <a href=\"http:\/\/manual.qooxdoo.org\/current\/pages\/desktop\/ui_theming.html\">\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442<\/a>.<br \/>  \u0418\u0442\u0430\u043a, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p>  Appearance.js  <\/p>\n<pre><code class=\"javascript\">\/**  * * @asset(qx\/icon\/Tango\/*  *\/ qx.Theme.define(&quot;todos.theme.Appearance&quot;, {   extend : qx.theme.simple.Appearance,   appearances : {     &quot;todo-window&quot; : {       include : &quot;window&quot;,       alias : &quot;window&quot;,       style : function(){         return {           contentPadding: 0         };       }     },     &quot;checkbox&quot;: {       alias : &quot;atom&quot;,       style : function(states) {         var icon;         if (states.checked) {           icon = &quot;todos\/checked.png&quot;;         } else if (states.undetermined) {           icon = qx.theme.simple.Image.URLS[&quot;todos\/undetermined.png&quot;];         } else {           icon = qx.theme.simple.Image.URLS[&quot;blank&quot;];         }          return {           icon: icon,           gap: 8,           cursor: &quot;pointer&quot;         }       }     },     &quot;radiobutton&quot;: {       style : function(states) {         return {           icon : null,           font : states.checked ? &quot;bold&quot; : &quot;default&quot;,           textColor : states.checked ? &quot;green&quot; : &quot;black&quot;,           cursor: &quot;pointer&quot;         }       }     },     &quot;checkbox\/icon&quot; : {       style : function(states) {         return {           decorator : &quot;checkbox&quot;,           width : 16,           height : 16,           backgroundColor : &quot;white&quot;         }       }     },     &quot;todo-window\/checkbox&quot; : &quot;checkbox&quot;,     &quot;todo-window\/textfield&quot; : &quot;textfield&quot;,     &quot;todo-window\/todos-scroll&quot; : &quot;scrollarea&quot;,     &quot;todo-window\/todo-writer&quot; : {       style : function() {         return {           padding   : [2, 2, 0, 0]         };       }     },     &quot;todo-window\/statusbar&quot; : {       style : function() {         return {           padding   : [ 2, 6],           decorator : &quot;statusbar&quot;,           minHeight : 32,           height : 32         };       }     },     &quot;todo-window\/statusbar\/info&quot; : &quot;label&quot;,     &quot;todo-window\/statusbar\/rb-filter-all&quot; : &quot;radiobutton&quot;,     &quot;todo-window\/statusbar\/rb-filter-active&quot; : &quot;radiobutton&quot;,     &quot;todo-window\/statusbar\/rb-filter-completed&quot; : &quot;radiobutton&quot;,     &quot;todo-window\/statusbar\/remove-completed-button&quot; : {       include : &quot;button&quot;,       alias : &quot;button&quot;,       style : function() {         return {           width : 150,           allowGrowX : false         };       }     },     &quot;todo\/label&quot; : {       include : &quot;label&quot;,       alias : &quot;label&quot;,       style : function(states) {         return {           font : (states.completed ? &quot;line-through&quot; : &quot;default&quot;),           textColor : (states.completed ? &quot;light-gray&quot; : &quot;black&quot;),           cursor : &quot;text&quot;         };       }     },     &quot;todo\/icon&quot; : {       style : function() {         return {           cursor : &quot;pointer&quot;         };       }     },     &quot;todo\/text-container&quot; : {       style : function() {         return {           allowGrowY : false         };       }     },     &quot;todo\/checkbox&quot; : &quot;checkbox&quot;   } }); <\/code><\/pre>\n<p>  Color.js  <\/p>\n<pre><code class=\"javascript\">qx.Theme.define(&quot;todos.theme.Color&quot;, {   extend : qx.theme.simple.Color,    colors :   {     &quot;light-gray&quot; : &quot;#BBBBBB&quot;,     &quot;border-checkbox&quot;: &quot;#B6B6B6&quot;   } }); <\/code><\/pre>\n<p>  Decoration.js  <\/p>\n<pre><code class=\"javascript\">qx.Theme.define(&quot;todos.theme.Decoration&quot;, {   extend : qx.theme.simple.Decoration,    decorations : {     &quot;statusbar&quot; : {       style : {         backgroundColor : &quot;background&quot;,         width: [2, 0, 0, 0],         color : &quot;window-border-inner&quot;       }     },      &quot;checkbox&quot; : {       decorator : [         qx.ui.decoration.MBorderRadius,         qx.ui.decoration.MSingleBorder       ],        style : {         radius : 3,         width : 1,         color : &quot;border-checkbox&quot;       }     }   } }); <\/code><\/pre>\n<p>  Font.js  <\/p>\n<pre><code class=\"javascript\">qx.Theme.define(&quot;todos.theme.Font&quot;, {   extend : qx.theme.simple.Font,    fonts :   {     &quot;line-through&quot; :     {       size : 13,       family : [&quot;arial&quot;, &quot;sans-serif&quot;],       decoration : &quot;line-through&quot;     }   } }); <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0448 TODO \u043b\u0438\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/61f\/bb5\/f90\/61fbb5f90fc44d03b0e6141d1ff6bbd3.png\"\/><\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c. \u042f \u043d\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0441 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u044f\u0441\u044c \u0432 \u0434\u0435\u0442\u0430\u043b\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u043c \u0441\u0441\u044b\u043b\u043a\u0430\u043c. \u041e\u0431\u043e \u0432\u0441\u0435\u0445 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430\u0445 \u043f\u0440\u043e\u0448\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043b\u0438\u0447\u043a\u0443. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<\/p>\n<p>  <b>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/b><br \/>  \u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 qooxdoo: <a href=\"http:\/\/qooxdoo.org\/\">http:\/\/qooxdoo.org\/<\/a><br \/>  \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 SDK: <a href=\"http:\/\/qooxdoo.org\/downloads\">http:\/\/qooxdoo.org\/downloads<\/a><br \/>  \u0420\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0435\u043c\u043e: <a href=\"http:\/\/qooxdoo.org\/demos\">http:\/\/qooxdoo.org\/demos<\/a><br \/>  \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: <a href=\"http:\/\/qooxdoo.org\/community\/real_life_examples\">http:\/\/qooxdoo.org\/community\/real_life_examples<\/a><br \/>  SPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b: <a href=\"http:\/\/manual.qooxdoo.org\/current\/pages\/desktop\/tutorials\/tutorial-part-1.html\">http:\/\/manual.qooxdoo.org\/current\/pages\/desktop\/tutorials\/tutorial-part-1.html<\/a><br \/>  \u041a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435: <a href=\"https:\/\/github.com\/VasisualyLokhankin\/todolist_qooxdoo\">https:\/\/github.com\/VasisualyLokhankin\/todolist_qooxdoo<\/a> \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/254767\/\"> http:\/\/habrahabr.ru\/post\/254767\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p> \t\t\t\u041d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u043b\u0438\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e javascript \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432, \u043f\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0438\u0437 \u043d\u0438\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0433\u043e\u0440\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u042f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043f\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043c\u043d\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e \u0443 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<p>  \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f qooxdoo. \u041f\u0440\u043e\u0438\u0437\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u00ab\u043a\u0443\u043a\u0441\u0434\u0443\u00bb (\u043a\u043e\u043c\u0443 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u0442\u0440\u0438\u043f\u0446\u0438\u044f: [&#8216;kuksdu:]).<\/p>\n<p>  \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u0441\u0432\u0435\u043b\u0438\u0441\u044c \u043a \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c \u043e \u0432\u044b\u0445\u043e\u0434\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u043b\u0438 \u043a \u043f\u0430\u0440\u0430\u043c \u0430\u0431\u0437\u0430\u0446\u0435\u0432 \u0432 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0442\u0438\u043f\u0430 \u00ab\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u0430\u043a\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u043f\u043e\u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438\u00bb. \u042f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 qooxdoo \u0438 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-254408","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/254408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=254408"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/254408\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=254408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=254408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=254408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}