 /**
 * @author Ishtiaque Shahrier
 * @version 1.0
 * @Company Terracor Business Solutions
 */
var $D = YAHOO.util.Dom;
var $E =  YAHOO.util.Event;	
var $C = YAHOO.util.Connect;

var TERRACOR = {};

/*************************************************************
UTILITY FUNCTIONS
*************************************************************/
TERRACOR.util = (function(){	

	return {		

		/**set attribute to an element**/
		setAttribute : function(el,name,value){
			 var attribute = document.createAttribute(name);
  			 attribute.nodeValue = value;
			 el.setAttributeNode(attribute);
			 return el;
		},	
				
		/**create a html element (div/span) instantle with styling info and content**/
		createHTMLEl : function(htmlElName,parentId,elID,cssClass,innerHtml){
			var newEl = document.createElement(htmlElName);								
			if(elID) this.setAttribute(newEl,"ID",elID);
			if(cssClass) this.setAttribute(newEl,"class",cssClass);
			if(innerHtml) newEl.innerHTML = innerHtml;				
			$D.get(parentId).appendChild(newEl);				
			return newEl;
		},	
							
		/**capture a form submission**/
	   captureFormSubmission : function(formID,urFunction){
	   		$E.on(formID,"submit",function(e){
				$E.stopEvent(e);				
				 urFunction() ? $D.get(formID).submit() :  false;					
			});				
	   },
	   
	   /**insert a hidden input anywhere on the document**/		   
	   newHiddenInput : function(id,value,parentId){
	   	
	   	   var newHdnEl = document.createElement('input');			   
		   this.setAttribute(newHdnEl,"type", "hidden");
		   this.setAttribute(newHdnEl,"value", value);
		   this.setAttribute(newHdnEl,"id", id);
		   $D.get(parentId).appendChild(newHdnEl);
		   return newHdnEl;			   		   
	   },
	   
	   /**Trims strings ; both left and right**/
	   trim  : function(str){
			return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
	   },
	   
	   /**Empty a html list/select**/
	   emtryList : function(listId){
	   		var target = $D.get(listId);
			while(target.options.length>0){
				target.options[0]=null;
			}
			return target;
	   },
	   
	   /**Add an option to a list**/
	   addOptionToList: function(listId,optionObj){
			var new_   = document.createElement('option');			
			new_.text  = optionObj.TEXT;
			new_.value = optionObj.VALUE;			
			var target = $D.get(listId) ;
			if(target){
				try {
					target.add(new_,null);
				}
				catch(ex){
					target.add(new_);
				}
				return target;
			}else{
				alert('Select element not found');
				return -1;
			}
	   },
	   
	   /**remove an Option from a list**/
	   remOptionFromList: function(listId,index){	   	
	   		var list = document.getElementById(listId);
	   		if(list){
		   		var i = index || list.selectedIndex;	   		
		   		return i>=0 ? function(){
		   			list.options[i] = null ;	
		   			return true;
		   		}(): false;
	   		}else{
	   			alert('Select element not found');
	   			return false;
	   		}
	   },
	   /**get selected list otem**/
	   getSelectedListItem:function(listId,useThisIndex){
	   		var list = document.getElementById(listId);	   		
	   		if(list){
	   			var index= useThisIndex || list.selectedIndex;
	   			if(index>=0){
		   			return {
		   				'INDEX':index,
		   				'TEXT' :list.options[index].text,
		   				'VALUE':list.options[index].value	
		   			};
	   			}
	   			else{
	   				return null;
	   			}
	   		}else{
	   			alert('Select element not found');
	   			return null;
	   		}
	   },
	   /**update a list option by val or index**/	   
	   updateOption : function (listId,opt/*{INDEX:x,VALUE:'val',TEXT:'txt'}*/){		
			var listElement =null ;	
			try{
			 listElement  = $D.get(listId);
			}catch(ex){
				alert("List not found");
				return null;
			}			
			//at this point listElement!=null
			var index = -1 ;
			if(opt && listElement.options.length>0){		
				 opt.INDEX ? index = opt.INDEX : function(){
																var i=0;
																while(i<listElement.options.length){
																	var option = listElement.options[i];
																	if(option.value==opt.VALUE){
																		index=i;
																		i=listElement.options.length;					
																	}												
																	i++;
																}			
															}();
				index>=0 ? function(){
					listElement.options[index].value = opt.VALUE;
					listElement.options[index].text  = opt.TEXT;			
				}()   : alert('Index not found'); 															
		    }
			//finally update if index was supplied or found			
			else	alert("Invalid param supplied");
		
	   },
	   toString : function(o,output){
	   		var aReturn = YAHOO.lang.JSON.stringify(o);
			if(output==1)document.write(aReturn);
	   		return aReturn;
	   },
	   /**wrong naming use parse json...samea as this**/
	   toJson:function(o,output){
	   		var aReturn = YAHOO.lang.JSON.parse(o);
			if(output==1)document.write(aReturn);
	   		return aReturn;
	   },
	   parseJson:function(o,output){
	   		var aReturn = YAHOO.lang.JSON.parse(o);
			if(output==1)document.write(aReturn);
	   		return aReturn;		
	   },
	   /**if an item is in array : type sensitive**/
	   isInArray :function (needle,haystack)  {
            var found = false;	        
	        for (var i=0; i < haystack.length && !found; i++){
	            if (haystack[i] === needle) {
	                found = true;
	            }
	        }        	
        	return found;
	  }
		
	}

})();

/*************************************************************
FORM VALIDATOR - Required Field
@TODO : show which fields are missing
*************************************************************/
TERRACOR.simpleRequiredFieldValidator = (function(){
	
	var $D = YAHOO.util.Dom;
	var $E = YAHOO.util.Event;
	

		
	var _isAjaxSubmit = true;	
	var _invalidFields = new Array();
	var _validationErrorOccurred = false;
	var _errorMsg = "You must enter all required information";
	
	var _ajxCfg ;//ajax configuration
	var _vldCfg;//validation configuration
	
	function _validateForm(){			
		
		var els = $D.getElementsBy (function(el){
			return el.id==_vldCfg.RequiredFieldID;
		},'input', _vldCfg.FormID);		
		
		var loop=0;		
		_validationErrorOccurred = false ;		
				
		$D.replaceClass(els,_vldCfg.InvalidFieldCssClass,_vldCfg.ValidFieldCssClass);
		
		for(loop;loop<els.length;loop++){			
			var el     = els[loop];
			var value  = el.value;					
			if(value.length<=0){
				_validationErrorOccurred	= true ;
				_invalidFields.push(el);				
			}					
		}
		
		return  _validationErrorOccurred ? function(){
			$D.replaceClass(_invalidFields, _vldCfg.ValidFieldCssClass, _vldCfg.InvalidFieldCssClass);
			$D.get(_vldCfg.ErrorDisplayID).innerHTML = _errorMsg;
			if (_vldCfg.ShowPopUp)	alert(_errorMsg);
			return false;//required values(s) missing ; do not submit form
		}
		() : function(){
					$D.get(_vldCfg.ErrorDisplayID).innerHTML = ''
					return _nowSubmit();
				}();
		
	}

	function _nowSubmit()	{
		
		if(_isAjaxSubmit){
			YAHOO.util.Connect.setForm($D.get(_vldCfg.FormID)); 			
			YAHOO.util.Connect.asyncRequest(_ajxCfg.METHOD, _ajxCfg.SURL, _ajxCfg.CALLBACK); 						
 		    return false;//the util.captureFormSubmission wont submit
		}else return true;//submission will be taken care by the util.captureFormSubmission 			
	}	
	
	return function(){		
	    
		this.setValidationCfg =  function(vldCfg){
			_vldCfg	= vldCfg;							
			$TU.captureFormSubmission(_vldCfg.FormID,function(){	
				return  _validateForm();										
			});			
		}
		this.setGenericErrMessage = function(msg){
			_errorMsg = msg;
		}
		this.submitViaAjax = function(ajxCfg){
			if (ajxCfg) {
				_ajxCfg = ajxCfg;
				_isAjaxSubmit = true;
			}else{
				_isAjaxSubmit = false;
			} 
		}		
	}
})();

/****************************************************************************************************************
 * AJAX FAVORITE
 * @TODO : QUEUE UP MULTIPLE AJAX REQUEST OR DETECT IF A AJAX REQUEST IS ALREADY IN PROGRESS (THEN NOTIFY USER)
 * @TODO : write functions to give the users the ability to change change stexts and ftexts
 *****************************************************************************************************************/
TERRACOR.ajaxFav = (function(){
	
	/**OPTIMIZED FOR ZECKOSHOP VERSION 1.0**/
	var $E = YAHOO.util.Event;
	var $D = YAHOO.util.Dom;
	/**USING CHECKBOXES??**/
	var UsingCheckBoxes = true;
	
	/**MSGS TO BE SHOWN UPON REQUEST SUCCESS OR FAILURE**/
	var stext_rem = "Successfully removed from favorite list.";//remove success message
	var ftext_rem = "Could not remove from favorite list.";//remove failure msg
	
	var stext_add = "Successfully added to your favorite list.";//add success msg
	var ftext_add = "Could not add to your favorite list.";//add failure msg	
	/*
	 * The following variables can be dynamically initialized depending on the site's nature'
	 * For this site they are known and static
	 */	
	var AddPartToWLID ;//= {{$DetailedWishLists[0].ID}};
	
	var AddPartToWLQty =1;//assumed
	var AddPartToWLComment='';//none	
	
	/*REQUIRED BY SENDING REQUESTS*/
	var requestTimeOut = 5000;//after 5 seconds ajax request will be aborted
 	var method = "POST";//default http request method
	var serverSideHandler = "index.php?link=processAjaxRequest";//requires zs db entry; this is for adding	
	var ajaxIdentifier = "&ajaxAddRemoveFavItems=1";//..the incoming request is an ajax add/rem to fav request
	/*the callback for ajax*/
	var favVallback ;
	/*
	 * The following function sends the "REMOVE FROM FAVORITE " request using yui connection utility
	 */
	function sendRemoveRequest(DelPartToWLPN,DelPartToWLWH){
		var params = "&rmWLWH="+DelPartToWLWH+"&rmWLPN="+DelPartToWLPN+"&rmWLID="+AddPartToWLID;
		favVallback.argument = {PART_NUM :	DelPartToWLPN , sTEXT:stext_rem , fTEXT:ftext_rem};
		favVallback._showProgress();				
		YAHOO.util.Connect.asyncRequest(method, serverSideHandler, favVallback, ajaxIdentifier+params); 
	}
	/*
	 * The following function sends the "ADD TO FAVORITE " request using yui connection utility
	 */	
	function sendAddRequest(AddPartToWLPN,AddPartToWLWH){	
		var params = "&AddPartToWLPN="+AddPartToWLPN+"&AddPartToWLWH="+AddPartToWLWH+"&AddPartToWLID="+AddPartToWLID+"&AddPartToWLQty="+AddPartToWLQty+"&AddPartToWLComment="+AddPartToWLComment;
		favVallback.argument = { PART_NUM : 	AddPartToWLPN , sTEXT:stext_add , fTEXT:ftext_add};
		favVallback._showProgress();				
		YAHOO.util.Connect.asyncRequest(method, serverSideHandler, favVallback, ajaxIdentifier+params); 
	}		
	/*
	 * The call back configuration
	 */
	function _buildCallback(){
		favVallback = {
			
			_onSuccess      : function(o){},
			_onFailure      : function(o){},
			_onRequestAbort : function(){alert("Timeout occurred.Request aborted.");},
			_onAjaxRequestFailure : function(){alert("Async request could not be sent.");},
			_hideProgress   :function(){},
			_showProgress   :function(){},
			
			success: function(o){
				favVallback._hideProgress();
				
				if (o.responseText != "0") {
					favVallback._onSuccess({
						TEXT: o.argument.sTEXT,
						PART_NUM: o.argument.PART_NUM
					
					});
				}
				else {
					favVallback._onFailure({
						TEXT: o.argument.fTEXT,
						PART_NUM: o.argument.PART_NUM
					});
					
				}
			},
			failure: function(){
				favVallback._hideProgress();
				favVallback._onAjaxRequestFailure();
			},
			timeout: requestTimeOut,
			customevents: {
				onAbort: function(){
					favVallback._hideProgress();
					favVallback._onRequestAbort();
				}
			}
		}
	}

	function _init(wishListId){

		AddPartToWLID = wishListId;
		//parepare the callback object
		_buildCallback();
		//check or uncheck the checkbox on page load	
		 if(UsingCheckBoxes){
			$E.onDOMReady(
				function (e){
					
					checkBoxCallBack = {
						success:function(o){
						var rText = o.responseText;
							if(rText != "0"){
								try{
									var items = YAHOO.lang.JSON.parse(rText);
									var i = 0;
									for(i;i<items.length;i++){
										var id = items[i]['pn']+"|"+items[i]['wh'];
										var el = $D.get(id)	;							
										if(el)	el.checked=true;							
									}
									
								}catch(ex){}	
							}
						},
						failure:function(){
							return false;
						},
						timeout: 5000
			
					};
					YAHOO.util.Connect.asyncRequest('POST', serverSideHandler, checkBoxCallBack, "&getWishlistItems=1&wlid="+AddPartToWLID);
				}	
			);
		}
	}
			
	return function(wishListId){		

		_init(wishListId);			
		/**
		 * Adds/removes an item to the wishlist/favourite list (use this function for checkboxes)
		 **/	
		this.addRemoveFav = function (self){
			//element is checkbox
			if(self && self.type=="checkbox"){			
				if(self.id){				
					var infos = self.id.split("|");
					self.checked==true ?   this.addToFav(infos[0],infos[1]) : this.delFromFav(infos[0],infos[1]);				
				}	
			}								
		}
		/**
		 * Adds an item to the wishlist/favourite list
		 **/	
		this.addToFav  = function (AddPartToWLPN,AddPartToWLWH){
			sendAddRequest(AddPartToWLPN,AddPartToWLWH);
		}
		/**
		 * Remove an item fom the wishlist/favourite list
		 **/	
		this.delFromFav = function (DelPartToWLPN,DelPartToWLWH){
			sendRemoveRequest(DelPartToWLPN,DelPartToWLWH);
		}
		/**
		 * FUNCTIONS THAT CAN BE CUSTOMIZED TO RESPOND ON DIFFERENT STAGES/EVENTS
		 **/
		this.onRequestAbort = function (urFunction){
			if(typeof urFunction=='function' ) favVallback._onRequestAbort=urFunction;			
		}
		this.onAjaxRequestFailure = function (urFunction){
			if(typeof urFunction=='function' ) favVallback._onAjaxRequestFailure=urFunction;					
		}
		this.onSuccess = function (urFunction){
			//an invisible response object will be passed along with your function 
			//with the following information /*o.TEXT,o.PART_NUM*/
			if(typeof urFunction=='function' ) favVallback._onSuccess=urFunction;
		}
		this.onFailure = function (urFunction){
			//an invisible response object will be passed along with your function 
			//with the following information /*o.TEXT,o.PART_NUM*/
			if(typeof urFunction=='function' ) favVallback._onFailure=urFunction;
		}
		this.showProgress = function (urFunction){
			if(typeof urFunction=='function' ) favVallback._showProgress=urFunction;		
			/*hide progress bar/animation*/			
		}
		this.hideProgress = function (urFunction){
			if(typeof urFunction=='function' ) favVallback._hideProgress=urFunction;			
			/*hide progress bar/animation*/		
		}
	}
})();

/************************************************************************************
 * SIMPLE TOGGLER
 *************************************************************************************/
TERRACOR.simpleToggle = (function(){

	var toggleEls ;
	var $D = YAHOO.util.Dom;
	var $E =  YAHOO.util.Event;	
	function _toggle(associatedIndex){
		
		var el = toggleEls[associatedIndex].ELREF;
		
		if (el.style.visibility == 'hidden') {
			el.style.height = toggleEls[associatedIndex].HEIGHT;
			el.style.width =  toggleEls[associatedIndex].WIDTH;
			el.style.visibility = 'visible';
		}
		else {				
			el.style.height = '0px';
			el.style.width =  '0px';
			el.style.visibility = 'hidden';
		}
	}
	
	function _addToToggler(el,ownerID, eventName){
		var elementID = el.id;
		if (el) {
			toggleEls[elementID] = {
				"ELREF": el,
				"HEIGHT": el.style.height,
				"WIDTH" : el.style.width,
				"OWNERID":ownerID
			}
			$E.on(ownerID, eventName, function(e){
				$E.stopEvent(e);
				_toggle(elementID);
			});
		}else throw new Error("Element for toggoling not found");
	}
	
	return function(){
		toggleEls = new Array();
		/**show hide an element**/
		this.addElementToToggler = function(elementID, ownerID, eventName){
			var el = $D.get(elementID);
			_addToToggler(el, ownerID, eventName);
		}
		/**show hide an elements**/
		this.addElementsToToggler = function(className, ownerID, eventName, containerID/*p*/){
		
			$D.batch($D.getElementsByClassName(className, null, containerID), function(el){
				_addToToggler(el, ownerID, eventName);
			});
		}
	}
})();

/**************************************************************************************
 * LIST POPULATOR
 *************************************************************************************/
TERRACOR.populateList = (function(){
		
	var $D = YAHOO.util.Dom;
	var $E = YAHOO.util.Event;
	var $U = TERRACOR.util;
	
	var _dependent ;
	var _sUrl;
	
	
	function _populateTargetList(targetListId,trigerrerId,_ajxCfg){
		
		
		var target = $U.emtryList(targetListId);
		
		var param  = typeof _ajxCfg.PARAM==='undefined' ? 
			function(){
				alert('Request Param Missing');return ;
			}() 
			:  
			typeof _ajxCfg.PARAM==='function' ? _ajxCfg.PARAM() 
				: 
				_ajxCfg.PARAM.charAt(_ajxCfg.PARAM.length-1)=='=' ? 
				_ajxCfg.PARAM+$D.get(trigerrerId).value 
				: 
				_ajxCfg.PARAM;
			;
		
		YAHOO.util.Connect.asyncRequest('POST', _sUrl, 
			{
				success:function(o){							
						try{
							var jsonData = YAHOO.lang.JSON.parse(o.responseText);							
							for(var i=0;i<jsonData.length;i++){															
								$U.addOptionToList(targetListId,{
									'TEXT':jsonData[i][_ajxCfg.TEXT],
									'VALUE':jsonData[i][_ajxCfg.VALUE]
								});}
						}
						catch(ex){//alert(ex);
						}	
				},
				failure:function(o){
					alert('failure');	
				},
				customevents:{
					onAbort:function(o){
						alert('aborted');
					}
				},
				timeout:5000
			},
			param
		);
		
		target.options.length==0 ?  _resolveDependencies(targetListId) : false;						
	
	}
	function _resolveDependencies(listId){
		var me =  eval("_dependent."+listId);
		me==undefined ?  false : function(){
			for(var i = 0;i<me.length;i++){
				$U.emtryList(me[i]);
				_resolveDependencies(me[i].ID);				
			}	
		}();
		
	}
    return function(sUrl){    	
	   	_dependent = {};
		_sUrl = sUrl;
		
		this.ajaxListPopulate = function(trigerrerId, targetListId, ajxCfg){								
   			eval("_dependent."+trigerrerId+"== undefined") ? eval("_dependent."+trigerrerId+" = new Array()"):false;
			eval("_dependent."+trigerrerId+".push(targetListId)");				
		
			if($D.inDocument(trigerrerId) && $D.inDocument(targetListId)){				
				if($D.get(targetListId).type=="select-one"){				
					var trigerrer = $D.get(trigerrerId);	   											   		
					if (trigerrer.type == 'select-one') {		   										
				   		$E.on(trigerrerId,'change',function(e){
							 var selectedValue  = trigerrer[trigerrer.selectedIndex].value;
							 _populateTargetList(targetListId,trigerrerId,ajxCfg)	;							
							}
						);		
					}
				}
				else throw new Error("Target must be a html select");					
			}
			else throw new Error('Control with spefied id is not found.');					 
		}
		
		this.checkDataBinding = function(elId){			
			$U.toString(_dependent,1);
		}
	}	   	
})();

/**************************************************************************************
 * SIMPLE ANIMATION COLLECTION
 *************************************************************************************/
TERRACOR.animation = (function(){

    D = YAHOO.util.Dom;
    E = YAHOO.util.Event;
	EASE_OUT   = YAHOO.util.Easing.easeOut;
	EASE_IN   = YAHOO.util.Easing.easeIn;
	BOUNCE_OUT = YAHOO.util.Easing.bounceOut;   
	BOUNCE_IN = YAHOO.util.Easing.bounceIn;
    return function(){
	
		this.fadeOutInLoop = function(id){
			var fadeAnim = new YAHOO.util.Anim(id);
			fadeAnim.duration = 1.5;
			fadeAnim.method = EASE_OUT;
			var fadeAnim2 = new YAHOO.util.Anim(id);
			fadeAnim2.duration = 1;
			fadeAnim2.method = EASE_OUT;
			E.on(id, 'mouseout', function(){
				fadeAnim.stop();
				var frm = fadeAnim.getAttribute('opacity');
				fadeAnim2.attributes.opacity = {
					from: frm,
					to: 1
				};
				fadeAnim2.animate();
			});
			E.on(id, 'mouseover', function(){
				fadeAnim2.stop();
				var frm = fadeAnim2.getAttribute('opacity');
				fadeAnim.attributes.opacity = {
					from: frm,
					to: 0
				};
				fadeAnim.animate();
			});
			
		}
		
		this.flash = function(id,duration,startImmidiately){
			
			var flashAnimStart = new YAHOO.util.Anim(id);
			flashAnimStart.duration = duration || .2;
			flashAnimStart.method = EASE_OUT;
			flashAnimStart.attributes.opacity = {				
				to: 0
			};
			var flashAnimReverse = new YAHOO.util.Anim(id);
			flashAnimReverse.duration = duration || .2;
			flashAnimReverse.method = EASE_OUT;			
			flashAnimReverse.attributes.opacity = {				
				to: 1
			};			
			flashAnimStart.onComplete.subscribe(function(){
				flashAnimReverse.animate();
			});
			
			var keepFlashing = true;
			flashAnimReverse.onComplete.subscribe(function(){
				keepFlashing ? flashAnimStart.animate() : flashAnimReverse.stop();
			});
			startImmidiately ? E.onDOMReady(function(){
				flashAnimStart.animate();
			})():{};
			return new function(){
				
				this.start = function(){
					keepFlashing = true;
					flashAnimStart.animate();
				}
				this.stop = function(){
					keepFlashing = false ;
					flashAnimStart.stop();
					
				}

			}
			
		}
		
		this.zoomer = function(id,config){
			var anim =  new YAHOO.util.Anim(id);
			
			anim.duration = .5;
			anim.method = EASE_OUT;
			
			var origWidth  = D.getStyle(id,'width').replace(/px/,"");
			var origHeight = D.getStyle(id,'height').replace(/px/,"");
			
			var increaseWidthBy  =  config ? config.widthBy  || 0.70 : 0.70;
			var increaseHeightBy =  config ? config.heightBy || 0.70 : 0.70;
			anim.attributes.width = {				
				by:origWidth*increaseWidthBy,
				unit:'px'
			};
			anim.attributes.height = {				
				by :origHeight*increaseHeightBy,
				unit:'px'
			};
			var anim2 =  new YAHOO.util.Anim(id)
			anim2.duration = .5;
			anim2.method = EASE_OUT;
			anim2.attributes.width = {				
				to: origWidth,
				unit:'px'
			};
			anim2.attributes.height = {				
				to: origHeight,
				unit:'px'
			};			
			
			E.on(id, 'mouseover', function(){
				anim.animate();
			});
			E.on(id, 'mouseout', function(){
					anim.stop();
					anim2.animate();
			});
	 }
	 
	 this.blinkIn   = function(owner,elid,config){
	 	
		var fadeIn  = new YAHOO.util.Anim(elid);
	 	var fadeOut = new YAHOO.util.Anim(elid);
		var loop    = config.blinkTimes || 5;
		loop%2==1 ? loop++:loop;
		var looped    = 0;

		fadeOut.duration = config.animDuration || .3;
		fadeIn.duration  = config.animDuration || .1;
		fadeOut.method   = EASE_IN;
		fadeIn.method    = EASE_IN;
		
		fadeIn.attributes.opacity = {			
			to  : 1
		};
		fadeOut.attributes.opacity = {
			to  : 0
		};
		
		fadeIn.onComplete.subscribe(function(){			
			loop===looped ?  
			function(){
				fadeOut.stop()
				looped = 0;
			}() 
			: fadeOut.animate();
			
		});
		
		fadeOut.onComplete.subscribe(function(){
			 looped++;
			 fadeIn.animate();
		});
		
		var evnt = config.on || 'click';
				
		E.on(owner,evnt,function(e){			
			fadeOut.animate();			
			
		});
			
	 }
	 
  }

})();
/**************************************************************************************
 * CUSTOM USER CONTROL COLLECTION
 *************************************************************************************/
TERRACOR.controls = (function(){
	
	var D = YAHOO.util.Dom;
	var E = YAHOO.util.Event;	
	var U = TERRACOR.util; 
	var A = new TERRACOR.animation;
	
	return function(){		
		
		this.scroll_pane = function(divId, config){
			
			var toHeight   = config.maxHeight || D.getStyle(divId, 'height').replace(/px/, "") ;
			var scrollBar  = config.scrollBars ? 'auto' : 'hidden';
			var buttonId   = D.generateId();		
			var imageId	   = D.generateId();					
			var buttonImg  = config.buttonImage || "images/scroll_button2.gif";			
			var newel      = U.createHTMLEl('div', divId, buttonId, 'scroll_pan_button', "<img  class='scroll_pan_image' id='"+imageId+"' src='" + buttonImg + "'>");
						
			D.addClass(divId, 'scroll_pan_main');
			D.setStyle(divId, 'overflow', scrollBar);
			D.insertAfter(newel, divId);
			
			var scrollAnim = new YAHOO.util.Anim(divId);
			scrollAnim.duration = 1;
			scrollAnim.method = config.effect || EASE_OUT;
			var maxHeightAttribute = {
				to: toHeight,
				unit: 'px'
			};
			var open = false;
			scrollAnim.onComplete.subscribe(function(){
				open = !open;
			});
			
			E.onAvailable(buttonId, function(e){
				var flash = A.flash(buttonId,config.animDuration || .8,false);
				E.on(imageId, 'click', function(e){
					
					if (!open) {						
						scrollAnim.attributes.height = maxHeightAttribute;
						scrollAnim.animate();						
					}
					else {
						scrollAnim.attributes.height = {
							to: 0,
							unit: 'px'
						};
						scrollAnim.animate();						
					}
				});
				
				config.animation ? function(){
					E.on(buttonId,'mouseover',function(e){
						flash.start();
					});
					E.on(buttonId,'mouseout',function(e){
						flash.stop();
					});
				}():{};
				
			});
		},
		//@TODO : get height auto,matically
		this.accordation = function(parentDivId,config){
			var processing = false;
			var selected   = {};
			var objHeights = {};
			function _showMe(me,fn){
				selected = me;
				D.replaceClass(me,'hidden','selected');				
				var height = eval('objHeights.'+me.id);
				var anim = new YAHOO.util.Anim( me,{height:{from:0,to:height},opacity:{from:0,to:1}},1,YAHOO.util.Easing.easeOut );
				anim.onComplete.subscribe(
					function(){
						processing = false;
						if(fn && typeof fn == 'function') fn();				
					}
				);
				anim.animate();				
			}
			function _hideMe(me,fn){
				var anim = new YAHOO.util.Anim( me,{height:{to:0},opacity:{from:1,to:0}},1,YAHOO.util.Easing.easeOut );	
				anim.onComplete.subscribe(
					function(){
						D.replaceClass(me,'selected','hidden');
						processing = false;	
						if(fn && typeof fn == 'function') fn();								
					}
				);
				anim.animate();	
			}
			
			function _process(lastChild,section){
				if(!processing){								
					processing = true;									
					$D.hasClass(lastChild,'hidden') 
					? 
					function(){
						function __inner(){
							var elmnt = D.getLastChild(section);												
							_showMe(elmnt);
						}							
						if(!selected.length) selected = D.getElementsByClassName('selected');
						if(selected.length){						
							_hideMe(selected);	
						}
						 __inner();						
					}()
					:
					function(){						
						var elmnt = D.getLastChild(section);					
						_hideMe(elmnt);						
					}();
				}				
				
			}
			function _init(){
				//alert('hi');
				E.onDOMReady(function(e){
					var root = D.getElementsByClassName('section','div',parentDivId );		
					D.batch(root,function(el){							
						var lastChild = D.getLastChild(el);
						eval("objHeights."+E.generateId(lastChild)+"='"+D.getStyle(lastChild,'height').replace(/px/, "")+"'");					   
						D.setStyle(lastChild,'height','0px');
						/**header click**/
						E.on(D.getFirstChild(el),'click',function(e){							
							_process(lastChild,el);
						});	
						/**button click**/
						E.on(D.getElementsByClassName('toggleButton','input',el),'click',function(e){					
							_process(lastChild,el);	
						});	
					});		
				});
			}
			
			return new function(){
				_init();

			}
		}
	}
	
})();

 


