Advertisement
Adam_Martin

Untitled

Feb 15th, 2012
111
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 ( type /* String */, name /* String */ )
  148.     {
  149.         var __obj = Widget( type, $_ );
  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.                 $( '.' + 'source_selector' ).each(
  172.                     function ( index, value )
  173.                     {
  174.                         var widget, name;
  175.  
  176.                         name   = $( value ).attr( 'name' );
  177.                         widget = $_.buildWidget( 'source_selector', name );
  178.  
  179.                         $( value ).replaceWith( widget.template );
  180.                     } // each function
  181.                 ) // each
  182.  
  183.                 $( '.' + 'iterator_control' ).each(
  184.                     function ( index, value )
  185.                     {
  186.                         var widget, name;
  187.  
  188.                         name   = $( value ).attr( 'name' );
  189.                         widget = $_.buildWidget( 'iterator_control', name );
  190.  
  191.                         $( value ).replaceWith( widget.template );
  192.                     } // each function
  193.                 )
  194.  
  195.  
  196.                 callback();
  197.             } // loadXMLContent callback
  198.         ) // loadXMLContent
  199.     } // .loadWidgets
  200.  
  201.     /**
  202.      * widgets
  203.      * Возвращает виджет из массива widgets, заданный именем name
  204.      *
  205.      * <- name - имя виджета
  206.      * -> Widget
  207.      */
  208.     $_.widgets = function ( name /* String */ )
  209.     {
  210.         return $_.widgets[ name ] /* Widget */
  211.  
  212.     } // .widgets
  213.  
  214.   // Методы
  215.  
  216.     return $_ /* Instance */
  217.  
  218. }; // class WidgetController
  219.  
  220.  
  221. var Widget = function( name /* String */, wc /* WidgetController */ )
  222. {
  223.     var  $_ = Object();
  224.  
  225.   /** Свойства
  226.    */
  227.  
  228.     $_.name      = name;
  229.     $_.template  = wc.getTemplate( name ).clone();
  230.     $_.logic     = wc.getScript( name );
  231.     $_.etalon    = [];
  232.     $_.brick     = [];
  233.  
  234.   // Свойства
  235.  
  236.  
  237.   /** Методы
  238.    */
  239.  
  240.     /**
  241.      * callback
  242.      * Инициирует триггер-подписчик
  243.      * Возвращает данные data по событию из виджета
  244.      *
  245.      * <- data - возвращаемые данные
  246.      */
  247.     $_.callback = function( data )
  248.     {
  249.         $_.template.trigger( '__callback', data );
  250.     } // .callback
  251.  
  252.  
  253.     /**
  254.      * eventHandler
  255.      * Устанавливает обработчика события дла триггера-подписчика текущего виджета
  256.      *
  257.      * <- fn - подпрограмма
  258.      */
  259.     $_.eventHandler = function( fn )
  260.     {
  261.         $_.template.bind( '__callback', fn );
  262.     } // .eventHandler
  263.  
  264.   // Методы
  265.  
  266.  
  267.   /**
  268.    * Конструктор
  269.    */
  270.  
  271.     for ( var brick_name in $_.logic )
  272.     {
  273.         $_.etalon[ brick_name ] = $_.template.find( '.' + brick_name ).clone();
  274.     } // foreach logic
  275.  
  276.     for ( var brick_name in $_.logic )
  277.     {
  278.         var brick;
  279.  
  280.         brick = Brick( brick_name, $_ );
  281.  
  282.         $_.template.find( '.' + brick_name ).replaceWith( brick.template );
  283.         $_.brick[ brick_name ] = brick;
  284.     } // foreach logic
  285.  
  286.   // Конструктор
  287.  
  288.     return $_ /* Instance */
  289.  
  290. }; // class Widget
  291.  
  292. var Brick = function( name /* String */, widget /* Widget */ )
  293. {
  294.     var  $_ = Object();
  295.  
  296.   /** Свойства
  297.    */
  298.  
  299.     $_.name      = name;
  300.     $_.widget    = widget;
  301.     $_.template  = $( widget.etalon[ name ] ).clone();
  302.     $_.logic     = widget.logic[ name ];
  303.  
  304.   // Свойства
  305.  
  306.  
  307.   /** Методы
  308.    */
  309.  
  310.     /**
  311.      * getInstance
  312.      * Создает и возвращает экземпляр Brick
  313.      *
  314.      * -> Brick
  315.      */
  316.     $_.getInstance = function ()
  317.     {
  318.         var obj = new Brick( $_.name, $_.widget );
  319.  
  320.         obj.bindEvents();
  321.         obj.bindActions();
  322.  
  323.         return obj; /* Widget */
  324.  
  325.     } // .getInstance
  326.  
  327.  
  328.     /**
  329.      * bindEvents
  330.      * Устанавливаем свой обработчик внешних событий logic.events
  331.      * делаем замыкание на свой обработчик
  332.      */
  333.     $_.bindEvents = function ()
  334.     {
  335.         var bind_list = {};
  336.         var events = $_.logic.events;
  337.  
  338.         for ( var event in events )
  339.         {
  340.           ( function( __obj, event )
  341.             {
  342.                 bind_list[ event ] = function()
  343.                 {
  344.                     __obj[ event ]()
  345.                 }; // function
  346.             }(  $_, event ) ); // function
  347.  
  348.             $_[ event ] = events[ event ];
  349.  
  350.         } // foreach events
  351.         $_.template.bind( bind_list );
  352.  
  353.         bind_list = null
  354.     } // .bindEvents
  355.  
  356.  
  357.     /**
  358.      * bindActions
  359.      * Устанавливаем дополнительные методы logic.actions
  360.      * Обарбатываем предустановленные функции
  361.      */
  362.     $_.bindActions = function ()
  363.     {
  364.         var actions = $_.logic.actions;
  365.  
  366.         for ( var action in actions )
  367.         {
  368.             $_[ action ] = actions[ action ];
  369.         } // foreach actions
  370.  
  371.         if ( typeof $_.logic.actions.__before == 'function' )
  372.         {
  373.             //self.__before( DOMElement.element );
  374.         } // if __before
  375.     } // .bindActions
  376.  
  377.  
  378.     /**
  379.      * bricks
  380.      * Получаем объект из коллекции по имени
  381.      * <- name - имя элемента
  382.      * -> Brick
  383.      */
  384.     $_.bricks = function ( name /* String */ )
  385.     {
  386.         return $_.widget.brick[ name ];
  387.     } // .bricks
  388.  
  389.   // Методы
  390.  
  391.  
  392.   /**
  393.    * Конструктор
  394.    */
  395.  
  396.     $_.bindEvents();
  397.     $_.bindActions();
  398.  
  399.   // Конструктор
  400.  
  401.     return $_ /* Instance */
  402.  
  403. }; // class Brick
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement