// Create user extension namespace (Application)
Ext.namespace('Application');

/**
  *  Application.guestViewport Extension class
  * 
  *  @author Seabor
  *  @version 1.0
  *  
  *  @class Application.guestViewport
  *  @extends Ext.Viewport
  *  @constructor
  *  @param {Object} config Configuration options
  *  @require Application.guestGrid, Application.guestTree,
  *  Application.guestSearchForm
  */

Application.guestViewport = function(config) {

    // call parent constructor
    Application.guestViewport.superclass.constructor.call(this, config);
    
}; // end of Application.guestViewport constructor

Ext.extend(Application.guestViewport, Ext.Viewport, {

	// configurables
    // anything what is here can be configured from outside
	layout: 'border'
	,defaults: {
		border: false
	}
	// initComponent {{{
	,initComponent: function() {
		// Catalogue tree
		var Tree = Ext.tree;

        var tree = new Tree.TreePanel({
            useArrows: true,
            autoScroll: true,
            animate: true,
            enableDD: false,
            containerScroll: true,
            border: false,
            // auto create TreeLoader
            dataUrl: '/json',

            root: {
                nodeType: 'async',
                text: 'Ext JS',
                draggable: false,
                id: 'src'
            }
        });
		
		// Ext.apply {{{
	   Ext.apply(this, {
	       items: [{
	           region: 'north'
	           ,height: 86
	           ,layout: 'border'
	           ,defaults: {
	           	   border: false
	           }
	           ,items: [{
	               region: 'west'
	               ,layout: 'fit'
	               ,width: 760
	               ,autoLoad: {url: '/static/parts/siteHeader.tpl.htm', text: ''}
                   ,bodyStyle: 'background: #344d6b; vertical-align: middle'
                   ,html: '<a href="/">'
                           + '<img src="/i/_SMLogo_s.png" '
                           + 'style="margin:8px 0 0 10px" style="float:left">'
                           + '</a>'
	               ,defaults: {
	                   border: false
	               }
	           },{
                   region: 'center'
                   ,layout: 'fit'
                   ,autoLoad: {url: '/userbar', text: ''}
                   ,bodyStyle: 'background: #344d6b; vertical-align: middle'
                   ,html: '<a href="/">'
                           + '<img src="/i/_SMLogo_s.png" '
                           + 'style="margin:8px 0 0 10px" style="float:left">'
                           + '</a>'
                   ,defaults: {
                       border: false
                   }
               }]
	       },{
	           region: 'west'
	           ,layout: 'border'
	           ,width: 220
	           ,defaults: {
                   border: false
               }
	           ,border: false
	           ,items: [{
                    layout: 'fit',
                    region: 'north',
                    height: 130,
                    bodyStyle: 'background: #142f4c'/* url(/i/tree_bg.jpg) repeat-y*/,
                    autoLoad: {url: '/static/parts/filterBar.tpl.htm', text: '', scripts: true},
                    title: "Фильтры"
	           },{
	               layout: 'fit',
	               region: 'center',
	               xtype: 'guestTree'
	           }]
	       },{
	           region: 'center'
	           ,border: true
               ,xtype: 'guestTabPanel'
               ,plain: false
               ,hideBorders: true
	       }]    
	   });// e/o Ext.apply
	   
	   // call parent
	   Application.guestViewport.superclass.initComponent.apply(this, arguments);
	   
	   this.guestHeadPanel = this.items.itemAt(0).items.itemAt(0);
	   //this.userPanel = this.items.itemAt(0).items.itemAt(0).items.itemAt(1);
	   //this.siteHeader = this.items.itemAt(0).items.itemAt(0);
	   this.guestWestPanel = this.items.itemAt(1);
	   this.guestNorthPanel = this.items.itemAt(0);
	   this.guestCenterPanel = this.items.itemAt(2);
	   this.guestTree = this.items.itemAt(1).items.itemAt(1);
	   this.guestTabPanel = this.items.itemAt(2);
       
       //Стартовая вкладка таб-панели
       var p = this.guestTabPanel.add({
           title: 'Новости'
           ,id: 'news'
           ,layout: 'fit'
           ,border: false
           ,autoLoad: {
                url: '/page/news', 
                scripts: true,
                callback: function() {
                    //console.log(this);
                }
            }
           ,bodyStyle: 'background-color: #142f4c;padding:15px'
           ,autoScroll: true  
       });
       this.guestTabPanel.activate(p);
       
	   // Учтановка хэндлеров событий {{{
	   this.on({
	       scope: this
	       ,render: function() {
	           this.guestTree.on({
	               scope: this
	               ,click: function(n) {
	                   this.handleTreeClick.apply(this, [n, '/jsonGridCompare']);   
	               }
	           });
	       }
	   });
	   
	   // Формирование хэдэра по окончании загрузки
	   this.guestHeadPanel.on('afterrender', function(panel){
	       panel.getUpdater().on('update', function(panel, response){
                 // Поисковая строка
                
	       	// Serach field store
             var ds = new Ext.data.Store({
                 proxy: new Ext.data.HttpProxy({
                 	 method: 'GET',
                     url: '/search'
                 }),
                 reader: new Ext.data.JsonReader({
                     id: 'id',
                     totalPropery: 'total',
                     root: 'rows'
                 }, [
                     {name: 'title', type: 'string'}
                    ,{name: 'cat_name', type: 'string'}
                    ,{name: 'brand_title', type: 'string'}
                    ,{name: 'price', type: 'string'}
                    ,{name: 'avail', type: 'int'}
                    ,{name: 'reserve', type: 'int'}
                    ,{name: 'ordered', type: 'int'}
                    ,{name: 'id', type: 'string', mapping: 'id'}
                 ])
             });
                 
              // Custom rendering Template
              var resultTpl = new Ext.XTemplate(
                  '<tpl for="."><div class="fast-search-item">',
                      '<table><tr><td colspan=2><b>{[this.highlight(values.title)]}</b><br/>Артикул: {[this.highlight(values.id)]}</td></tr>',
                      '<tr><td class="left">{[this.restOfItems(values.avail, values.reserve, values.ordered)]}</td>',
                      '<td class="right"><b>{values.price}</b></td></tr></table>',
                  '</div></tpl>'
                  ,{ restOfItems: function(o, r, z) {
                          var intrade = '<span class="fsi_rest">Есть в наличии</span>';
                          if (parseInt(o) > 0)
                              return intrade;//'<span class="fsi_rest">Остаток: ' + o + ' шт.</span>';
                          else if (parseInt(r) > 0)
                              return intrade;//'<span class="fsi_reserve">Резерв: ' + r + ' шт.</span>';
                          else if (parseInt(z) > 0)
                              return intrade;//'<span class="fsi_pending">Ожидается: ' + z + ' шт.</span>';
                          else
                              return 'Нет в наличии'
                    },
                     highlight: function(str){
                        var searchString = this.searchField.lastQuery; // search string
                        var qParts = searchString.split(/\s+/); /* The \\s is equivalent to [ \\t\\n\\x0B\\f\\r] */
                        for (var key in qParts) {
                        	key = parseInt(key);
                        	if (key == NaN || Ext.isEmpty(qParts[key])) {
                        	   continue;
                        	}
                            var matches = str.match(new RegExp(qParts[key], "gi"));
                            var uArr = []; // array of unique case matches
                            for (var m in matches) {
                                if(m.search(new RegExp('[a-z]','g')) != -1) continue; // protection from non-index props of array object
                                if (uArr.indexOf(matches[m]) == -1) {
                                    uArr.push(matches[m]);
                                    str = str.replace(new RegExp(matches[m], 'g'), '<span style="color:#3E79DF">' + matches[m] + '</span>');
                                }
                            }
                        }
                        return str
                    }}
              );    
       	
       	     // Search field
             var search = new Ext.form.ComboBox({
                 store: ds,
                 displayField:'title',
                 typeAhead: false,
                 loadingText: 'Поиск...',
                 emptyText: 'Найти товар...',
                 selectOnFocus: true,
                 width: 400,
                 maxHeight: 500,
                 pageSize:10,
                 minChars: 3,
                 hideTrigger:true,
                 tpl: resultTpl,
                 itemSelector: 'div.fast-search-item',
                 renderTo: "header-search-field"
             });
             resultTpl.searchField = search;
             search.on({
               scope: this
               ,select: function(combo, record){ // override default onSelect to do redirect
                   combo.collapse();
                   Ext.History.add('/tovar/' + record.data.id);
                } 
             });
             
             search.render();
           })
	   });
	   
	   // History listener
	   // Отслеживает события изменения истории и возвращает интерфейс к соответствующему состоянию
	   Ext.History.on('change', this.historyListener, this);
	   this.historyListener(Ext.History.getToken());
	   
	   // }}} Установка хэндлеров событий
	   
	}// }}} e/o initComponent
	// afterRender {{{
	,afterRender: function() {
	   
	   // call parent
	   Application.guestViewport.superclass.afterRender.apply(this, arguments);
	   
	} // }}} e/o afterRender
	/**
     * Catalog tree click processing
     * 
     * @param {Object} n Tree element
     */
	,handleTreeClick: function(n, url) {
       
        // Если элемент - лист (не имеет дочерних элементов)
        if (n.attributes && n.attributes.leaf) {
        	var parts = n.attributes.id.split("/");
        	var len = parts.length;
        	var catId = parts[len-1]
            Ext.History.add("/cat/" + catId);
        }
        // Если элемент - узел (развернуть/свернуть группу)
        else {
        	n.toggle();
        	return true;
        }
    }
    
    /**
     * Browser history change processing function
     */
    ,historyListener: function(token) {
    	var tokenDelimiter = '/';
        var cat = "cat", compare = "compare", tovar = "tovar", page = "page", filter = "filter";
        if(token){
        	
        	if (token == tokenDelimiter) return;
        	
            var parts = token.split(tokenDelimiter);
            var tabType = parts[1];
            
            if (Ext.isEmpty(tabType)) return;
            
            if (parts.length > 2) { 
                var contentId = parts.slice(2).join(tokenDelimiter);
                // Определим является ли запрос фильтрационным
                var parts = contentId.split(tokenDelimiter);
                if (parts.length > 1 && parts[0] == filter) {
                   fq = true;
                   contentId = parts.slice(1).join(tokenDelimiter); 
                }
                else {
                   fq = false;
                }
                // HIghlight filter bar
            } else {
                contentId = "";
                fq = false;
            }
            Application.highlight.filterBar(contentId, fq);
            switch (tabType) {
            	case cat: // Стандартная таблица каталога
                    // Определим является ли запрос фильтрационным
            	    if (fq) {
            	       panelTitlePrefix = 'Товары по запросу ';
            	       panelHashPrefix = '/cat/filter/';
            	    }
            	    else {
            	       panelTitlePrefix = 'Товары категории ';
            	       panelHashPrefix = '/cat/';
            	    }
            	
                    // параметры загрузки данных
            	    var pid = contentId || false;
                    var in_sight = true;   
                    
                    // определим поле для группировки
                    var groupField = "brand_title";
                    if (fq) {
                        groupField = "cat_name";
                    }
                    
            	    // Проверим существование панели
                    var gp = this.guestTabPanel.getItem('guestGrid');
                    var params = {pid: pid, in_sight: in_sight, fq: fq, start: 0, limit: 50};
                    if (gp != null) {
                       if (gp.contentId == contentId) {
                            this.guestTabPanel.activate(gp);
                            return; 
                       }
                       gp.setTitle(panelTitlePrefix + contentId);
                       gp.contentId = contentId;
                       var ci = gp.getComponent('guestGridChild');
                       in_sight = ci.inSightBtn.pressed;
                       params.in_sight = in_sight;
                       ci.getStore().baseParams = params;
                       ci.loadParams = params;
                       ci.groupField = groupField;
                       if (ci.groupBtn.pressed)
                            ci.getStore().groupField = groupField;
                       this.guestTabPanel.activate(gp);
                    }
                    else {
                       var gp = this.guestTabPanel.add({
                           title: panelTitlePrefix + contentId
                           ,id: 'guestGrid'
                           ,contentId: contentId
                           ,xtype: 'panel'
                           ,layout: 'fit'
                           ,closable: true
                           ,autoDestroy: true
                           ,listeners:{
                                activate: function(panel) {
                                    Ext.History.add(panelHashPrefix + panel.contentId);
                                }
                                ,close: function() {
                                    Ext.History.add('');
                            }}
                           ,bodyStyle: 'background: #142f4c'
                           ,html: '<span style="padding: 10px;font-size: 11px; font-family:tahoma; color: #aaa">' +
                                   '<img style="margin: 10px 5px -4px 0" src="/i/small_loading.gif">' +
                                   '<b>Загрузка...</b></span>'
                       });
                       this.guestTabPanel.activate(gp);
                       var ci = gp.add({
                           xtype: 'guestGrid'
                           ,id: 'guestGridChild'
                           ,cls: 'left-basket-grid'
                           ,url: '/grid'
                           ,loadParams: params
                           ,inSightBtn: true
                           ,groupField: groupField
                           ,listeners: {
                                afterrender: function(grid) {
                                    grid.loadMask.show();
                                    grid.compareBtn.on({
                                        scope: this
                                        ,click: function() {
                                            Ext.History.add(tokenDelimiter + compare + tokenDelimiter + this.loadParams.pid);
                                        }
                                    });
                                }
                                ,rowclick: function(g, r) {
                                    var id = g.getStore().getAt(r).get('id');
                                    Ext.History.add(tokenDelimiter + tovar + tokenDelimiter + id);
                                }
                           }
                        });
                       
                    }
                    
                    // Handler for switch grouping
                    var switchGrouping = function(gp, ci, answer){
                        if (fq) {
                            gp.setTitle(panelTitlePrefix + " «"+ answer.title +"»");
                            ci.groupBtn.setText("Группировать по категориям");
                            ci.groupField = "cat_name";
                            ci.compareBtn.hide();
                            ci.compareBtnSep.hide();
                        }
                        else {
                            gp.setTitle(panelTitlePrefix + " «"+ answer.title +"»");
                            ci.groupBtn.setText("Группировать по производителям");
                            ci.groupField = "brand_title";
                            ci.compareBtn.show();
                            ci.compareBtnSep.show();
                        }
                    }
                    
                    Ext.Ajax.request({
                        url: '/grid-title'
                        ,params: {pid: pid, in_sight: in_sight, fq: fq}
                        ,scope: this
                        ,method: 'GET'
                        ,callback: function(options, success, response){ 
                            var answer = Ext.util.JSON.decode(response.responseText);
                            if (!success || answer.success == 'false') {
                                Ext.Msg.alert('Нева-Центр', 'Нет товаров для отображения');
                                this.guestTabPanel.remove(gp);
                                return;
                            }
                            var ci = gp.getComponent('guestGridChild');
                            if (typeof ci.groupBtn == "undefined") {
                                ci.on('afterrender', switchGrouping.createCallback(gp, ci, answer), this);
                            } else {
                                switchGrouping(gp, ci, answer);	
                            }
                            //ci.updateTable(answer, options);
                            //ci.loadParams = options.params;
                            //ci.store.loadData(answer);
                            gp.doLayout();
                            //ci.loadMask.hide();
                        }
                    });
                    ci.store.load();
            	    break;
            	
                case compare:
                    //alert("Category:" + contentId);
                    // Многофункциональная таблица {{{
                    
                    var pid = contentId || false;
                    
                    // Проверим существование панели
                    var gp = this.guestTabPanel.getItem('guestGridCompare');
                    
                    // параметры загрузки данных
                    var in_sight = true;
                    
                    if (gp != null) {
                       if (gp.contentId == contentId) {
                       	    this.guestTabPanel.activate(gp);
                            return; 
                       }
                       gp.setTitle('Сравнение товаров категории ' + contentId);
                       gp.contentId = contentId;
                       var ci = gp.getComponent('guestGridCompareChild');
                       in_sight = ci.loadParams.in_sight;
                       ci.loadMask.show();
                       this.guestTabPanel.activate(gp);
                    }
                    else {
                       var gp = this.guestTabPanel.add({
                           title: 'Сравнение товаров категории ' + contentId
                           ,id: 'guestGridCompare'
                           ,contentId: contentId
                           ,xtype: 'panel'
                           ,layout: 'fit'
                           ,closable: true
                           ,listeners:{
                                activate: function(panel) {
                                    Ext.History.add('/compare/' + panel.contentId);
                                }
                                ,close: function() {
                                    Ext.History.add('');
                            }}
                           ,bodyStyle: 'background: #142f4c'
                           ,html: '<span style="padding: 10px;font-size: 11px; font-family:tahoma; color: #aaa">' +
                                   '<img style="margin: 10px 5px -4px 0" src="/i/small_loading.gif">' +
                                   '<b>Загрузка...</b></span>'
                       });  
                       this.guestTabPanel.activate(gp);
                       var ci = gp.add({
                           xtype: 'guestGridCompare'
                           ,id: 'guestGridCompareChild'
                           ,cls: 'left-basket-grid'
                           ,url: '/gridcompare'
                           ,baseParams: {pid: pid, in_sight: in_sight}
                           ,properties: []
                           ,jsonData: []
                           ,inSightBtn: true
                           ,listeners: {
                                afterrender: function(grid) {
                                    grid.loadMask.show();
                                }
                                ,rowclick: function(g, r) {
                                    var id = g.getStore().getAt(r).get('id');
                                    Ext.History.add(tokenDelimiter + tovar + tokenDelimiter + id);
                                }
                           }
                       });
                    }
                    
                    
                    Ext.Ajax.request({
                        url: '/gridcompare'
                        ,params: {pid: pid, in_sight: in_sight}
                        ,scope: this
                        ,method: 'GET'
                        ,callback: function(options, success, response){ 
                            var answer = Ext.util.JSON.decode(response.responseText);
                            if (!success || answer.success == 'false') {
                                Ext.Msg.alert('Нева-Центр', 'Нет товаров для сравнения');
                                this.guestTabPanel.remove(gp);
                                return;
                            }
                            var ci = gp.getComponent('guestGridCompareChild');
                            gp.setTitle("Сравнение товаров категории «"+ answer.title +"»");
                            gp.doLayout();
                            ci.updateTable(answer, options);
                        }
                    });
                    
                    // }}} e/o Многофункциональная таблица
                   break;
                
                case tovar:
                   this.loadPage('/item', token, tabType, {id: contentId});
                   break;
                
                case page:
                   this.loadPage('/page/' + contentId, token, tabType);
                   break;
                   
                default:
                    this.loadPage(token, token, tabType);
                    break;
            }
        }else{
            // This is the initial default state.  Necessary if you navigate starting from the
            // page without any existing history token params and go back to the start state.
            //this.guestTabPanel.setActiveTab(0);
        }
     }
     
    /**
     * It loads an arbitrary html page into a viewport tab.
     * 
     * The loading page title should be located in a hidden html element
     * with class="nc2-page-title".
     */
     ,loadPage: function(url, token, tabType, params) {
            if (typeof params == 'undefined')
                params = {};
     	    if (typeof tabType == 'undefined')
     	        tabType = token.split('/')[1];
            
     	    id_prefix = 'nc2page-';
     	    var tabId = id_prefix + tabType;
     	    
     	    // Try to get current tab
            var cp = this.guestTabPanel.getItem(tabId);
            
            // load options for a tab page
            var loadOptions = {
                url: url,
                params: params,
                method: "GET",
                scripts: true,
                scope: this,
                callback: function(options, success, answer){
                	if (success) {
                    	var cCEl = cp.getEl().child('.nc2-content-container');
                    	if (cCEl != null)
                            cp.setTitle(cCEl.getAttribute('title'));
                	} else {
                		cp.setTitle('404: Нет такой страницы');
                		cp.update(answer.responseText);
                	}
                }
            }
            
            // if tab exists and has equal token
            if (cp != null && cp.token == token) {
                this.guestTabPanel.activate(cp);
                return;
            }
            
            // if tab exists and has not equal token but equal id
            if (cp != null && cp.token != token && cp.id == tabId) {
            	cp.token = token;
            	cp.load(loadOptions);
            	this.guestTabPanel.activate(cp);
            	return;
            }
            
            // if there is no tab exists
            var cp = this.guestTabPanel.add({
                xtype: 'guestCustomPagePanel'
                ,id: tabId
                ,token: token
                ,title: token
                ,autoLoad: loadOptions
            });
            
            this.guestTabPanel.activate(cp);
            this.guestTabPanel.doLayout();
            //cp.setTitle(cp.getEl().child('.nc2-content-container').getAttribute('title'));
            /*
            Ext.Ajax.request({
                url: url
                ,params: params
                ,method: "GET"
                ,scope: this
                ,callback: function(o, s, r) {
                    var a = r.responseText;
                    if (!Ext.isEmpty(a)) {
                        var cp = this.guestTabPanel.getItem(token);
                        if (cp != null)
                            this.guestTabPanel.remove(cp);
                        
                        var cp = this.guestTabPanel.add({
                            xtype: 'guestCustomPagePanel'
                            ,id: token
                            ,title: url
                            ,html: a
                        });
                        this.guestTabPanel.activate(cp);
                        this.guestTabPanel.doLayout();
                        cp.setTitle(cp.getEl().child('.nc2-content-container').getAttribute('title'));
                    }
                    else {
                        Ext.Msg.alert('Ошибка', 'Страница не найдена. ' +
                                'Возможно введен неверный адрес');
                        return false;
                    }
                }
            });*/
            return;
     }
    /**
      * Функция проверки готовности заявки на ремонт
      */
     ,checkCJ: function() {
        var win_check_cj = new Ext.Window({
            title : 'Сервис',
            layout : 'fit',
            width : 340,
            height : 300,
            plain : true,
            closeAction : 'hide',
            resizable : false,
            draggable : false,
            closable : true,
            modal : true,
            buttonAlign : 'center',
            items : new Ext.form.FormPanel({
                border : false,
                labelAlign : 'top',
                bodyStyle : 'padding: 10px',
                defaults : {
                    width : 200
                },
                items : [{
                        xtype: 'label'
                        ,html: '<div style="margin-bottom: 10px">Для того, чтобы проверить состояние выполнения заявки,'+
                                ' введите номер заявки в поле и нажмите "Проверить"</div>'
                    },{
                        xtype : 'textfield',
                        fieldLabel : 'Номер заявки',
                        anchor: '100%',
                        minLength: 5,
                        allowBlank : false,
                        listeners: {
                           valid: function(t) {
                              this.ownerCt.items.itemAt(2).enable();
                           },
                           invalid: function(t) {
                              this.ownerCt.items.itemAt(2).disable();
                           },
                           specialkey: function(t, e) {
                              if (e.getKey() == 13) { 
                                  if (t.ownerCt.items.itemAt(1).isValid()){
                                      t.ownerCt.items.itemAt(2).fireEvent('click', t.ownerCt.items.itemAt(2));
                                  }
                              }
                           },
                           render: function(t) {
                               t.focus(false, 600);
                           }
                        }
                    }, {
                        xtype : 'button',
                        text : 'Проверить',
                        disabled: true,
                        listeners: {
                            click: function() {
                                Ext.Ajax.request({
                                    url: '/index/checkcj'
                                    ,params: {id: this.ownerCt.items.itemAt(1).getValue()}
                                    ,scope: this
                                    ,success: function(r, o) {
                                        if (r.responseText == 'false') {
                                            this.ownerCt.items.itemAt(3).add({
                                                xtype: 'label'
                                                ,html: '<div>Извините, заявки с номером '+ o.params.id +' не существует</div>'
                                            });
                                        }
                                        else {
                                            var a = Ext.util.JSON.decode(r.responseText);
                                            this.ownerCt.items.itemAt(3).add({
                                                xtype: 'label'
                                                ,html: '<div><b>'+ a.id +'</b> — ' + a.status_id +'</div>'
                                            }); 
                                        }
                                        this.ownerCt.items.itemAt(3).doLayout();
                                    }
                                    ,failure: function() { 
                                        this.ownerCt.items.itemAt(3).add({
                                            xtype: 'label'
                                            ,html: '<div>Извините, в настоящее время сервис недоступен</div>'
                                        });
                                        this.ownerCt.items.itemAt(3).doLayout();
                                    }
                                });
                            }
                        }
                    }, {
                        xtype : 'panel',
                        border: true,
                        autoScroll: true,
                        style: 'margin-top: 8px;',
                        bodyStyle: 'padding: 4px; color: #555;',
                        anchor: '100%',
                        height: 100
                    }],
                buttons : [{
                        text : 'Закрыть',
                        handler : function() {
                            this.ownerCt.ownerCt.hide();
                        }
                    }]
                ,scope: this
            })
        });
        win_check_cj.show();
     }
    /**
     * Login processing function
     */
    ,loginFn: function() {
        var w = new Application.guestLoginWindow();
        w.show();
    }
    /**
     * User panel loading
     */
    ,loadUserPanel: function() {
        /*this.userPanel.load({
            url: '/index/userinfo'
            ,text: ''
        });*/
    }
});
