	//===============================================================================//
    //|                               minicart.js                                    |       
    //|        Author: Faith.Yan                                                     |
    //|        Description:Provide for minicart's operation                          |
    //|        The main methods is:                                                  |
	//|	           addProToCart method : add one product to shoppingcart             |
    //|            nextItem: view next shoppingcartItem in minicart                  | 
    //|            prevItem: view previous shoppingcartItem in minicart              |
    //|            refreshMinicart: after add to cart operation , invoke this method | 
    //|                             to refresh minicart,                             |
    //|                             show current product to customer.                |   
    //|                                                                              |
	//==========================================================wo1wo=====================//
	<!--constants-->
	var MINICART_TIMEOUT=10;		
	var CAN_ADD_TIMEOUT=5;

	<!--members-->
	var minicartUrl=__ctxPath + "/cart/divMiniCart.html?decorator=blank";
	var minicartBriefUrl=__ctxPath + "/cart/divMiniCartBrief.html?decorator=blank";		
	var hasReduce=0;
	var timeoutNumber=MINICART_TIMEOUT;
	var canAddtimeoutNumber=CAN_ADD_TIMEOUT;
	var canDoAddAction=1;		
	var addEventClientX;
	var addEventClientY;	
	<!--add -->
	function fnAddProToCart(productCode,quantity,event){			
		var productInfo=fnBuildProductInfo(productCode,quantity);
		if(productInfo==""){
			return;
		}			
		if(canDoAddAction==1){			
			canDoAddAction=0;
			addEventClientX=event.clientX;
			addEventClientY=event.clientY;			
			shoppingcartDwr.addProductToCart(productInfo,fnRefreshMinicart);			
		}
	}
	function fnAddProToCartForCart(productCode,quantity){	
		var alsoBuy=document.getElementById("shoppingcartAlsoBuy");		
		var productInfo=fnBuildProductInfo(productCode,quantity);
		alsoBuy.productInfo.value=productInfo;
		alsoBuy.submit();
	}	
	<!-- refresh -->
	function fnRefreshMinicart(ret){	
		if(ret=="1"){
			fnRefreshForProductBrief();
		}else if(ret!=""){		
			canDoAddAction=1;	
			alert(fnReplace(ret));
		}		 				
	}	
	function fnRefreshForProduct(){
		var minicart=document.getElementById("wholeMinicart");
		if(minicart!=null){	
			var shopping=document.getElementById("shopping");
			shopping.scrollIntoView(); 		
			fillDivWithPage("wholeMinicart",minicartUrl);	
			setTimeout("fnMinicartTimeout()",1000);
		}	
	}	
	function fnRefreshForProductBrief(){
		var minicart_brief=$("minicart_brief");	
		if(minicart_brief!=null){
			fillDivWithPage("minicart_brief",minicartBriefUrl);
			if(canDoAddAction==0){
				fnPopupElement($("addToCartMessage"),300,100,addEventClientX,addEventClientY);
			}
		}
		canDoAddAction=1;	
	}			
	<!--next and prev-->
	function fnNextItem(){
		timeoutNumber=MINICART_TIMEOUT;
		shoppingcartDwr.nextItem(fnRefreshForProduct);
	}	
	function fnPrevItem(){
		timeoutNumber=MINICART_TIMEOUT;
		shoppingcartDwr.prevItem(fnRefreshForProduct);
	}
	<!--reduct and resume-->	
	function fnSetMinicartTimeoutNumber(num){
		timeoutNumber=num;
	}	
	function fnMinicartTimeout(){
		timeoutNumber--;
		if(timeoutNumber>0){
			setTimeout("fnMinicartTimeout()",1000);
		}else{
			fnReduceMinicart();			
		}
	}	
	function fnReduceMinicart(){
		var resumeMinicart=document.getElementById("resumeMinicart");
		if(resumeMinicart!=null){
			resumeMinicart.style.display="none";
		}		
		if($("reduceMinicart")!=null){
			$("reduceMinicart").style.display="block";	
		}

		hasReduce=1;
	}	
	function fnResumeMinicart(){
		if($("reduceMinicart")!=null){	
			$("reduceMinicart").style.display="none";		
		}
		if($("resumeMinicart")!=null){
			$("resumeMinicart").style.display="block";
		}
		hasReduce=0;
	}
	<!--build product info func-->
	function fnBuildProductInfo(productCode,_quantity){
		var codeAndQt="";
		var quantity=_quantity;
		if(quantity==null){
			quantity=1;
		}
		if(productCode!=null){
			codeAndQt="####" + productCode + "$$$$" + quantity;
		}
		if(codeAndQt==""){
			return "";
		}
		var attributes=fnBuildAttributes();
		if(attributes=="##cannotbenull##"){
			return "";
		}
		var accessories=fnGetAccessories();
		if(accessories!=null && accessories!=""){
			accessories = "%%%%" + accessories;
		}
		return attributes + accessories + codeAndQt;
	}
	/*
	 * attrs's sample as follow:
	 * custom[attrId]##attrValue||||custom[attrId]##attrValue
	 */
	function fnBuildAttributes(){
		var frm=$("productDetailFrm");
		if(frm!=null){
			var attrs="";
			var len=frm.elements.length;			
			for(var i=0;i<len;i++) 
			{ 
				var e=frm.elements[i]; 
				var name=e.name;
				if(name.indexOf("custom")==0){
					if(name.indexOf("custom_name")!=0){					
						var name=e.name;				
						var value=e.value;									
						if(value==null||value.trim()==""){	
							attr_id=name.substring(7);	
							var oCustomName=document.getElementById("custom_name_"+attr_id);
							alert(oCustomName.value+__FMT.product_varition_notnull);
							return "##cannotbenull##";
							//value="====";
						}
						if(len==1){
							attrs=attrs + name+"##"+value;
						}else{
							if(i!=len-1){
								attrs=attrs + name+"##"+value+"||||";				
							}else{
								attrs=attrs + name+"##"+value;
							}						
						}
					}
				}
			} 	   	    
			return attrs;
		}else{
			return "";
		}
	}	
	function fnGetAccessories(){
		if($("re_accessories")!=null){
        	var accessoriesIds = Form.serialize("re_accessories");
			return accessoriesIds;
		}else{
			return "";
		}
	}
	function fnReplace(val){
		var tmp=__FMT.shoppingcart_lowMembership;
		tmp=tmp.replace("####",val);
		return tmp;
	}