/*
 * ASC.Chrysler.EAF.DealerList
 * 
 */
ASC.namespace('ASC.Chrysler.EAF.DealerList');
ASC.Chrysler.EAF.DealerList = ASC.extend(Ext.util.Observable,{
	renderTo: null,
	dealerData: null,
	pageBarSize:5,
	currentDealerIndex:1,
	dealerCount:1,
	constructor: function (dealerData,cfg)
	{
		ASC.Chrysler.EAF.DealerList.superclass.constructor.apply(this);
		this.addEvents({"render":true});		
		ASC.apply(this, cfg);
		this.dealerData = dealerData;
	
		this.initTemplates();
		this.initPageBar();
		this.render();
		if(this.renderToPageBar)
		{
			this.renderPageBar(this.pageIndex, this.pageCount)
		}
	},	
	reRender: function()
	{		
		this.dealerListTpl.overwrite(this.renderTo, this.dealerData);
		this.fireEvent("render");
		//this.fireEvent("changedIndex",{currentDealerIndex:this.currentDealerIndex});
	},
	render: function()
	{
		this.currentDealerIndex = 1;
		this.dealerCount = this.dealerData.length;
		this.dealerListTpl.overwrite(this.renderTo, this.dealerData);
		this.fireEvent("render");
		//this.fireEvent("changedIndex",{currentDealerIndex:this.currentDealerIndex});
	},
	renderPageBar: function(pageIndex,pageCount)
	{
		this.pageIndex = pageIndex;		
		this.pageCount = pageCount;
		var starItemIndex = (pageIndex-1)*Page.c_pageSize+1;
		var endItemIndex = pageIndex*Page.c_pageSize > Page.c_itemCount ? Page.c_itemCount : pageIndex*Page.c_pageSize;
		
		var pageBarPageCount = pageCount%this.pageBarSize ==0? parseInt(pageCount/this.pageBarSize):parseInt(pageCount/this.pageBarSize)+1;
		var pageBarPageIndex = pageIndex%this.pageBarSize == 0 ? parseInt(pageIndex/this.pageBarSize):parseInt(pageIndex/this.pageBarSize)+1;
		var showPageCount = pageBarPageIndex<pageBarPageCount?this.pageBarSize:pageCount%this.pageBarSize==0?this.pageBarSize:pageCount%this.pageBarSize;
		this.pageBarTpl.overwrite(this.renderToPageBar,{pageIndex:pageIndex,showPageCount:new Array(showPageCount),pageCount:pageCount,
			pageBarPageCount:pageBarPageCount,pageBarPageIndex:pageBarPageIndex,pageBarSize:this.pageBarSize,starItemIndex:starItemIndex,endItemIndex:endItemIndex});
	},
	
	initTemplates: function ()
	{
		this.dealerListTpl = new Ext.XTemplate(
				'<tpl for=".">',
				'<table class="choosedealer_table" cellspacing="0" cellpadding="0">',
	    			'<tr>',
                        '<td class="choosedealer_td_radio">',
                            '<input type="radio" name="radio" onclick="javascript:Page.setSelectedDealer({dealerCode});" id="radio{dealerCode}" value="radio" />',
                        '</td>',
                        '<td class="choosedealer_td_title">',
                            '{name}',
                        '</td>',
                    '</tr>',
                    '<tr>',
                        '<td>',
                            '&nbsp;',
                        '</td>',
                        '<td class="choosedealer_td_text">',
                            '{address1}<br/>{city}, {state}<br/>{distance} {[this.translate("eaf_employeeVehicleSelector_milesAway")]}',
                        '</td>',
                    '</tr>',
                '</table>',
				'</tpl>',
				{					
					translate: function (key)
					{
						return ASC.message(key);
					}
				});
		this.dealerListTpl.el = this;
		this.dealerListTpl.compile();
	},
	initPageBar: function()
	{
		this.pageBarTpl = new Ext.XTemplate(
				'<div class="choosedealer_page_info">',
                '   {[this.translate("eaf_employeeVehicleSelector_dealers")]} {[values.starItemIndex]}-{[values.endItemIndex]} {[this.translate("eaf_employeeVehicleSelector_of")]} {[Page.c_itemCount]}',
                '</div>',
                '<div class="choosedealer_page_frame">',
				'<div class="choosedealer_page_left">',
                '   {[this.translate("eaf_employeeVehicleSelector_page")]}:',
                '</div>',
                '<div class="choosedealer_page_right">',
                '<tpl if="values.pageBarPageIndex!=1"><a href="javascript:Page.dealersData.setPageBarSelectedIndex(-1,{pageBarPageIndex},{pageBarSize});">...</a></tpl><tpl for="showPageCount">',	
					' <a {[parent.pageBarSize*(parent.pageBarPageIndex-1)+xindex === parent.pageIndex ? "class=selected":"class=unselected"]} ',
						'href="{[parent.pageBarSize*(parent.pageBarPageIndex-1)+xindex === parent.pageIndex ? "javascript:void(0);":"javascript:Page.dealersData.setPageIndex("+(parent.pageBarSize*(parent.pageBarPageIndex-1)+xindex)+");"]}">{[parent.pageBarSize*(parent.pageBarPageIndex-1)+xindex]}</a> |',
				'</tpl><tpl if="values.pageBarPageCount&gt;1&amp;&amp;values.pageBarPageIndex!=values.pageBarPageCount"><a href="javascript:Page.dealersData.setPageBarSelectedIndex(1,{pageBarPageIndex},{pageBarSize});">...</a></tpl>',					
				'</div>',
				{					
					translate: function (key)
					{
						return ASC.message(key);
					},
					getDealerCount:function(){
						return this.dealerData.itemCount;
					}
				}); 
		this.pageBarTpl.compile();
	},
	
	update: function (dealerData){
		this.dealerData = dealerData;
		this.render();
	}
});
ASC.apply(Page, {
	
	c_pageSize: 5,			
	c_defaultPage: 1,			
	c_dealerKey: 'dealers',	
	c_itemCount:1,
	
	excludedListTpl: null,
	
	init:function(){
		this.initProgramSelect();
		this.initSelect();
		this.initAjax();
		this.initDisplay();
		this.initTemplates();
		
		this.buildExcludedVehicleList(null);
		
	},

	initDisplay:function(){
        ASC.getEl('zipValidate').hide();
        ASC.getEl('choosedealer').hide();
        ASC.getEl('divPageMask').dom.style.display = 'none';
	},

	initAjax:function(){
		this.ajax.registerRequest('DEALERSINZIPAJAX', ASC.cfg.getContextPath() + '/eaf/dealersInZip.ajax');
		this.ajax.registerAjaxObject('locateDealers', new ASC.Ajax.Response({
			events: {
			success: {
				fn: this.showLocateDealers,
				scope: Page
			}
		}
		}));
	},
	
	initTemplates: function ()
	{
		
	},
	
	buildExcludedVehicleList: function (selectedOption)
	{
		
		//ASC.getEl('notEligibleList').setValue(ASC.message('eaf_employeeVehicleSelector_ineligible'));
		/*
		var programs = {
			'PREFERRED': 'affiliate',
			'FRIENDS': 'friends',
			'EMPLOYEE': 'employee'
		};
		var prop;
		if(selectedOption==null){
			prop = programs[Page.pricingProgram] || 'affiliate';
		}else{
			prop = programs[selectedOption] || 'affiliate';
		}
		var cList = Page.vehicleList.filter('division', 'C').filter(prop, false);
		var dList = Page.vehicleList.filter('division', 'D').filter(prop, false);
		var jList = Page.vehicleList.filter('division', 'J').filter(prop, false);
			
		var html = [];
		html.push(this._buildExcludedVehListHtml('Chrysler', cList));		
		html.push(this._buildExcludedVehListHtml('Dodge', dList));
		html.push(this._buildExcludedVehListHtml('Jeep', jList));
		
		var tpl = new Ext.XTemplate(
			'<table border="0" cellpadding="0" cellspacing="0">',
				'<tr>',
					'<tpl for="lists">',
						'<td style="vertical-align: top">{.}</td>',					
					'</tpl>',
				'</tr>',
			'</table>'
		);
		tpl.compile();
		
		
		tpl.overwrite('notEligibleList', {lists: html });
		*/
	},
	
	_buildExcludedVehListHtml: function (division, list)
	{
		var html = [];
		if (list.getCount() > 0) {	
			html.push('<table cellspacing="0" cellpadding="0" border="0"><tr>');
				list.each(function (item, index) {
					if (item.description.trim().length < 1) { return; }
					if (index % 8 == 0){
						if(index > 0) 	html.push("</ul></td>");	
						html.push("<td style=\"vertical-align: top;\"><ul>");
					}
					html.push('<li>');
					html.push(division);
					html.push(' ' + item.year + ' ');
					html.push(item.description);
					html.push('</li>\r\n');					
				});	
			html.push("</ul></td>");
			html.push('</tr></table>');
		} 
		
		return html.join('');
	},
	
	
	showLocateDealers:function(response, ioArgs){
		if(response.data.dealers.length == 0){
			ASC.getEl('zipValidate').show();
		}else {
			ASC.getEl('zipValidate').hide();
			ASC.getEl('notEligibleList').hide();
            ASC.getEl('choosedealer').show();
            ASC.getEl('divPageMask').show();
            ASC.util.removeClass(ASC.getEl('baseContent'),"content");
            ASC.util.addClass(ASC.getEl('baseContent'),"content_disable");
           	var selectEl = document.getElementsByTagName('select');
           	for(i = 0; i<selectEl.length; i++){
	           	selectEl[i].disabled = true;
           	}
			Page.initDealers(response.data);
			ASC.getEl('dealerCode').setValue('');
			ASC.getEl('pleaseSelectADealer').hide();
		}
	},

	initDealers: function(data)
	{
		this.c_itemCount = data[this.c_dealerKey].length;
		this.dealersData = new ASC.Chrysler.Pagination(data,this.c_pageSize, this.c_dealerKey);
		this.dealersData.on('indexChanging',this.onIndexChanging,Page);
	
		this.dealersList = new ASC.Chrysler.EAF.DealerList(this.dealersData.getItems(1), {
			renderTo: 'dealers',
			renderToPageBar: 'pageBar',
			pageIndex: this.dealersData.pageIndex,
			pageCount: this.dealersData.pageCount,
			pageSize: this.c_pageSize	
		});
	},
	
	onIndexChanging: function(options)
	{
		this.dealersList.renderPageBar(options.pageIndex,this.dealersData.pageCount);
		this.dealersList.update(options.items);
	},
	
	validateSelectedDealer:function(){
		if(ASC.getEl('dealerCode').getValue()==''){
			ASC.getEl('pleaseSelectADealer').show();
			return false;
		}else{
			ASC.getEl('pleaseSelectADealer').hide();
			return true;
		}
	},
	setSelectedDealer:function(dealerCode){
		ASC.getEl('dealerCode').setValue(dealerCode);
	},
	
	buildMyOwnEvent: function () 
	{
		if (this.validateSelectedDealer()) {
			var selectedDealerCode = ASC.getEl('dealerCode').getValue();
			var selectedModelYearCode = ASC.getEl('vehicle').getValue();
			
			var baseUrl = ASC.cfg.getBrandHostnameUrl(ASC.getEl('brands').getValue());			
			window.location.href = baseUrl 
			     + '/bmo/eafConfig.do?dealerCode=' + selectedDealerCode 
			     + '&modelYearCode=' + selectedModelYearCode
			     + '&eaf=' + Page.pricingProgram		    
			     /**
	         	  * CHRUAR-1110 - will be used as a request parameter to BMO
	         	  */
				 + '&zipCode=' + Page.zipcode;

		}					
	},
	
	initSelect: function ()
	{
		var brandEl = ASC.getEl('brands');
        ASC.util.addOptionsToSelect('vehicle', this.vehicles[brandEl.getValue()]);
        
        brandEl.on('change', function(evt, el){
            ASC.util.addOptionsToSelect('vehicle', this.vehicles[ASC.getEl(el).getValue()]);
        }, Page);
        
        var program = ASC.getEl('selectProgram');
        if (program && program.dom) {
        	program.on('change', function (evt, el) {
        		Page.buildExcludedVehicleList(el.value);
        	}, Page);
        }
        
        
	},

	setNotEligibleProgramTitle:function(value){
        //ASC.getEl('notEligibleProgram').update(Page.notEligibleProgram.replace("$program",value));
		
	},

	initProgramSelect: function(){	
        if (this.pricing == 'preferred_only') {
            ASC.getEl('programsSelect').setDisplayed('none');
            ASC.getEl('program').update(this.affiliateRewards);
            this.pricingProgram = 'PREFERRED';
            this.setNotEligibleProgramTitle(this.affiliateRewards);
        }
        else 
            if (this.pricing == 'friend,employee_advantage') {            	
                ASC.getEl('program').setDisplayed('none');
                var text = ASC.getEl('selectProgram').dom.options[ASC.getEl('selectProgram').dom.selectedIndex].text;
                this.setNotEligibleProgramTitle(text);
                this.pricingProgram = ASC.getEl('selectProgram').getValue();
                ASC.getEl('selectProgram').on('change', function(evt, el){	                
	                var text = el.value;
	                this.setNotEligibleProgramTitle(text);
	                this.pricingProgram = ASC.getEl(el).getValue();
		        }, Page);
            }
            else {
                ASC.getEl('programsSelect').setDisplayed('none');
                ASC.getEl('program').update('<span style="color:red">'+this.noProgramAvaliable+'</span>');
                //ASC.getEl('notEligibleProgram').update(this.specifyProgram);
                ASC.getEl('notEligibleList').hide();
            }
    },

    chooseDealer: function(){
    	var zipCodeEl = ASC.getEl('zipCode'); 
    	
    	ASC.getEl('zipValidate').hide();
    	if(!ASC.util.isZip(zipCodeEl.getValue())){
	    	ASC.getEl('zipValidate').show();
	    	zipCodeEl.focus();
	    	return;
    	}
    	/**
         * CHRUAR-1110 - persist zipcode as a global param for later use
         */
    	this.zipcode = zipCodeEl.getValue();
    	var selectBrands = ASC.getEl('brands').getValue();
    	var strIsChrysler = "";
    	var strIsJeep = "";
    	var strIsdodge = "";    	
    	if(selectBrands == "chrysler")
    		strIsChrysler = "Y";
    	if(selectBrands == "jeep")
    		strIsJeep = "Y";
    	if(selectBrands == "dodge")
    		strIsdodge = "Y";
    	
	    this.ajax.sendRequest('DEALERSINZIPAJAX', {
			params: {
	    	zipCode: zipCodeEl.getValue(),
	    	isChrysler:strIsChrysler,
	    	isJeep:strIsJeep,
	    	isDodge:strIsdodge
			}
		});		  			
    }
	
});
ASC.onReady(Page.init, Page);