Advertisement
Adam_Martin

widgetLoader

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