ASC.apply(Page, 
{
    lastValidZipCode:0,
    lastValidZipDistance:0,
	pageCount:0,
	pageIndex:1,
	listView:null,
	dealersPageComp:null,
	scriptEl:null,
	dealerHoursWidget:null,
	defaultLat:39.164141,
	defaultLng:-95.80078,
	dealerListSection:null,
	displayOnly4Dealers:false,
	showDirectionResult:false,
	searchType:'zip',
	previousView:null,
	chooseDealrPageSize:30,
	chooseDealerPageIndex:1,
	isAZ:false,
	dealers:null,
	previousSearchType:'zip',
	dealersInPop:null,
	serviceParams:null,
	lastValidCity:null,
	lastValidState:null,
	lastValidDealerName:null,
    lastValidDealerNameZip:null,
	dealersCache: new Ext.util.MixedCollection(false, function (field) {
		return field.key;	
	}),
	
    embedded: false,
    
	init:function()
	{
		this.initPageLoadData();
	    this.initTabs();
		if(this.viewType == "list")
		{
			this.callListView();
		}
		else
		{
			this.callMapView();
		}
		if( this.dealersList.dealers.length > 0 ){
			var len = this.dealersList.dealers.length;
			/*
			 * dealersList is not null and Distance ordered Ascendent
			 */
			var maxDistance = this.dealersList.dealers[len-1].zipDistance;
			this.resetSearchArea(maxDistance);
		}
		this.initAjax();
		this.initValidZipCode();
		this.initCityDeepLink();
		this.initDealerNameDeepLink();
		this.verifyZipCode();
		ASC.Chrysler.Cookies.onPreferredDealer(this.setPreferredDealer, this);
	},
	
	initTabs:function(){
		 var tabsHtml = new ASC.Chrysler.FAD.FadTabsHTML({brand:this.brand,params:this.params});
		 var activeTab = 0;
		 if( this.params ){
			 switch(this.params.pageType){
			 case 'zip':
				 activeTab = 0;
				 break;
			 case 'state':
				 activeTab = 1;
				 break;
			 case 'dealerName':
				 activeTab = 2;
				 break;
			 default:
				 activeTab = 0;
				 
			 }
		 }
		 var tabs = new ASC.Chrysler.FAD.FadTabs({items:tabsHtml.items,activeTab:activeTab,
				renderTo:"listTabs",width:750,height:165});
	},	
	initTabFormCss:function(){
		if( ASC.getEl("searchBtn_zip") )
			ASC.getEl("searchBtn_zip").dom.className = "searchText";
		if( ASC.getEl("searchBtn_cs") )
			ASC.getEl("searchBtn_cs").dom.className = "searchText";
		if( ASC.getEl("searchBtn_dealer"))
			ASC.getEl("searchBtn_dealer").dom.className = "searchText";
		this.clearErrorMsg();
		
    },
	resetSearchArea:function(distance)
	{
		if ((distance > 200)) {
			ASC.getEl("selectArea").setValue('200');
		} else if ((distance > 100)) {
			ASC.getEl("selectArea").setValue('200');
		} else if ((distance > 50)) {
			ASC.getEl("selectArea").setValue('100');
		} else if ((distance > 25)) {
			ASC.getEl("selectArea").setValue('50');
		} else if( distance > 10 ){
			ASC.getEl("selectArea").setValue('25');
		} else{
			ASC.getEl("selectArea").setValue('10');
		}
	},
	initDealers: function(data)
	{
		this.dealersList = new Object();
		this.dealersList.dealers = [];
		if( this.params && this.params.zipDistance){
			this.zipDistance = this.params.zipDistance;
		}
			
		if(data && data.dealers && data.dealers.length > 0)
		{
			this.dealersList = data;
		}
	},
	initCityDeepLink:function(){
		if( this.params && this.params.pageType == 'state'){
			if( this.params.city && this.params.stateCode){
				 if(ASC.getEl("bycity"))
					 ASC.getEl("bycity").setValue(this.params.city);
				 if(ASC.getEl("bystates"))
					 ASC.getEl("bystates").setValue(this.params.stateCode);
				 this.searchDealerListByCity();
			 }
		}
	},
	initDealerNameDeepLink:function(){
		if( this.params && this.params.pageType == 'dealerName'){
			if( this.params.dealerName){
				 ASC.getEl("sDealerName").setValue(this.params.dealerName);
				 this.searchDealerListByDealerName();
			 }
		}
	},
	initAjax: function()
	{
		this.ajax.registerRequest('LOCATEDEALERSAJAX', ASC.cfg.getContextPath() + '/fad/locateDealerships.ajax');
		this.ajax.registerAjaxObject('locateDealers', new ASC.Ajax.Response({
			events: {
				success: {
					fn: this.getLocateDealersCallback,
					scope: Page
				}
		}
			}
		));
		
		this.ajax.registerRequest('DEALERINFOAJAX', ASC.cfg.getContextPath() + '/fad/dealerInfo.ajax');
		this.ajax.registerAjaxObject('dealerInfoData', new ASC.Ajax.Response({
			events: {
				success: {
					fn: this.getDealerInfoCallback,
					scope: Page
				}
			}
		}));
		
		this.ajax.registerAjaxObject('error', new ASC.Ajax.Response({
			events: {
			failure:{
			fn:this.ajaxFailure,
			scope:this
		}
		}
		}
		));
	},
	ajaxFailure:function()
	{
		//this.loader.hide();
	},
	initValidZipCode:function()
	{
		this.zipCodeValidator = new ASC.Chrysler.ZipValidator({ajax:this.ajax});
		ASC.apply(this.zipCodeValidator,{
			handleZipValidation: function (response, ioArgs)
			{			
				var isValidZipCode=(response.data=='true');
				
				if(isValidZipCode)
				{					
					if(!Page.embedded){
					ASC.Chrysler.Cookies.setZipCode(Page.currentZipCode);
					}
					var radius = ASC.getEl("selectArea").getValue();
					Page.getLocateDealers(['byzipForm'],{zipCode:Page.currentZipCode,zipDistance:parseInt(radius)});
												
				}
				else
				{
					var errorEl = ASC.getEl("errorMsg_zipCode");
					errorEl.setValue(ASC.message("fad_findDealers_zipCodeError"));
					Page.searchType = Page.previousSearchType;
				}
				
			}
		});
   		this.lastValidZipCode = ASC.getEl("sZipCode").getValue();
        this.lastValidZipDistance = ASC.getEl("selectArea").getValue();
        if(this.lastValidZipCode) {
             ASC.getEl("headerPrintBar").setStyle("display","block");
        } else {
             ASC.getEl("headerPrintBar").setStyle("display","none");
        }

	},
	trackSearchEvent:function()
	{
		var mlc = '/en/dealer_locator/';
		switch(this.viewType){
		 case 'list':
			 mlc+= 'list_view';
			 break;
		 case 'map':
			 mlc+='map_view';
			 break;
		 case 'direction':
			 mlc+='directions_requested';
			 break;
		 default:
			 mlc+= 'list_view';
		}
		
		ASC.Chrysler.trackPageMetrics(mlc);
			
		ASC.Chrysler.trackLinkMetrics('content','search');
	},
	verifyZipCode:function()
	{
		if(!this.zipCode)
		{
			var ms='';
			this.promptToEnter(ms);
		}
		
	},
    onEnterForZip:function(evt,id)
	{
		var isie = (document.all) ? true : false;
		if(isie) evt = window.event;
		var key;
		key = isie?event.keyCode:evt.which;

		if(key==13)
			this.searchDealerListByZip();

	},
    onEnterForCityState:function(evt,id)
	{
		var isie = (document.all) ? true : false;
		if(isie) evt = window.event;
		var key;
		key = isie?event.keyCode:evt.which;

		if(key==13)
			this.searchDealerListByCity();

	},
    onEnterForDealerName:function(evt,id)
	{
		var isie = (document.all) ? true : false;
		if(isie) evt = window.event;
		var key;
		key = isie?event.keyCode:evt.which;

		if(key==13)
			this.searchDealerListByDealerName();

	},
    onEnterForDirection:function(evt,id)
    {
      var isie = (document.all) ? true : false;
      if(isie) evt = window.event;
      var key;
      key = isie?event.keyCode:evt.which;

      if(key==13)
        Page.getDirection(this.dealerCode);

    },
    onEnterForDirectionButton:function(evt,id)
    {
      var isie = (document.all) ? true : false;
      if(isie) evt = window.event;
      var key;
      key = isie?event.keyCode:evt.which;

      if(key==13)
        Page.getDirection(this.dealerCode);

    },
	promptToEnter:function(title)
	{
		var errorTitle = ASC.message("zipError");
		var msg = ASC.message("zipTitle"); 
		  Ext.Msg.prompt(title,msg,function(btn,text){
				if(btn=="ok")
				{
					 if(text)
					 {
					  if(!ASC.util.isZip(text))
					  {
						  Page.promptToEnter(errorTitle);
					  }
					  else
					  {
						  ASC.getEl("sZipCode").setValue(text);
						  ASC.Chrysler.setZipCode(text);
						  Page.searchDealerListByZip();
					  }
					}
					else
					{
						 Page.promptToEnter(errorTitle);
					}
					
				}else{
					 Page.callListView();
				}
			  });
		  var dlg = Ext.Msg.getDialog();  
		  var t = Ext.get(Ext.get(dlg.body).select('.ext-mb-input'));  
		  t.on('keypress',function(e){
			  //Backspace keyCode is 8 
			  if(e.ctrlKey || e.isSpecialKey() || e.keyCode == 8){ return; }
			  //Only accept 5 digits for zip code
			  var patrn=/^\d{1,5}$/;  
			  var txt = this.value;
			  var charCode = String.fromCharCode(e.getCharCode());
			  txt = txt+charCode;
			  if(!patrn.exec(txt))
				  e.stopEvent();
		  	}
		  );
	},	
	confirmContinue:function()
	{
		var msgValue = ASC.message("searchMsg");
		var continueMsg = ASC.message("continueMsg");
		var cancelMsg = ASC.message("cancelMsg");
		Ext.Msg.show({
			title:"",
			msg:msgValue,
			buttons: {yes:continueMsg,no:cancelMsg},
			icon: Ext.MessageBox.QUESTION,
			width:400,
			fn:function(btn,text){
				if(btn == "yes")
				{
					Page.continueToDo = true;
					Page.chooseDealerAjaxRequest();
				}
				else
				{
					ASC.getEl("sDealerName").dom.focus();
					Page.continueToDo = false;
				}
			}
		});
	},
	chooseDealerAjaxRequest:function()
	{
		this.clearErrorMsg();
		this.displayOnly4Dealers = false;
		if(this.getLocateDealersConditions)
		{
	         this.getLocateDealersConditions.params.numResultsPerGroup = this.chooseDealrPageSize;
	         this.getLocateDealersConditions.params.resultsGroupNumber = this.chooseDealerPageIndex;
	         this.ajax.sendRequest('LOCATEDEALERSAJAX',
				this.getLocateDealersConditions
				);
		}
	},
	chooseDealerChangePage:function(offset)
	{
		 if(this.getLocateDealersConditions)
		 {
			 this.chooseDealerPageIndex += offset;
			 this.chooseDealerAjaxRequest();
		 }
	},
	getLocateDealers: function(forms,options)
	{
		this.clearErrorMsg();
		this.ajax.sendRequest('LOCATEDEALERSAJAX',
				{
			forms:forms,  
			params: options
			});
	},
	
	getLocateDealersCallback: function (response, ioArgs)
	{
		  this.isAZ = response.data.centerState == "AZ";
		  this.isValidCityState = response.data.isValidCityState;
		  var len = response.data.dealers.length;
		  var dealerCount = response.data.totalDealerCount;
		//   this.loader.hide();
		  if(this.searchType == "dealerName" && dealerCount >30&& !this.continueToDo)
		  {
				this.confirmContinue();
				return;
		  }
		 if(  dealerCount >1 && this.searchType == "dealerName"&&!this.displayOnly4Dealers&&!this.isAZ)
		  {
			  	this.selectOneDealer_dealerName(response.data);
			  	return;
				
		  }
		  if(this.searchType == "dealerName"&&this.displayOnly4Dealers&&!this.isAZ)
		  {	
			  	this.pageIndex = 1;
			  	this.previousSearchType = this.searchType;
			  	this.showOnly4Dealers(response.data);
			  	this.validParams();
			  	return;
		  }
		  if( len > 0 )
		  {
			  	   if( this.viewType == "direction")
			  		   this.gotoPreviousView();
				   if(this.viewType == "list")
				   {
					   this.reloadListView(response.data);
				   }else
				   {
					   this.reloadMapView(response.data);
				   }
				   this.zipCode = response.data.zipCode;
				   /*
					 * dealersList is not null and Distance ordered Ascend
					 */
					var maxDistance = response.data.dealers[len-1].zipDistance;
					this.validParams();
                    this.resetSearchArea(maxDistance);
		  }
		  if( len == 0){
			  this.noRecordErrMsg();
			  this.searchType = this.previousSearchType;
		  }
            if(this.lastValidZipCode) {
                ASC.getEl("headerPrintBar").setStyle("display","block");
            } else {
                ASC.getEl("headerPrintBar").setStyle("display","none");
            }
	},	
	
	validParams:function(){
		this.previousSearchType = this.searchType;
		switch(this.searchType){
		case'zip':
			this.serviceParams = ASC.util.objectToQuery(ASC.util.formToObject('byzipForm'));
			this.lastValidZipCode = this.zipCode;
			this.lastValidZipDistance = ASC.getEl("selectArea").getValue();
			break;
		case 'city/state':
			this.lastValidCity = ASC.getEl("bycity").getValue();
            this.lastValidState = ASC.getEl("bystates").getValue();
            this.serviceParams = ASC.util.objectToQuery(ASC.util.formToObject('bycityForm'));
			break;
		default:
			this.lastValidDealerName = escape(ASC.getEl("sDealerName").getValue());
            this.lastValidDealerNameZip = this.dealerNameZipCode;
			this.serviceParams = ASC.util.objectToQuery(ASC.util.formToObject('byDealerNameForm'));
		}
	},
	
	locateDealer: function(selectedDealerCode){
		this.displayOnly4Dealers = true;
		var dealers = this.dealersInPop.dealers;
		var len =dealers.length;
		this.dealerNameDealerCode = selectedDealerCode;
		for(var i=0;i<len;i++)
		{
			if(dealers[i].dealerCode == selectedDealerCode)
			{
				this.dealerNameDealer = dealers[i];
				this.dealerNameZipCode = dealers[i].zip.substring(0,5);
                this.lastValidDealerNameZip = this.dealerNameZipCode;
				this.getLocateDealersConditions = {forms:['byDealerNameForm'],params:{zipCode  :this.dealerNameZipCode,dealerCode:selectedDealerCode}}
				this.ajax.sendRequest('LOCATEDEALERSAJAX', 
					this.getLocateDealersConditions
				);
				break;
			}
		}
		
	},
	
	printPage:function()
	{
		var viewParam ="viewType="+this.viewType;
		var pageSizeParam = "&numResultsPerGroup=4";
		var pageIndexParam = "&resultsGroupNumber="+this.pageIndex;
		var pageCountParam = "&pageCount="+this.pageCount;
		var searchType = "&searchType=zip";
		var searchParam = "";
		var showDealerCardParam = "";
		this.searchType = this.previousSearchType;
		var formParam = this.serviceParams;
		formParam = formParam ? "&"+formParam:"";
		if(this.searchType == "zip")
		{
			this.lastValidZipDistance = ASC.getEl("selectArea").getValue();
			if(this.lastValidZipCode)
			{
				searchParam="&zipCode="+this.lastValidZipCode+"&zipDistance="+
				this.lastValidZipDistance+formParam;
			}
			else
			{
				alert(ASC.message("fad_findDealers_nozipcode"));
				return;
			}
		}
		else if(this.searchType == "city/state")
		{
			if(!ASC.getEl("bycity").getValue() || !ASC.getEl("bystates").getValue())
			{
				alert(ASC.message("fad_findDealers_noCityState"));
				return;
			}
			searchType="&searchType=city/state";
			searchParam=formParam+"&city="+this.lastValidCity+"&state="+this.lastValidState;
		}
		else if (this.searchType == "dealerName")
		{
			if(!ASC.getEl("sDealerName").getValue())
			{
				alert(ASC.message("fad_findDealers_noDealerName"));
				return;
			}
			searchType="&searchType=dealerName";
            if (this.dealerNameZipCode == ""){
                this.dealerNameZipCode = this.lastValidDealerNameZip;
            }
			var zipParam = this.dealerNameZipCode ?"&zipCode="+this.dealerNameZipCode.substr(0,5):"";
			var dealerCodeParam = this.dealerNameDealerCode ?"&dealerNameDealerCode="+this.dealerNameDealerCode:"";
			if( this.dealerNameZipCode )
				searchParam=formParam+zipParam;
			else
				searchParam=formParam+"&dealerName="+this.lastValidDealerName;
			
		}
		if(this.viewType == "map")
		{
			showDealerCardParam = "&dealerCardShowed="+this.dealersMap.dealerCardShowed+"&dealerCardDealerCode="+this.dealersMap.dealerCardDealerCode;
		}
		if(this.viewType == "direction"){
			if(this.searchType)
				searchType="&searchType="+ this.searchType;
			else
				searchType="&searchType=zip";
			searchParam +="&dealerCode="+this.directionDealer.dealerCode;
			searchParam +="&showDirectionResult="+this.showDirectionResult;
			var sourceAddr = ASC.getEl("startAddress").getValue();
			searchParam +="&startAddress="+sourceAddr;
		}
		var params = viewParam+searchParam+pageSizeParam+pageIndexParam+searchType+pageCountParam+showDealerCardParam;
		var url = ASC.cfg.getContextPath() + '/fad/printFindDealers.do?';
		url+=params;
		var width=screen.width-5;
		var height=screen.height;
		var winParams = "top=0,left=0,status=0, menubar=0,location=yes,scrollbars=yes, toolbar=0";
		winParams+=",width="+width;
		winParams+=",height="+height;
		window.open(url,"_blank",winParams);
	}
	
});

ASC.onReady(Page.init, Page);

