Advertisement
Adam_Martin

Untitled

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