//Ext.BLANK_IMAGE_URL = '/ext-2.0.1/resources/images/default/s.gif';

/*** modify price config js **/


var EnumCboObjectType={
	RANGE:1,
	SINGLE:2
}
var EnumWSPNConfig={
	GETCONFIGURATOR:'getConfigurator',
	GETCONFIGURATORRESULT:'getConfiguratorResults'
}

var EnumPNConfigAction={
	UPDATE:1,
	INIT:2,
	RESET:3
}



var PNConfig =function(){

	var _templateRange='<div class="row"><label class="lbl">{label}</label>{cbo_left}<label class="lbl_to">{to}</label>{cbo_right}<label class="unit">{unit}</label></div>';
	var _templateSingle='<div class="row"><label id=lbl3 class="lbl">{label}</label>{cbo}<label class="unit">{unit}</label></div>';
	var _templateRowCount = '<div class="rowCount"><label>{count} {parts} {matches} your selection</label></div>';
	var _templateRangeCondition="AND a.partNumberId in (select distinct partNumberId from partConfigAttribute_new PARTCONFIGATTRIBUTE_NEW{0} where (attributeNameId={1} and attributeValue {2} cast('{3}' as Numeric(10,2)) and productId={4})) ";
	var _templateSingleCondition="AND a.partNumberId in (select distinct partNumberId from partConfigAttribute_new PARTCONFIGATTRIBUTE_NEW{0} where (attributeNameId={1} and attributeValue = {2} and productId={3})) ";
	var _tplPNConfig;
//	var _tableOrder="";
	var _containerPNConfig;
//	var _panelPNConfig="";
	var _win=Ext.Msg;
	var _delayTask = new Ext.util.DelayedTask();
	var _configMsg={
			title: 'Please wait',
			msg:'Retrieving results for your selection',
			width:350,
			//progress:true, 
			//wait:true,
			closeable:false,
			icon: Ext.MessageBox.INFO
	}
	var _traceStart;
	var _traceEnd;
	var _doTrace=true;
	
	var _total;
	var _lang,_email,_prodType,_labelId,_mId;
	var _cboMgr,_tblOrderMgr;
	
    var _traceLog= new function(){
		try{
			var t = new Date().getTime();
			this.log = function(msg){
				try{
					if (console && msg && _doTrace){
						console.log(msg+"--"+(new Date()).format('n/j/Y, g:i:s:u a')+"--"+((new Date()).getTime()-t));
						t = new Date().getTime();
					}
				}
				catch(e){}
			}
		}
		catch(e){}
	}
   
    function TblOrderMgr(mId,lang,prodType,email,labelId){
		// manager responsible for build ordering table and display corresponding record count
		var _mId=mId,_lang=lang,_prodType=prodType,_email=email,_labelId=labelId;
		var _total = Ext.get("PCTotal");
		var _containerOrderTable =Ext.get("PNConfigOrderTable");
		var _containerResult =Ext.get("PNConfigResult");
		return{
			SetTotal:function(){
				
				
				
				var rows = Ext.get("bTotal");
				if (_total && rows){
					var cnt = rows.getAttributeNS('','TotalNumber');
					_total.update(cnt);
					
					_traceLog.log("Set ordering table record count..."+cnt);
					/*
					var tpl = new Ext.Template(_templateRowCount);
					tpl.compile();
					tpl.append(_total.id,{
						count:cnt,
						parts:((cnt==1)?'part':'parts'),
						matches:((cnt==1)?'matches':'matche')
					})
					*/
		//			_total.dom.innerText=rows.getAttributeNS('','TotalNumber');
				}


				
			},
			ShowCartButtons:function(){
				var vAddToCart = Ext.get("btnAddToCart");
			    var vAddToCart2 = Ext.get("btnAddToCart2");
				
				vAddToCart2.setVisible(true);	
				
				_containerResult.insertFirst(vAddToCart);
				vAddToCart.setVisible(true);
							
			},
			BuildConfiguratorOrderTable:function(results,params){
				// append table to the placeholder
				
				_traceLog.log("Building ordering table...");
				PNConfig.CloseWindow();
				
				try {
					if (_containerOrderTable) {
						PNConfig.UpdateWindowMsg('Build ordering table...');
						//PNConfig.UpdateWindowMsg('Updating Part Number Configurator...');
						_containerOrderTable.dom.innerHTML = results;

						
						_containerOrderTable.setVisible(true);
/*
						_containerOrderTable.setVisible(true, {
							endOpacity: 1,
							easing: 'easeOut',
							duration: 1
						})
*/						

						

						this.SetTotal();
						
						
						this.ShowCartButtons();
						MXfer.InitTxtQty();
					//PNConfig.RelocateButton();
					}
				} 
				catch (e) {
					PNConfig.CloseWindow();
				}
				finally {
					//PNConfig.CloseWindow();
				}
			},
			BuildOrderTable:function(selection){
				
				_traceLog.log("Init Building ordering table service...");
										
				GetPartConfiguratorOrderTableResults.init({
					method:EnumWSPNConfig.GETCONFIGURATORRESULT,
					prodId:_mId,
					selection:selection,
					pLang:_lang,
					pEmail:_email,
					pProdType:_prodType,
					pLabelId:_labelId,
					pUrl:''
				})		
				//PNConfig.UpdateWindowMsg('Gathering information to build table...');
				//PNConfig.UpdateWindowMsg('Updating PartNumber Configurator...');
						
			}
		}
	}
   
   
   	function CboMgr(mId,lang,prodType,email,labelId,container,tblOrderMgr){
		var _mId =mId,_lang =lang,_prodType=prodType,_email=email,_labelId=labelId,_tblOrderMgr=tblOrderMgr;
		var _arrCbos=new Array();
		var _container = container;
		return{
			Add:function(params){
				var j = 0;
				if (_arrCbos.length>0){
					j = _arrCbos.length;	
				}
				_arrCbos[j]={
					id:params.id,
					cbo:params.cbo
				}				
			},
			GetPNConfigSelectionsResult:function(params){
				GetPartConfiguratorSelectionsResults.init(params);				
				
			},
			BuildCondition:function(args){
				// generate selection statement and pass onto ws and return back json data to update
				// dropdowns and ordering table

				
				var s="";
				for (var i=0;i<_arrCbos.length;i++){
					// generate the condition statement
					var tmp =_arrCbos[i].cbo.BuildCondition();
					if (tmp!=null){
						s+=tmp;
					}
					
				}
				var params={
					selection:s,
					method:EnumWSPNConfig.GETCONFIGURATOR,
					pId:_mId,
					cbo:args,
					action:EnumPNConfigAction.UPDATE
				}
				
				this.GetPNConfigSelectionsResult(params);
				
			},
			PostUpdateAction:function(params){
				var cbo = params.cbo;
				//if (cbo) {
				//	cbo.collapse();
				//	cbo.focus();
				//}
				
				if (params.action == EnumPNConfigAction.RESET) {
					// clear cbo value
					for (var i = 0; i < _arrCbos.length; i++) {
						//_arrCbos[i].cbo.GetCboComp().clearValue();
						_arrCbos[i].cbo.ClearValue();
					}
				}
				

			},
			Update:function(results,params){
				// after successfully received jason result, update appropriate dropdown
				var jsonResult = Ext.util.JSON.decode(results);
				if (jsonResult){
					for (var j=0;j<jsonResult.root.partAttribute.length;j++){
						for (var i=0;i<_arrCbos.length;i++){
							if (_arrCbos[i].cbo.GetAttributeNameId()==jsonResult.root.partAttribute[j].attributeNameId){
								
								_arrCbos[i].cbo.Update(jsonResult.root.partAttribute[j]);
								
							}
						}
					}
					// update ordering table
					_tblOrderMgr.BuildOrderTable(params.selection);
					//PNConfig.CloseWindow();
					
					_delayTask.delay(50, this.PostUpdateAction, this,[params]);
				}
			},
			InitPNConfigPanel:function(action){
				// call at startup to build pn config drop down panel
				
				_traceLog.log("Init dropdown panel service...");
				var params={
					selection:'',
					method:EnumWSPNConfig.GETCONFIGURATOR,
					pId:_mId,
					action:action
				}
				
				this.GetPNConfigSelectionsResult(params);				
			},
			ShowPNPanel:function(){
				var pnl = Ext.get('containerPNConfig');
				pnl.setVisible(true,{
					endOpacity:1,
					easing:'easeOut',
					duration:1
				});
				
				_traceLog.log("Displaying dropdown panel...");
				
				//_tblOrderMgr.ShowCartButtons();
			},
			ResetPNConfigPanel:function(){
				PNConfig.ShowWindow('Resetting Part Number Configurator...');
				this.InitPNConfigPanel(EnumPNConfigAction.RESET);
			},
			InitPNConfigPanelResult:function(results,params){
				var tplSingle = new Ext.Template(_templateSingle);
				tplSingle.compile();
				var tplRange = new Ext.Template(_templateRange);
				tplRange.compile();
				
				
				
				_tblOrderMgr.BuildOrderTable('');
				//PNConfig.CloseWindow();
				
				//figure out how many rows we have and build the initial layout
				var jsonPNConfig = Ext.util.JSON.decode(results);	

				var partAttribute = jsonPNConfig.root.partAttribute;
				
				// build drop down layout based on # of part attributes returned				
				for (var i=0;i<partAttribute.length;i++){
					if (partAttribute[i].objectType=="Range_Column__PN_Config"){
						tplRange.append(_container.id,{
							label:partAttribute[i].aName,
							cbo_left:'<div id="cbo_left_'+i+'" style="float:left"></div>',
							cbo_right:'<div id="cbo_right_'+i+'" style="float:left"></div>',
							to:'To',
							unit:partAttribute[i].unit
						});					
					}
					else if (partAttribute[i].objectType=="Single_Column_PN_Config"){
						tplSingle.append(_container.id,{
							label:partAttribute[i].aName,
							cbo:'<div id="cbo_single_'+i+'" style="float:left"></div>',
							unit:partAttribute[i].unit
						});
													
					}
				}
				
				var j=0;
				for (var i = 0; i <partAttribute.length; i++) {
					if (partAttribute[i].objectType == "Range_Column__PN_Config") {
					    
						var cboLeft = new PNConfigCombo('cbo_left_'+i,_mId,i,partAttribute[i]);
						cboLeft.Build();
						this.Add({
							id:cboLeft.GetId(),
							cbo:cboLeft.GetCbo()
						});
						
						var cboRight = new PNConfigCombo('cbo_right_'+i,_mId,i,partAttribute[i]);
						cboRight.Build();
						this.Add({
							id:cboRight.GetId(),
							cbo:cboRight.GetCbo()
						});
					}
					else if (partAttribute[i].objectType == "Single_Column_PN_Config") {
						var cboSingle = new PNConfigCombo('cbo_single_'+i,_mId,i,partAttribute[i]);
						cboSingle.Build();
						this.Add({
							id:cboSingle.GetId(),
							cbo:cboSingle.GetCbo()
						});
					}
				
				}
	
				var btn = new Ext.Button({
					renderTo:'pnlBtnReset',
					text:'Reset'

				})
	
				btn.on('click',this.ResetPNConfigPanel,this);
	
				_delayTask.delay(50,this.ShowPNPanel,this);								
							
			}
		}
	}


   
   	function PNConfigCombo(idCbo,mId,idx, jsonResult){
		var _idCbo=idCbo;
		var _mId=mId;
		var _idx=idx;
		var _jsonResult=jsonResult;
		var _cbo;
		var _objectType;
		var _attributeNameId;
		var _sign;
		var _overlayCombo;
		return{
			
			OnCboSelect:function(){
				// do somthing when an entry is selected
				// when customer select an entry, call the cboMgr to update the rest of the combo
				//alert('select clicked')
				try{
					PNConfig.ShowWindow('Updating Part Number Configurator...');
					
					if (_objectType==EnumCboObjectType.SINGLE){
						
					   this.UpdateCboSelectLayout();
					}
				
					//_overlayCombo.applyStyles('position:absolute');
					
					
					_delayTask.delay(50, _cboMgr.BuildCondition, _cboMgr,[_cbo]);
					
				}
				catch(e){
					PNConfig.CloseWindow();					
				}
				//_delayTask.delay(1000,_cbo.focus);
				
			},
			BuildCondition:function(){
				var s="";
				var currSelection=_cbo.getValue();
				if (currSelection.length>0){
					if (_objectType==EnumCboObjectType.RANGE){
						
//	var _templateRangeCondition="AND a.partNumberId in (select distinct partNumberId from partConfigAttribute_new PARTCONFIGATTRIBUTE_NEW{0} where (attributeNameId={1} and attributeValue {2} cast('{3}' as Numeric(10,2)) )) ";
//	var _templateSingleCondition="AND a.partNumberId in (select distinct partNumberId from partConfigAttribute_new PARTCONFIGATTRIBUTE_NEW{0} where (attributeNameId={1} and attributeValue = {2} )) ";
						
						
						s= String.format(_templateRangeCondition,_idCbo,_attributeNameId, _sign,currSelection,_mId);
					}
					else if (_objectType==EnumCboObjectType.SINGLE){
						s= String.format(_templateSingleCondition,_idCbo,_attributeNameId, "'"+currSelection+"'",_mId);
					}
					
					return (s==null?'':s);
				}
			},
			LoadData:function(storePNConfig, result){
			   
				
				storePNConfig.loadData(result);	
				
				storePNConfig.sort('aValue','ASC');		
						
						
				//alert(storePNConfig.data.items.length);		
				// mark the only item as the selection if object type==range
				// and nothing is selected
				var autoSelectCombo = ( storePNConfig.data.items.length==1 && _cbo.getValue()=="")?1:0;
				
				// add  -select- record
				
				storePNConfig.add(new Ext.data.Record({
						attributeNameId:'-1',
						aValue:'-select-'
					})
				)
				
				
				if (autoSelectCombo==1){
					_cbo.setValue(storePNConfig.data.items[0].data.aValue)
				}
				
			},
			Build:function(){

				_objectType=(_jsonResult.objectType=="Range_Column__PN_Config"?EnumCboObjectType.RANGE:EnumCboObjectType.SINGLE);				
	
			    var store = new Ext.data.Store({
					reader:new Ext.data.JsonReader({
						root:'attribValue'
					},[
						{name:'attributeNameId'},
						{name:'aValue', type:((_objectType==EnumCboObjectType.RANGE)?'float':'auto')}
						//{name:'aValue', type:'float'}
					])
			    });
				
//, type:'int'

				this.LoadData(store,_jsonResult);
				
		

				var cbo = new Ext.form.ComboBox({
			        store: store,
			        displayField:'aValue',
					typeAhead: true,
			        mode: 'local',
			       
			        triggerAction: 'all',
			        emptyText:'-select-',
					selectOnFocus:true,
					readOnly:true,
					renderTo:_idCbo

					
			    });		

								
				_overlayCombo= Ext.get(_idCbo).createChild({
					tag:'div',
					id:'cbo_overlay_'+_idCbo,
					clas:'x-form-text x-form-field x-form-empty-field',
					style:'background:#ffffff;position:absolute'
				})
				
				cbo.on('select',this.OnCboSelect,this);

				_attributeNameId = _jsonResult.attributeNameId;
				if (_idCbo.indexOf('cbo_right')>-1){
					_sign = "<=";					
				}
				else if (_idCbo.indexOf('cbo_left')>-1){
					_sign=">=";
				}
				else if (_idCbo.indexOf('cbo_single')>-1){
					_sign="=";
				}

				if (_objectType==EnumCboObjectType.SINGLE){
					
					if (Ext.isIE)
						cbo.setWidth(345);
					else if (Ext.isSafari )
	 					cbo.setWidth(382);
					else if (Ext.isMac)
	 					cbo.setWidth(425);
					else if (Ext.isOpera)
					    cbo.setWidth(342);
					else
	  					cbo.setWidth(352);
	
				}

				_cbo = cbo;
								
			},
			GetId:function(){
				return _idCbo;
			},
			GetCbo:function(){
				return this;
			},
			GetAttributeNameId:function(){
				return _attributeNameId;
			},
			GetCboComp:function(){
				return _cbo;
			},
			Update:function(jsonResult){
				// update drop down based on json resultset	
				
				
				this.LoadData(_cbo.store,jsonResult);
				
				//modify by leon on 3/11/08
		        //override default expanded event
				if (_cbo.store.data.items.length>0){
					_cbo.collapse();
					//alert('test');
					//since store already have in -select--
					 if (_objectType == EnumCboObjectType.SINGLE && _cbo.store.data.items.length==2) {
					 
						this.UpdateCboSelectLayout();
					 }
					
					
				}
				
			},
			
			ClearValue:function(){
				_cbo.clearValue();
				_overlayCombo.setVisible(false);
			},
			
			//replace combo strange html mark-up
			UpdateCboSelectLayout:function(){
				var cboValue = (_cbo.getValue()==" ")?'-select-':_cbo.getValue();
				_overlayCombo.update(cboValue);
				var box = _cbo.getBox();
				_overlayCombo.setBox({
							x:box.x+2,
							y:box.y+2,
							width:box.width-3,
							height:box.height-5
				});
				_overlayCombo.setVisible(true);
			
		    }
			
		};
		
	}
   
   	var InitPNConfig=function(){
		var saveContent= Ext.get("saveContent");
		var mId = saveContent.getAttributeNS('','mid');
		var lang = saveContent.getAttributeNS('','lang');
		var email = saveContent.getAttributeNS('','email');
		var prodType = saveContent.getAttributeNS('','prodType');
		var labelId = saveContent.getAttributeNS('','labelId');
		
		_tblOrderMgr = new TblOrderMgr(mId,lang,prodType,email,labelId);
		_cboMgr=new CboMgr(mId,lang,prodType,email,labelId,_containerPNConfig,_tblOrderMgr);  		  		  		  		  

		
	}
   
    return {
		ShowWindow:function(msg){
			if (msg){
				//_configMsg.msg=msg+'<br>'+(new Date()).format('n/j/Y, g:i:s:u a');
				_configMsg.msg=msg;
			}
			_win.show(_configMsg);			
		},
		CloseWindow:function(){
			if (_win) {
				_win.hide();
			}			
		},
		UpdateWindowMsg:function(msg){
			if (_win){
				//_win.updateText(msg+'<br>'+(new Date()).format('n/j/Y, g:i:s:u a'));
				_win.updateText(msg);
			}
		},		
        init : function(){
			// when document is loaded, call ws to pull up pim data so that we know how many
			// drop down to build
			// and then bring the full order table by default when no selection is made
			_containerPNConfig = Ext.get("containerInner");
			
			_traceLog.log("PN Config starts...");
			
			
			if (_containerPNConfig){
				this.ShowWindow('Initializing Part Number Configurator...');
				InitPNConfig();
				// build part config panel
				_cboMgr.InitPNConfigPanel(EnumPNConfigAction.INIT);
				//BuildPanelCNConfig();
				
				//var indicator=Ext.get('indicator');
				
				//indicator.update('');
				
				
				
				
				
			}

			 
        },
		UpdatePNConfigPanel:function(results,params){
			_cboMgr.Update(results,params);
		},
		BuildConfiguratorOrderTable:function(results, params){
			_tblOrderMgr.BuildConfiguratorOrderTable(results,params);
		},
		InitPNConfigPanelResult:function(result,params){
			_cboMgr.InitPNConfigPanelResult(result,params);
		}
		
     }
}();

Ext.onReady(PNConfig.init, PNConfig,true);	 