/**
 * @(#)orderprocess/basket.js
 *
 * Copyright 2000-2008(c) MijnWinkel B.V.
 *
 * Version 8.2.0 16-mar-2008 
 */

function getStockVal(count){
	var v=-1,n=__rowData[0];
	if(self._stc&&_stc[n]!=null)v=_stc[n];
	if(v==-1)v=fieldRaw(getStockFld());
	return(v=="*")?-1:v;
}

function header(bag){
	setNextViewType(vt_CHECKOUT);
	bag.set("s.gotocheckout","0");
	return '';
}

function validate(bag,val){
	var actionValidation=false,ok=false,msg="";
	if(self.ActionList){
		var al=new ActionList();
		while(al.hasNext()){
			al.next();
			if(al.hasPreOrderValidation&&al.hasPreOrderValidation()){
				ok=al.action.validate();
				if(!ok){
					msg=al.getValue("message");
					showAlert(msg);
					break;
				}
			}
			if(al.hasValidation&&al.hasValidation()){
				ok=al.action.validate();
				actionValidation=!ok;
				if(actionValidation)break;
			}
		}
	}
	if(msg==""&&!actionValidation){
		var ship=new ShippingList(),msg="",id=bag.get("s.order.shipping.id");
		if(bag.count("s.order","article.id")<1)msg="isempty";
		else if(ship.enabled&&ship.direct&&id=="")msg="shipping.selection";
		ok=(msg=="");
		if(ok){
			// Extra costs are already calculated. It is
			// only necessary to select the shipping type.
			ship.select(id);
			var r=new Reduction(ship);
			if(r.enabled)ok=r.valid();
		}else showAlert(m(msg));
	}
	
	if(ok&&self.CheckProductStock)ok=(new CheckProductStock()).state;
	
	return ok;
}


var releatedBuffer="";
function body(bag,columns){

 	var s='<style type="text/css">td.align-right {font: 12px arial;text-align: right;}td.align-left {font: 12px arial;text-align:left;}td.align-center{font: 12px arial;text-align: center;}</style><br><center><table width=96% class=b bgcolor="'+getColor(8)+'" border=0 cellspacing=0 cellpadding=0>';

	//Header with the order process steps.
	s+='<tr><td align="center" style="text-align:center;">';
	s+='<table cellpadding="0" cellspacing="0" border="0px">';
	s+='<tr><td rowspan="99"><img src="/pic/leeg.gif" width="10" height="1px" border="0"></td></tr>';
	s+='<tr><td colspan="9"><br>';
	s+='<table cellspacing="0" cellpadding="0"><tr><td>';
	s+='<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="'+getColor(4)+'"><b>'+m("basket.capital")+'</b></font><font face="Verdana, Arial, Helvetica, sans-serif" color="'+getColor(5)+'">';
	s+=' -> '+m("title.address");

	//Append the shipping selection step if the selection is not integrated into the basket.
	var ship=new ShippingList(),hasShippingPage=(ship.enabled&&!ship.direct);
	if(hasShippingPage&&(ship.count>1))s+=' ->&nbsp;'+m("shippingmethod");

	// preselect the shipping option.
	if(ship.enabled&&(ship.direct||ship.count==1))ship.select((ship.count==1)?"first":bag.get("s.order.shipping.id"));
	var shipc=(new ShippingBasket()).getShippingCosts(ship);

	//Append the payment method step if there are more payment methods available. 
	var pay=new PaymentMethod();
 	if((!ship.direct&&pay.count>1)||(ship.direct&&pay.count>1))s+=' ->&nbsp;'+m("paymethod");

	//The approval page is automatically enabled if the shipping page is active.
	if(hasShippingPage||hasLayout())s+='-> '+m("title.approval");
	s+='</font></td></tr></table></td></tr>';
	s+='<tr><td height="1" colspan="9" bgcolor="'+getColor(6)+'"><img src="/pic/leeg.gif" height="1" width="1" border="0"></td></tr>';
	
	//Basket 
 	if(bag.count("s.order","article.id")>0){
		s+='<tr><td>&nbsp;</td></tr>';
		s+='<tr><td>&nbsp;</td></tr>';
		s+='<tr>';
		s+='<td><img src="/pic/leeg.gif" width="5" height="1" border="0"></td>';
		s+='<td><font face="Verdana, Arial, Helvetica, sans-serif" color="#000000" size="2" style="text-align:left;"><b>'+m("article")+'</b></font></td>';
		s+='<td><img src="/pic/leeg.gif" width="10" height="1" border="0"></td>';
		s+='<td><font face="Verdana, Arial, Helvetica, sans-serif" color="#000000" size="2" style="text-align:left;"><b>'+m("desc")+'</b>&nbsp;</font></td>';
		s+='<td align="right" class="align-right" style="text-align:right;"><font face="Verdana, Arial, Helvetica, sans-serif" color="#000000" size="2"><b>'+m("nr")+'</b></font></td>';
		s+='<td align="right" class="align-right" nowrap style="text-align:right;"><font face="Verdana, Arial, Helvetica, sans-serif" color="#000000" size="2"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+m("price")+'</b></font></td>';
		s+='<td align="right" class="align-right" style="text-align:right;"><font face="Verdana, Arial, Helvetica, sans-serif" color="#000000" size="2"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+m("total")+'</b></font></td>';
		s+='<td colspan="3"><img src="/pic/leeg.gif" width="5" height="1" border="0"></td>';
		s+='<td rowspan="99"><img src="/pic/leeg.gif" width="10" height="1" border="0"></td>';
		s+='</tr>';
		s+='<tr><td colspan="9"><img src="/pic/leeg.gif" width="1" height="5" border="0"></td></tr>';
		var seperator='<tr><td colspan=9 bgcolor="#CCCCCC"><img src="/pic/leeg.gif" width="1" height="1" border="0"></td></tr>';
		s+=seperator;
		s+='<tr><td colspan="9" bgcolor="'+getColor(7)+'"><img src="/pic/leeg.gif" width="1" height="10" border="0"></td></tr>';

		var it=bag.iterator("s.order","article.id"),vatOf=new HashMap(),lt,vat,vatSum;		
		// Create a 'VAT price' per 'VAT percentage' list. The list count is used to check if the 
		// VAT should be display per order-line.		
		while(it.next())vatOf.increment(it.getNumber("vat"),it.getNumber("linetotal"))

		var totalvat=0,total=0,priceAdditional=0,weightAdditional=0,weightChoice=0;
		var line=0,v=new Valuta(),q;
		it=bag.iterator("s.order","article.id");
		while(it.next()){
		
			v.filter(it.get("price"));
			lt=it.getNumber("linetotal");
			vat=it.getNumber("vat");
			q=it.get("quantity");
			s+='<tr bgcolor="'+getColor(7)+'">';
			s+='<td><img src="/pic/leeg.gif" width="5" height="1" border="0"></td>';
			s+='<td valign=top style="text-align:left;">'+it.get("id")+'</td>';
			s+='<td><img src="/pic/leeg.gif" width="10" height="1" border="0"></td>';
			s+='<td width=40% valign=top style="text-align:left;">'+it.get("description");
			// show the VAT percentage if multipe VAT percentages are applied.
			if(vatOf.size()>1)s+=',&nbsp;'+vat+'%&nbsp;'+m("vat");
			
			if(self.getOrderFields)s+=getOrderFields(it);
			
			s+='<span style="color:red" id="line'+line+'"></span>';
			
			s+="</td>";
			s+='<td align="right" class="align-right" style="text-align:right;" valign="top">'+q+'&nbsp;</td>';
			
			if(getVatState()>0){
				s+='<td valign=top align=right class="align-right" style="text-align:right;">'+v.format(it.get("inc-vat-pricevalue"))+'</td>';
				s+='<td valign=top align=right class="align-right" style="text-align:right;">'+v.format(it.get("inc-vat-linetotal"))+'&nbsp;</td>';
			}else{
				s+='<td valign=top align=right class="align-right" style="text-align:right;">'+v.format(it.get("pricevalue"))+'</td>';
				s+='<td valign=top align=right class="align-right" style="text-align:right;">'+v.format(lt)+'&nbsp;</td>';
			}
			
			s+='<td colspan=2 valign=top class=changedel nowrap>&nbsp;&nbsp;'
			if(trim(it.get("linked_oid"))==''){
				s+='<a href="javascript:doChange('+line+',\''+it.get("cid",getCID())+'\',\''+it.get("oid",0)+'\');">'+m("change")+'</a>'+__n+__n;
				s+='<a href="javascript:doRemove('+(line++)+');">'+m("remove")+'</a>&nbsp;';
			}
			s+='</td></tr>'
			s+='<tr><td colspan="9" bgcolor="'+getColor(7)+'"><img src="/pic/leeg.gif" width="1" height="10" border="0"></td></tr>';
			total+=lt;
			totalvat+=vat*0.01*lt;
			
			// A shipping method must be pre-selected.
			shipc.add(it,q);
		}
		s+='<td><img src="/pic/leeg.gif" width="5" height="1" border="0"></td>';
		s+='</tr>';
		s+=seperator;

		var reduc=new Reduction(),space='<tr><td colspan=9>&nbsp;</td></tr>',svat=getShippingVAT();
		var align='<td colspan="3">&nbsp;</td>';
		

		// Action block
		function Action(){
			var ACTIONS="s.actions.",ACTION=ACTIONS+"action.";
			var me=this,line="";
			bag.remove("s","actions");
			me.hasVat=false;
			me.active=false;
			me.total=0;
			me.vat=0;
			me.label="";
			me.code="";
			me.hasCoupon=false;
			
			if(self.ActionList!=null){
				var al=new ActionList(),av=0,ad,avf,l=0,vat=0;
				while(al.hasNext()){
					al.next();
					if(al.enabled()){
						vat=al.getVAT();
						if(self.getExclVat)av=getExclVat(al.getAmount(),true,vat);
						else av=al.getAmount();
						avf=v.format(av);
						ad=descriptionFilter(al.getDescription());
						line+='<tr>'+align+'<td valign=top nowrap>&nbsp;'+ad+'&nbsp;</td>';
						var displayPrice=av;
						if(vat>0&&getVatState()>0)displayPrice=av+(av*0.01*vat);
						line+='<td align=right class="align-right" valign=top style="text-align:right;">&nbsp;'+v.format(displayPrice)+'&nbsp;</td></tr>';
						bag.set(ACTION+"description",ad,l);
						
						if(vat>0){
							me.hasVat=true;
							vatOf.increment(vat,av);
							me.vat+=(av*0.01*vat);
						}
						var code=al.getState("code");
						if(code)bag.set(ACTION+"code",code,l);
						
						bag.set(ACTION+"amount-inc-vat",v.format(av+(av*0.01*vat)),l);
						bag.set(ACTION+"amount",avf,l);
						bag.set(ACTION+"amountnr-inc-vat",av+(av*0.01*vat),l);
						bag.set(ACTION+"amountnr",av,l++);
					}				
				}
				me.active=al.active;
				me.total=al.getTotalAmount();
				bag.set(ACTIONS+"active",al.active);
				bag.set(ACTIONS+"total",me.total);
				bag.set(ACTIONS+"totalvat",me.vat);
				
				if(al.select&&al.select("coupon_n")){
					me.code=al.getState("code");
					me.label=al.getValue("input_label",m("discountcode"));
					me.hasCoupon=true;
				}
				
			}
			me.getLine=function(){return line};
		}
		var action=new Action();
		
		total=roundSum(total,action.total);

		//Total price block.
		s+='<tr><td colspan="7" align="right" class="align-right" style="text-align:right;"><table width="100%" border="0">';
		s+='<tr>'+align+'<td colspan="2" style="width:300px">&nbsp;</td></tr>';
	
		//Reduction line
		var reductionLine="",rv=0;
		if(reduc.enabled){
			rv=reduc.calculate();
			if (rv!=0){
				reductionLine+='<tr>'+align+'<td>&nbsp;'+reduc.getLabel()+'&nbsp;</td>';
				reductionLine+='<td align=right class="align-right" style="text-align:right;"><b>-</b>&nbsp;'+v.format(rv)+'&nbsp;</td></tr>';
				if (svat!=0)vatOf.increment(svat,-rv);
				total=roundSum(total,-rv);
			}
		}

		//Display the reduction line including VAT. The VAT price is not mention separately.
		var incVat=(getVatState()>0);
		if((reduc.enabled)&&(svat>0||incVat))s+=reductionLine;
		if(action.active&&(action.hasVat||incVat))s+=action.getLine();

		//Insert the shiping method selection control.
		ship.reset();
		if(ship.enabled){
			if(ship.direct||ship.count==1){
				var ls="",active=bag.get("s.order.shipping.id");
				
				if(ship.count==1){
					ship.select("first");
					if(ship.remote==1)new ShippingBasket().calculateExtra(ship);
				}
				else{
					while(ship.next())if(ship.remote==1)new ShippingBasket().calculateExtra(ship);
					ship.reset();
				}
				
				if(ship.count==1){
					ship.select("first");
					ls='<input name=shipping type="hidden" value='+ship.id+'>'+ship.label+':';
					active=ship.id;
					bag.set("s.order.shipping.id",active);
				}else{
					ls='<select name=shipping onchange="JavaScript:doSelectShipping(this);">';
					ls+='<option value="">'+m("shipping")+'</option>';
					while(ship.next())ls+='<option '+((active==ship.id)?'selected':'')+' value='+ship.id+'>'+ship.label+'</option>';
					ls+='</select>';
				}
				// Use the shipping cost object to select the selected shipping cost line. 
				// This will ensure the extra costs (based on the content of the shopping cart)
				// are added to the total price (if enabled).
				shipc.select(active,total,totalvat);
				if(action.active)ship.basePriceReached(total,totalvat,action.total,action.vat);
				else ship.bottomPriceReached(total+totalvat-rv);
				var shipvat=ship.price*0.01*svat;
				totalvat+=shipvat;
				s+='<tr>'+align+'<td style="text-align:right;">&nbsp;'+ls+'</td>';
				s+='<td align=right class="align-right" style="text-align:right;">'+((active!="")?v.format((getVatState()>0)?(ship.price+shipvat):ship.price):__n)+'&nbsp;</td></tr>';
				s+='<tr>'+align+'<td colspan=2>&nbsp;</td></tr>';
			}
		}

		if(svat!=0)vatOf.increment(svat,ship.price);
	
		total=roundSum(total,ship.price);
	
		// Reset the extended VAT option and display the VAT lines.
		var vatTotal=0,line=0,subVATTotal,b=false,sec="s.exVAT.",showVat=(getVatState()!=2),vatLeft=(getVatState()==1),vatStyle="";
		if(vatLeft)vatStyle='style="font-style:italic;color:gray" nowrap';
		bag.set("s.exentedVAT",0);
		bag.remove("s","exVAT");
		while(vatOf.next()){
	        if(vatOf.key()!=0&&vatOf.value()!=0){
	            if(!b)b=bag.set("s.exentedVAT",1),true;
	            subVATTotal=vatOf.key()*0.01*vatOf.value();
	            if(showVat){
	            	if(vatLeft){
	            		s+='<tr><td '+vatStyle+'>&nbsp;'+vatOf.key()+'%&nbsp;'+m("vat")+' '+m("of")+' '+v.format(vatOf.value()+subVATTotal)+'</td>';
	            		s+='<td '+vatStyle+' align=right class="align-right">'+v.format(subVATTotal)+'&nbsp;</td><td style="width:100px" nowrap><img style="width:100px;height:1px" src="/pic/leeg.gif"></img></td><td colspan="2">&nbsp;</td></tr>';
	            	}
	            	else{
	            		s+='<tr>'+align+'<td>&nbsp;'+vatOf.key()+'%&nbsp;'+m("vat")+' '+m("of")+' '+v.format(vatOf.value())+'</td>';
	            		s+='<td align=right class="align-right">'+v.format(subVATTotal)+'&nbsp;</td></tr>';
	            	}
	            }
	            total=roundSum(total,subVATTotal);
	            vatTotal+=subVATTotal;
	
	            bag.set(sec+"percentage",vatOf.key(),line);
	            bag.set(sec+"amount",v.format(vatOf.value()),line);
	            bag.set(sec+"amount-inc-vat",v.format(vatOf.value()+subVATTotal),line);
	            bag.set(sec+"subTotal",v.format(subVATTotal),line++);
	        }
		}
		//Display the reduction line excluding VAT. The VAT price is mention separately.
		if(!incVat&& reduc.enabled&&(svat==0))s+=reductionLine;
		if(!incVat&& action.active&&!action.hasVat)s+=action.getLine();
	
		s+='<tr>';
		vatLeft=(vatLeft&&(vatTotal!=0));
		
		if(vatLeft)s+='<td colspan="2"><table width="100%" cellspacing="0" cellpadding="0"><tr><td height="1" bgcolor="gray"><img src="/pic/leeg.gif" height="1" width="1" border="0"></td></tr></table></td><td></td>';
		else s+='<td colspan="3" style="width:300px"></td>';
		s+='<td colspan="2"><table width="100%" cellspacing="0" cellpadding="0"><tr><td height="1" bgcolor="#000000"><img src="/pic/leeg.gif" height="1" width="1" border="0"></td></tr></table></td></tr>';
		s+='<tr>'
		if(vatLeft){
			s+='<td '+vatStyle+'>&nbsp;'+m("totalvat")+'&nbsp;</td>';
			s+='<td '+vatStyle+' align=right class="align-right">'+v.format(vatTotal)+'&nbsp;</td><td>&nbsp;</td>';
		}
		else s+=align;
		s+='<td><b>&nbsp;'+m("total")+'&nbsp;</b></td>';
		s+='<td align=right class="align-right" style="text-align:right;"><b>'+v.format(total)+'</b>&nbsp;</td>';
		
		s+='</tr>';
		
		if(action.hasCoupon){
			s+='<tr>'+align+'<td colspan="2">&nbsp;</td></tr>';
			s+='<tr>'+align+'<td><nobr>&nbsp;<b>'+action.label+'</b>&nbsp;</nobr></td><td align=right class="align-right" style="text-align:right;"><input type=text name=coupon_n value="'+action.code+'" size=17 maxlength=30 title="" /></td></tr>';
		}
		s+='</table></td></tr>';

		s=flush(s);
		
		s='<tr><td>&nbsp;</td></tr>';
		
		s+='<tr><td colspan="'+((isEnabled("quotation")&&isEnabled("order"))?9:7)+'"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td valign="top">';
		if(hasContinue())s+=getContinueButton()+'&nbsp;</td>';
		s+='<td align="right"  class="align-right" valign="top" nowrap style="text-align:right;">'+getButton("schelp","doHelp()");
		s+='&nbsp;'+getButton("next","nextPage()",true)+'&nbsp;</td>';
		s+='</tr></table></td></tr>';

		s+=space;
		s+='<tr><td><br></td></tr>';
		s=flush(s);
		
		//s+=releatedBuffer;
		s+='<span id="myshp-related">';
		s+=_rel.toString();
		s+='</span>';
		
		if(getPolicies()!="")s+='<a href="javascript:void(0);" onclick="javascript:doPolicies(\''+getPolicies()+'\');">'+m("policies")+'</a>.<br>';
		s+=getMemo();
		if(s!="")s='<tr><td width="80%" colspan="9" class="u">'+s+'</td></tr>';

		s+='<tr><td><br></td></tr>';
		s+='</table></td></tr></table></center>';
	}
	else{
		// no articles found 
		s+='<tr><td align="center" class="align-center"><br><br>'+m("isempty")+'<br></td></tr>';

		s+='<tr><td align="center" class="small"><br><br>';
		if(__customer.enabled)s+='&#160;';
		else s+=m("isempty2")+'<br>'+m("isempty3");
		s+='<br><br></td></tr>';
		
		s+='<tr><td align="center" class="align-center"><a href="javascript:doHelp();">'+getLabel('schelp')+'</a><br><br><br><br></td></tr>';
		s+='</tr></table>';

		s+='<tr><td><br></td></tr>';
		s+='</table></center>';
	}
	
	return s;
}

function footer(bag){
	if(self.reloadIframPage)reloadIframPage();
	var s="";
	if(self.__statistic)s=__statistic.getCounter();
	else{
		//Onestat
		var st=getStatType(true),id=getStatValue(true);
		var osp_URL="orderprocess2 - shopping cart";
		var osp_Title="orderprocess2 - shopping cart";	
		//	if((st=="onestatbasic")||(st=="onestatpremium")){
		if((st=="onestatpremium")||(st=="onestatebusiness")){
		    var d=document;
		    var CONTENTSECTION="";
		    var CUSTOMDATA="";
			//ebusiness
			var osp_ACTION="";
			var osp_TRANSACTION="";
			var osp_AMOUNT="";
			var osp_PRODUCTCODE="";
			var osp_PRODUCTGROUP="";
			var osp_ADCAMPAIGN="";
			//einde ebusiness
		    var t=new Date();
		    var p="http"+(document.URL.indexOf('https:')==0?'s':'')+"://stat.onestat.com/stat.aspx?tagver=2&sid="+id;
		    p+="&url="+escape(osp_URL);
		    p+="&ti="+escape(osp_Title);
		    p+="&section="+escape(CONTENTSECTION);
		    p+="&custom="+escape(CUSTOMDATA);
			//ebusiness
			p+="&cma="+escape(osp_ACTION);
			p+="&cmt="+escape(osp_TRANSACTION);
			p+="&cmm="+escape(osp_AMOUNT);
			p+="&cmp="+escape(osp_PRODUCTCODE);
			p+="&cmg="+escape(osp_PRODUCTGROUP);
			p+="&cmad="+escape(osp_ADCAMPAIGN);
			//einde ebusiness		
		    p+="&rf="+escape(window.document.referrer);
		    p+="&tz="+escape(t.getTimezoneOffset());
		    p+="&ch="+escape(t.getHours());
		    p+="&js=1";
		    p+="&ul="+escape(navigator.appName=="Netscape"?navigator.language:navigator.userLanguage);
		    if(typeof(screen)=="object"){
		       p+="&sr="+screen.width+"x"+screen.height;p+="&cd="+screen.colorDepth;
		       p+="&jo="+(navigator.javaEnabled()?"Yes":"No");
		    }
			//if(st=="onestatbasic")s+='<A HREF="http://www.onestat.com/aspx/login.aspx?sid='+id+'" target=_blank><IMG ID="ONESTAT_TAG" BORDER="0" SRC="'+p+'" ALT="This site tracked by OneStat.com. Get your own free website counter."></A>';
			if((st=="onestatpremium")||(st=="onestatebusiness"))s+='<img id="ONESTAT_TAG" border="0" width="1" height="1" src="'+p+'" />';
		}
	}	
	if(getSponsorLevel()>3)s+=getDefSponsor();
	s+='';
	return s;
}

function refreshShoppingcart(bag){
	reload(vt_BASKET,bag);
}

function pageLoad(bag,form){
	if(document.title=="")document.title=m("basket.capital");
	if(self.CheckProductStock)new CheckProductStock(false);
}

function doChange(line,cid,oid){showPopup(oid,cid,line,1)}
function doPolicies(p){
	var w=window.open(p,m("policies").replace(/\s+| /gi,'_'),"height=450, width=480, left=10, top=10, resizable=yes, scrollbars=yes",true);
	w.focus();
}
function doHelp(){
	var l=getLanguage(),w=window.open('http://www.mijnwinkel.nl/help/frame.html?page=hkassa_'+l+'.html&language='+l+'&_vid='+getVID(),m("schelp"),"height=450, width=400, left=10, top=10",true);
	w.focus();
}
function doRemove(line){
	var bag=getBag();
	if(showConfirm(formatMsg("remove.msg",textUnescape(bag.get("s.order.article.description",line))))==true){
		if(self.ActionList){
			var al=new ActionList(),action;
			while(al.hasNext()){
				al.next();
				action=al.action;
				if(action.name=="auto_add"||action.name=="auto_add_on_price")action.onRemove(__b.get("s.order.article.oid",line));
			}
		}
		bag.remove("s.order","article.id",line);
		reload(vt_BASKET);
	}
}
function doSelectShipping(ctl){
	var r=new Reduction();
	getBag().set("s.order.shipping.id",ctl.value);
	if(r.validate)r.valid();
	reload(vt_BASKET);
}

function myAddTH(l,a,w){return '<th align='+a+' width='+w+'% style="color:'+getFGTColor()+'" bgcolor="'+getFGColor()+'" class=u>'+m(l)+'</th>'}



function roundSum(n0,n1){
	n0+=n1;
	return (Math.round(n0*100)/100)
}


function relatedHeader(){
	if(_rel==null)self._rel=new Related();
	_rel.init();
	_rel.append('<br><table align=center  class="align-center" width=100% border=0 cellspacing=0 cellpadding=0>');
	_rel.append('<tr><td><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="',getColor(4),'"><b>',m("related.title"),'</b></font></td></tr>');
	_rel.append('<tr><td><table align=center class="align-center" width=100% border=0 cellspacing=0 cellpadding=1>');
	return ""
}

function relatedBuildBlock(columns,relatedInfo){
	_rel.append('<tr><td><span id="myshp-related',_rel.count,'">',relatedBuildBlockInner(columns,relatedInfo),'</span></td></tr>');
	_rel.increment();
	return "";
}

//next function is a copy of the defaults
function relatedBuildBlockInner(columns,relatedInfo){
	var	price='',priceshow=false,priceLabel='',fields=new SB(),imgIndex=null,s=new SB();
	var fontName=getFontName("Verdana,Arial,Helvetica,sans-serif");
	var fontSize=getFontSize(7.5);
	var styleTitle=makeStyle("font-family",fontName,"font-size",(fontSize+1)+"pt","font-weight","bold");
	var styleText=makeStyle("font-family",fontName,"font-size",(fontSize+1)+"pt","vertical-align","middle");
	var styleLink=makeStyle("font-family",fontName,"font-size",fontSize+"pt","text-decoration","underline");
	var styleLabel=makeStyle("font-family",fontName,"font-size",fontSize+"pt","font-weight","bold","vertical-align","middle");
	var stylePrice=makeStyle("font-family",fontName,"font-size",(fontSize+2)+"pt","font-weight","bold");
	s.append('<table border="0" width="100%" cellpadding="0" cellspacing="0"><tr><td colspan="4">');
	s.append('<img src="/pic/transparent.gif" float: left;" width="1" height="1" alt=""><br/>');
	s.append('<img src="/pic/transparent.gif" style="background-image: url(/pic/dotted_line.gif); background-repeat: repeat-x; width: 100%; float: left;" width="1" height="1" alt="">');
	s.append('<img src="/pic/transparent.gif" float: left;" width="1" height="1" alt=""><br/></td></tr><tr>');
	fields.append('<table border="0" cellpadding="2" cellspacing="2"><tr><td valign="top">');
	for(var i=1;i<columns;i++)
		if(((relatedInfo!=null)?relatedInfo.show(i):getInfoShow(i))&&!fieldIsEmpty(i)){
			if(i==getPrice()){priceshow=true;price=fieldPlain(i);priceLabel=fieldLabel(i);}
			else if(!imgIndex&&isImage(i))imgIndex=i;
			else if(selection.has(getOID(),i)){
				var list=selection.get(getOID(),i),n=0,len=list.length-1,active=selection.active(getOID(),i);
				if(len>1){
					fields.append('<span ',styleLabel,'>',fieldLabel(i),':</span></td><td valign="top">');
					if(selection.isInlineSelection(getOID(),i))s.append('<input type=hidden name="_selectionall',_rel.active,'_',getOID(),'_',(i-1),'" value="',selection.get(getOID(),i,true),'">');
					fields.append('<select style="font-size:',fontSize,'pt;" onchange="selectProductRel(this,',i,',\'',getOID(),'\'',',',_rel.active,',\'',getCID(),'\');" name="_selection',_rel.active,'_',getOID(),'_',(i-1),'">');
					for(;n<len;n++)fields.append('<option value="',escape(list[n]),'" ',((list[n]==active)?' selected ':''),'>',list[n],'</option>');
					fields.append('</select>');
				}else fields.append('</td></tr><tr><td valign="top"><span ',styleLabel,'>',fieldLabel(i),':</span></td><td ',styleText,'>',list[0]);
				fields.append('</td></tr><tr><td valign="top">');
			}else{
				fields.append('<span ',styleLabel,'>',fieldLabel(i),':</span></td><td valign="top"',styleText,'>',fieldPlain(i),'</td></tr><tr><td valign="top">');
			}
		}
	if(priceshow)fields.append('<span ',styleLabel,'>',priceLabel,':</span></td><td valign=top><span ',styleLabel,'>',price,'&nbsp;</span>');
	if(hasInfo()){
		fields.append('<a href="javascript:void(0);" onclick="javascript:return info(',getOID(),',',getCID(),',null,\'',escape(_rel.getFolder()),'\',\'',escape(trim(fieldPlain(getID()))),'\'),false;"',styleLink,'>',m("moreinfo"),'</a>');
	}
	fields.append('</td></tr>');
	
	var fldName='quantity'+getCID()+'_'+getOID();
	if(hasOrder()&&getQFType()==1){
		fields.append('<tr><td valign=top><b>');
		if(getQFLabel()!="")fields.append('<span ',styleLabel,'>',getQFLabel(),':</span>');
		fields.append('</b></td><td><input name="'+fldName+'" type=text onclick="javascript:return false;" value="',getInfoQuantity(fldName),'" maxlength="6" size="2" onkeypress="javascript:return keyPress(arguments[0],this,',getOID(),',',getCID(),',',_rel.active,');" onkeyup="javascript:return keyUp(this);"/></td></tr>');
	}
	
	fields.append('<tr><td colspan="2"><img src="/pic/transparent.gif" width="1" height="1" border="0" alt=""><br/>');
	if(hasQuotation()){
		if(getQFType()==1)fields.append('<a ',styleLink,' href="javascript:void(0);" onclick="javascript:return placeOrderRelatedBasket(null,',getOID(),',\'',fldName,'\',',getCID(),',',_rel.active+'),false;" style="color: #666666;font-weight:bold;text-decoration:underline;">',m('quotation.long'),'</a><br/>');
		else fields.append(getQuotationButton(getCID(),_rel.active),'&nbsp;');
	}
	if(hasOrder()){
		if(checkStock()&&getStockVal(_rel.active)<1)s.append('&nbsp;');
		else {
			if(getQFType()==1)fields.append('<a ',styleLink,' href="javascript:void(0);" onclick="javascript:return placeOrderRelatedBasket(null,',getOID(),',\'',fldName,'\',',getCID(),',',_rel.active+'),false;" style="color: #666666;font-weight:bold;text-decoration:underline;">',m('order'),'</a><br/>');
			else fields.append(getOrderButton(getCID(),_rel.active));
		}
	}
	fields.append('</td></tr></table>');
	if (getRPictureIndex()!='')imgIndex=getRPictureIndex();
	s.append('<td valign=top width="' ,((unescape(getRPictureW())*1)+5),' " ',((imgIndex)?('>'+getRPicture(imgIndex)+'&nbsp;</td><td valign=top>'):'colspan=2>'));
	var rTitleIndex=(getRTitleIndex()!=''),rShortDescIndex=(getRShortDescIndex()!='');
	if ((rTitleIndex)||(rShortDescIndex))s.append('</td><td valign="top" width="200"><table border="0" cellpadding="0" cellspacing="2"><tr><td valign="top"',styleTitle,' >',((rTitleIndex)?fieldPlain(getRTitleIndex())+'</td></tr><tr><td valign="top"'+styleText+'>':""),((rShortDescIndex)?fieldPlain(getRShortDescIndex()):""),'</td></tr></table></td><td valign=top>');

	s.append(fields.toString(),'</td></tr></table>');
	return s.toString();
}

function placeOrderRelatedBasket(c,oid,n,cid,count){
	if(self._rel&&self._rel.init){
		var ri=new RelatedData(),cust=_c,m=_m,rd=__rowData,catid=getCID();
		ri.select(count);
		_rel.active=count;
		loadRelatedSettings(ri);
		placeOrderRelated(c,oid,n,cid,count);
		_c=cust;
		_m=m;
		__rowData=rd;
		setCtlVal("_cid",catid);
	}else placeOrderRelated(c,oid,n,cid,count);
}


function relatedFooter(){
	_rel.append('</td></tr></table></table><br><br>');
	return "";
}

function getReq(){
	var activex="Microsoft.XMLHTTP",req=null;
	try{req=new ActiveXObject("Msxml2.XMLHTTP");}
	catch(err){}
	if(req==null){
		try{req=new ActiveXObject(activex);}
		catch(err){}
	}
	return req;
}

function Ajax(){
	var me=this,req=null,callback=null;
	me.request=function(cb,type){
		var argl=me.request.arguments,i=2,qs="&",activex=null;
		for(;i<argl.length;i+=2)qs+=escape(argl[i])+"="+escape(argl[i+1]);
		callback=cb;
		if(window.XMLHttpRequest)req=new XMLHttpRequest();
	    else if(window.ActiveXObject){
	    	activex="";
	    	req=getReq();
	    }
	    if(req!=null){
	        req.onreadystatechange=processReqChange;
	        if(hasNoFrames())req.open("GET",getNewUri("rpc","")+"?jid="+(new Date()).getTime()+"&type="+type+"&"+qs,true);
	        else req.open("GET",makeURL("/servlets/ClientAJAX","type",type)+qs,true);
	        if(activex==null)req.send(null);
	        else req.send();
	    }else callback(null);
	};
	function processReqChange(){
    	if(req.readyState==4){
    		if(req.status==200)callback(req.responseXML.documentElement);
			else callback(null);
			done=true;
        }
    }
}


///***********

function refreshReleadtedProduct(){
	relatedBuildBlock(getNrOfFields(),_rel);
}

function refreshReladtedProductInner(){
	var c=getElementOnId("myshp-related"+_rel.active);
	if(c)c.innerHTML=relatedBuildBlockInner(getNrOfFields(),_rel);
}

function setRaw(n,v){n=_i(n);if(__rowData&&n<__rowData.length)__rowData[n]=v}


/*
 * Load the next related product or show the product list if the last is loaded.
 */
function nextRelated(){
	if(_rel.enabled()){
		if(_rel.isFirst())relatedHeader();
		if(_rel.hasNext())new Remote().request(this.response2,"catalog_item_data","_oid",_rel.next());
		else{
			relatedFooter();
			_rel.redraw();
		}
	}
}

/*
 * Field selection base class, used to create on the fly field 
 * selection objects.
 */
function FieldSelection(){
	var me=this,fld=[],fldsel=[];
	me.set=function(col,lst){fld[col]=lst};
	me.setActive=function(col,v){fldsel[col]=v};
	me.get=function(i){return fld[i]};
	me.active=function(i){return fldsel[i]};
}

function parseDocument(doc,rel){
	var index=0,rows=doc.getElementsByTagName('row'),type,done=[];
	for(;index<rows.length;index++){
		row=rows[index];
		type=row.getAttribute("type")
	 	if(!done[type]&&type=="catalog"){
	 		done[type]=true;
	 		var cols=row.getElementsByTagName('col'),s="",v,item=[],l=cols.length,c;
			if(rel)rel.setFolder(row.getAttribute("folder"))
			
			item[0]=row.getAttribute("number");
			for(var i=0;i<l;i++){
				v=cols[i].firstChild.nodeValue;
				if(v)item[i+1]=v;
				else item[i+1]="";
			}
			setCtlVal("_oid",_i(item[0]+1));
			_d[0]=item;
			__rowData=item;
			__activeRow=0;
		}
		else if(!done[type]&&type=="catalog_replace"){
	 		done[type]=true;
			var cols=row.getElementsByTagName('col'),l=cols.length,n,c,i=0;
			for(;i<l;i++){
				c=cols[i];
				n=c.getAttribute("number");
				v=c.firstChild.nodeValue;
				if(v&&v!=''&&v!='*'){
					if(n)setRaw(n,v);
					else{
						n=c.getAttribute("name");
						if(n&&n=="stock")_rel.setStock(v);
					}
				}
			}
		}
		else if(!done[type]&&type=="catalog_localstock"){
	 		done[type]=true;
			var cols=row.getElementsByTagName('col'),l=cols.length,n,c,i=0;
			for(;i<l;i++){
				c=cols[i];
				v=_i(c.firstChild.nodeValue);
				if(v&&v!=''&&v!='*'){
					setRaw(getStockFld(),v);
					_rel.setStock(v);
				}
			}
		}
		else if(type=="catalog_selection"){
			if(this.selection)selection.reset();
			var cols=row.getElementsByTagName('col'),l=cols.length,col,i=0,opts,optsl,opti,opt,oid=_i(row.getAttribute("number"))+1;
			var info=new FieldSelection();
			_fs[oid]=info;
			for(;i<l;i++){
				col=cols[i];
				colNr=cols[i].getAttribute("number");
				opts=cols[i].getElementsByTagName('option');
				optsl=opts.length;
				var lst=[],sel="";
				for(opti=0;opti<optsl;opti++){
					opt=opts[opti];
					lst[opti]=opt.firstChild.nodeValue;
					if(sel==""&&opt.getAttribute("selected")){
						sel=opt.getAttribute("inline");
						if(sel=="")sel=lst[opti];
					}
				}
				lst[optsl]="";
				info.set(colNr,lst);
				info.setActive(colNr,sel);
			}
		}
		else if(rel&&type=="catalog_related"){
			var cols=row.getElementsByTagName('col'),l=cols.length,i=0;
			if(l>0){
				_rel.reset();
				for(;i<l;i++)_rel.add(cols[i].firstChild.nodeValue);
			}
		}
		else if(!done[type]&&type=="catalog_related_fields"){
			done[type]=true;
			var cols=row.getElementsByTagName('col');
			if(cols)for(var l=cols.length,i=0;i<l;i++)_rel.fldAdd(cols[i].firstChild.nodeValue);
		}
	}
}

function response3(doc){
	if(doc){
		parseDocument(doc,false);
		refreshReladtedProductInner();
	}
}


function orderTriggered(extra,oid,count){
	var f=getData(),s=new SB(),ss=new SB(),sep1='',sep2='',v,l;
	if(f){
		if(!oid)oid=getOID();
		if(selection.enabled(oid)){
			if(count!=null&&count!="")count+="_";
			else count="";
			for(var index=0,c,i=1;i<getNrOfFields();i++){
				if(selection.isInlineSelection(oid,i)){
					c=f['_selection'+count+oid+'_'+(i-1)];
					if(c){
						if(c.selectedIndex!=-1)index=c.selectedIndex;
						v=trim(c.options[index].value);
						l=fieldLabel(i);
						s.append(sep1,l," ",v);
						ss.append(sep2,l,"%3d",v);
						sep1=',';
						sep2=';';
					}
				}
			}
			if(extra){
				extra['_xd']=s.toString();
				extra['_xds']=ss.toString();
			}
		}
		c=f["productcount"];
		if(c&&extra)extra['_xc']=c.value;
	}
}

function SB(){
	var me=this,buf=[];
	me.append=function(){for(var i=0,p=me.append.arguments,n=p.length;i<n;i++)buf.push(p[i])};
	me.toString=function(s){return buf.join("")};
}

function Selection(){
	var me=this,ins=[];
	me.has=function(oid,col){return self._fs&&_fs[oid]&&_fs[oid].get(--col)};
	me.get=function(oid,col,first){
		if(first==null)first=false;
		var sel=_fs[oid].get(--col);
		if(first)sel=sel[0];
		else if(sel.length<3&&sel[0].indexOf(';')!=-1){
			sel=sel[0].split(';');
			sel[sel.length]="";
			if(!ins[oid])ins[oid]=[];
			ins[oid][col]=true;
		}
		return sel
	};
	me.active=function(oid,col){return _fs[oid].active(--col)};
	me.enabled=function(oid){return self._fs&&_fs[oid]};
	me.isInlineSelection=function(oid,col){return(ins[oid]&&ins[oid][--col])?ins[oid][col]:false};
	me.reset=function(oid){ins[oid]=[]}; 
}
var selection=new Selection();

function selectProduct(ctl,i,oid,count,cid){
	_rel.active=count;
	var ri=new RelatedData();
	ri.select(count);
	loadRelatedSettings();	
	if(!selection.isInlineSelection(oid,i)){
		var n=(count=="")?"":count+"_";
		for(var f=getData(),c;i<getNrOfFields();i++){
			c=f['_selection'+n+oid+'_'+i];
			if(c!=null)c.selectedIndex=-1;
		}
		setCtlVal("_oid",oid);
		setCtlVal("_cid",cid);
		new Remote().request(self.response3,"catalog_item_data","_oid",oid,"counter",count)
	}
}

function Related(){
	var me=this,buf=[],lst,flds=[];
	me.reset=function(){
		me.count=0;
		me.index=0;
		me.active=0;
		lst=[];
	};
	me.clear=function(){
		lst=null;
		var c=getElementOnId("myshp-related");
		if(c)c.innerHTML="";
		buf=[];
		self._stc=null;
		flds=[];
	};
	me.append=function(){for(var i=0,p=me.append.arguments,n=p.length;i<n;i++)buf.push(p[i])};
	me.toString=function(s){return buf.join("")};
	me.add=function(v){lst[lst.length]=v};
	me.enabled=function(){return lst!=null&&lst.length>0}
	me.increment=function(){
		me.count++;
		me.active=me.count;
	};
	me.hasNext=function(){return(lst!=null&&me.index<lst.length)};
	me.next=function(){return lst[me.index++]};
	me.isFirst=function(){return me.index==0};
	me.redraw=function(){
		var c=getElementOnId("myshp-related");
		if(c)c.innerHTML=_rel.toString();
	};
	me.setStock=function(v){
		if(self._stc==null)self._stc=[];
		_stc[__rowData[0]]=v;
	};
	me.fldAdd=function(n){
		for(var i=1;i<_m.length;i++)if(_m[i][0]==n){
			flds[i]=1;
			break;
		}
	};
	me.show=function(i){return flds[i]}
	me.reset();
	me.init=function(){
		if(self.RelatedData&&self._stc){
			var i=0,d=new RelatedData(),l=d.count();
			for(;i<l;i++)_stc[d.getOid(i)]=d.getStock(getCID(),i);
		}
	};
	var _data=null;
	
	me.getFolder=function(index){
		var folder="";
		if(self.RelatedData&&!_data){
			_data=new RelatedData();
		}
		if(_data)folder=_data.getFolder(me.active);
		return escape((folder)?folder:"");
	};
	me.getProductId=function(index){
		var id="";
		if(self.RelatedData&&!_data){
			_data=new RelatedData();
		}
		if(_data)id=_data.getProductId(me.active);
		return escape((id)?id:"");
	};
	
}
var _rel=new Related();


