Advertisement
Adam_Martin

Untitled

Feb 14th, 2012
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var widgetControls = [];
  2.  
  3. var WidgetController = function() {
  4.  
  5.     var $_ = Object();
  6.  
  7.   /** Свойства
  8.    */
  9.  
  10.     $_.templates = [];
  11.     $_.scripts   = [];
  12.  
  13.     $_.widgets   = [];
  14.  
  15.   // Свойства
  16.  
  17.  
  18.   /** Методы
  19.    */
  20.  
  21.     /**
  22.      * loadXMLContent
  23.      * загружает шаблон виджетов из xml-файла
  24.      */
  25.     $_.loadXMLContent = function( file_name /* String */, fn  /* Callback */)
  26.     {
  27.         $.get
  28.         (
  29.             file_name ,
  30.             function( data )  // data -> xml-content
  31.             {
  32.                 $_.xml_content = data;
  33.                 $_.loadTemplate();
  34.                 fn();
  35.             } // $.get callback
  36.         ) // $.get
  37.     } // .loadXMLContent
  38.  
  39.  
  40.     /**
  41.      * addTemplate
  42.      * Оборачивает тело шаблона в <div> и
  43.      * добавляет в глобальный массив templates
  44.      *
  45.      * <- name - имя виджета
  46.      * <- temp - xml-узел шаблона виджета
  47.      */
  48.     $_.addTemplate = function ( name /* String */, temp  /* XMLElement */ )
  49.     {
  50.         var widget_body, temp_text;
  51.  
  52.         temp_text   = $( temp ).text();
  53.         widget_body = $( '<div>' )
  54.                        .attr( 'class' , name )
  55.                        .append( temp_text );
  56.  
  57.         $_.templates[ name ] = widget_body /* HTMLElement */;
  58.  
  59.     } // .addTemplate
  60.  
  61.  
  62.     /**
  63.      * getTemplate
  64.      * Возвращаем шаблан виджета по его имени
  65.      *
  66.      * <- name - имя виджета
  67.      * -> HTMLDivElement
  68.      */
  69.     $_.getTemplate = function ( name /* String */ )
  70.     {
  71.         return $_.templates[ name ]; /* HTMLDivElement */
  72.     }; // .getTemplate
  73.  
  74.  
  75.     /**
  76.      * getScript
  77.      * Возвращаем скрипт виджета по его имени
  78.      *
  79.      * <- name - имя виджета
  80.      * -> WidgetScript
  81.      */
  82.     $_.getScript = function ( name /* String */ )
  83.     {
  84.         return  $_.scripts[name]; /* WidgetScript */
  85.     }; // .getScript
  86.  
  87.  
  88.     /**
  89.      * loadTemplate
  90.      * Загружает все:
  91.      * - шаблоны виджетов в массив templates[]
  92.      * - скрипты виджетов в массив scripts[]
  93.      */
  94.     $_.loadTemplate = function ()
  95.     {
  96.  
  97.         $( $_.xml_content ).find( 'widget' ).each
  98.         (
  99.             function ( index, value )
  100.             {
  101.                 var name = $( value ).attr( 'name' );
  102.                 $_.addTemplate( name, value );
  103.                 $_.scripts[ name ] = widgetControls [ name ];
  104.  
  105.             } // .each function
  106.         ) // .each
  107.  
  108.         /**
  109.          * Обработка вложенных виджетов
  110.          */
  111.         for ( var widgetName in $_.templates )
  112.         {
  113.             var script, template;
  114.             console.log( 'neo: ' + widgetName );
  115.  
  116.             script   = widgetControls[ widgetName ];
  117.             template = $_.getTemplate( widgetName );
  118.  
  119.             $( template ).find( 'widget' ).each
  120.             (
  121.                 function ( index, item )
  122.                 {
  123.                     var include_name, include_template, include_script;
  124.  
  125.                     include_name     = $( item ).attr( 'include' );
  126.                     include_template = $_.getTemplate( include_name );
  127.                     $( item ).replaceWith( $( include_template ).clone() );
  128.  
  129.                     include_script = widgetControls[ include_name ];
  130.                     $.extend( true, script, include_script );
  131.  
  132.                     //console.log( script );
  133.  
  134.                 } // function()
  135.             ) // .each
  136.         } // foreach templates
  137.     }; // .loadTemplate
  138.  
  139.  
  140.     /**
  141.      * buildWidget
  142.      * Создает и возвращает экземпляр виджета заданного именем name
  143.      *
  144.      * <- name - имя виджета
  145.      * -> Widget
  146.      */
  147.     $_.buildWidget = function ( name /* String */ )
  148.     {
  149.         var __obj = Widget( name, $_ );
  150.  
  151.         $_.widgets[ name ] = __obj;
  152.  
  153.         return __obj /* Widget */
  154.  
  155.     } // .buildWidget
  156.  
  157.  
  158.     /**
  159.      * loadWidgets
  160.      * Загружает виджеты и выполняет callback после удачной загрузки
  161.      *
  162.      * <- callback - подпрограмма
  163.      */
  164.     $_.loadWidgets = function( callback )
  165.     {
  166.         $_.loadXMLContent
  167.         (
  168.             '/widgets/layouts.xml',
  169.             function ()
  170.             {
  171.                 var widget;
  172.                 widget = $_.buildWidget( 'source_selector' );
  173.                 $( '.' + 'source_selector' ).each
  174.                 (
  175.                     function ( index, value )
  176.                     {
  177.                         $( value ).replaceWith( widget.template );
  178.                     } // each function
  179.                 ) // each
  180.                 callback();
  181.             } // loadXMLContent callback
  182.         ) // loadXMLContent
  183.     } // .loadWidgets
  184.  
  185.     /**
  186.      * widgets
  187.      * Возвращает виджет из массива widgets, заданный именем name
  188.      *
  189.      * <- name - имя виджета
  190.      * -> Widget
  191.      */
  192.     $_.widgets = function ( name /* String */ )
  193.     {
  194.         return $_.widgets[ name ] /* Widget */
  195.  
  196.     } // .widgets
  197.  
  198.   // Методы
  199.  
  200.     return $_ /* Instance */
  201.  
  202. }; // class WidgetController
  203.  
  204.  
  205. var Widget = function( name /* String */, wc /* WidgetController */ )
  206. {
  207.     var  $_ = Object();
  208.  
  209.   /** Свойства
  210.    */
  211.  
  212.     $_.name      = name;
  213.     $_.template  = wc.getTemplate( name );
  214.     $_.logic     = wc.getScript( name );
  215.     $_.etalon    = [];
  216.     $_.brick     = [];
  217.  
  218.   // Свойства
  219.  
  220.  
  221.   /** Методы
  222.    */
  223.  
  224.     /**
  225.      * callback
  226.      * Инициирует триггер-подписчик
  227.      * Возвращает данные data по события из виджета
  228.      *
  229.      * <- data - возвращаемые данные
  230.      */
  231.     $_.callback = function( data )
  232.     {
  233.         $_.template.trigger( '__callback', data );
  234.     } // .callback
  235.  
  236.  
  237.     /**
  238.      * eventHandler
  239.      * Установливает обработчика события дла триггера-подписчика текущего виджета
  240.      *
  241.      * <- fn - подпрограмма
  242.      */
  243.     $_.eventHandler = function( fn )
  244.     {
  245.         $_.template.bind( '__callback', fn );
  246.     } // .eventHandler
  247.  
  248.   // Методы
  249.  
  250.  
  251.   /**
  252.    * Конструктор
  253.    */
  254.  
  255.     for ( var brick_name in $_.logic )
  256.     {
  257.         $_.etalon[ brick_name ] = $_.template.find( '.' + brick_name ).clone();
  258.     } // foreach logic
  259.  
  260.     for ( var brick_name in $_.logic )
  261.     {
  262.         var brick;
  263.  
  264.         brick = Brick( brick_name, $_ );
  265.  
  266.         $_.template.find( '.' + brick_name ).replaceWith( brick.template );
  267.         $_.brick[ brick_name ] = brick;
  268.     } // foreach logic
  269.  
  270.   // Конструктор
  271.  
  272.     return $_ /* Instance */
  273.  
  274. }; // class Widget
  275.  
  276. var Brick = function( name /* String */, widget /* Widget */ )
  277. {
  278.     var  $_ = Object();
  279.  
  280.   /** Свойства
  281.    */
  282.  
  283.     $_.name      = name;
  284.     $_.widget    = widget;
  285.     $_.template  = $( widget.etalon[ name ] ).clone();
  286.     $_.logic     = widget.logic[ name ];
  287.  
  288.   // Свойства
  289.  
  290.  
  291.   /** Методы
  292.    */
  293.  
  294.     /**
  295.      * getInstance
  296.      * Создает и возвращает экземпляр Brick
  297.      *
  298.      * -> Brick
  299.      */
  300.     $_.getInstance = function ()
  301.     {
  302.         var obj = new Brick( $_.name, $_.widget );
  303.  
  304.         obj.bindEvents();
  305.         obj.bindActions();
  306.  
  307.  
  308.         return obj; /* Widget */
  309.  
  310.     } // .getInstance
  311.  
  312.  
  313.     /**
  314.      * bindEvents
  315.      * Устанавливаем свой обработчик внешних событий logic.events
  316.      * делаем замыкание на свой обработчик
  317.      */
  318.     $_.bindEvents = function ()
  319.     {
  320.         var bind_list = {};
  321.         var events = $_.logic.events;
  322.  
  323.         for ( var event in events )
  324.         {
  325.           ( function( __obj, event )
  326.             {
  327.                 bind_list[ event ] = function()
  328.                 {
  329.                     __obj[ event ]()
  330.                 }; // function
  331.             }(  $_, event ) ); // function
  332.  
  333.             $_[ event ] = events[ event ];
  334.  
  335.         } // foreach events
  336.         $_.template.bind( bind_list );
  337.  
  338.         bind_list = null
  339.     } // .bindEvents
  340.  
  341.  
  342.     /**
  343.      * bindActions
  344.      * Устанавливаем дополнительные методы logic.actions
  345.      * Обарбатываем предустановленные функции
  346.      */
  347.     $_.bindActions = function ()
  348.     {
  349.         var actions = $_.logic.actions;
  350.  
  351.         for ( var action in actions )
  352.         {
  353.             $_[ action ] = actions[ action ];
  354.         } // foreach actions
  355.  
  356.         if ( typeof $_.logic.actions.__before == 'function' )
  357.         {
  358.             //self.__before( DOMElement.element );
  359.         } // if __before
  360.     } // .bindActions
  361.  
  362.  
  363.     /**
  364.      * bricks
  365.      * Получаем объект из коллекции по имени
  366.      * <- name - имя элемента
  367.      * -> Brick
  368.      */
  369.     $_.bricks = function ( name /* String */ )
  370.     {
  371.         return $_.widget.brick[ name ];
  372.     } // .bricks
  373.  
  374.   // Методы
  375.  
  376.  
  377.   /**
  378.    * Конструктор
  379.    */
  380.  
  381.     $_.bindEvents();
  382.     $_.bindActions();
  383.  
  384.   // Конструктор
  385.  
  386.     return $_ /* Instance */
  387.  
  388. }; // class Brick
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement