/*
regarding discount feature
Disabled for now by commenting "set discount" link and adding delete to loadsession()
But later reenabled it
*/

function addwww() {
	var url=(""+document.location.href).split("/");
	if(url[2].toLowerCase()=="icwusa.com") {
		url[2]="www.icwusa.com";
		document.location.href=url.join("/");
	}
}

addwww();

var session;
var CSVtext="";

function cesc(s) {
	if(s.indexOf(";")>=0) s=s.split(";").join("%#$");
	return s;
}

function cunesc(s) {
	if(s.indexOf("%#$")>=0) s=s.split("%#$").join(";");
	return s;
}

/* session management. Provides 1:1 mapping between cookies and javascript objects  */
	function setcookie(n,v,e) {
		var exp=new Date(1*new Date()+1000*60*60*24*(e||1)).toGMTString();
		var c=n+"="+cesc(""+v)+"; expires="+exp;
		//window.status=""+c.length+" byte cookie";
		document.cookie=c;
		//alert(c);
	}
	
	function safecookie(n,v) {
		var url=""+document.location.href;
		if(url.slice(0,5).toLowerCase()!="https") return;
		var c=n+"="+cesc(""+v)+"; path=/; secure";
		document.cookie=c;
	}
	
	
	function getcookie(n,def) {
		var v=""+document.cookie;
		v=v.split("; ");
		for(var i in v) {
			var p=v[i].split("=");
			if(p[0]==n) return cunesc(p[1]);
		}
		return def;
	}
	
		
	function isArray(o) {
		try {
			var x=o.length;
			if(!x||!(x>0)) return false;
			return true;
		} catch(e) {
			return false;
		}
	}
	
    function htmlEncode(s) {
        s=""+s;
        if(s.indexOf("<")>=0) s=s.split("<").join("&lt;");
        if(s.indexOf(">")>=0) s=s.split(">").join("&gt;");
        if(s.indexOf("'")>=0) s=s.split("'").join("&apos;");
        if(s.indexOf('"')>=0) s=s.split('"').join("&quot;");
        return s;
    }
    function htmlDecode(s) {
        s=""+s;
        if(s.indexOf("&lt;")>=0) s=s.split("&lt;").join("<");
        if(s.indexOf("&gt;")>=0) s=s.split("&gt;").join(">");
        if(s.indexOf("&apos;")>=0) s=s.split("&apos;").join("'");
        if(s.indexOf('&quot;')>=0) s=s.split('&quot;').join('"');
        return s;
    }
		
	var c2test=/["\\\x00-\x1f]/;
	var c2match=/[\x00-\x1f\\"]/g;
	var c2codes = {
		'\b': '\\b',
		'\t': '\\t',
		'\n': '\\n',
		'\f': '\\f',
		'\r': '\\r',
		'"' : '\\"',
		'\\': '\\\\'
	};
	function cescape(s) { //adapted from public domain json.org code
		if (c2test.test(s)) {
			return s.replace(c2match, cescape_inner);
		}
		return s;
	}
	function cescape_inner(a) {
		var c = c2codes[a];
		if (c) {
			return c;
		}
		c = a.charCodeAt();
		return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
	}

	function toscript(o) {
		switch(typeof(o)) {
			case "string": return "\""+cescape(o)+"\"";
			case "number":
			case "boolean":
				return o;
			case "object":
				if(o.getDate) {
					return "new Date("+1*o+")";
				} else {
					var out=[];
					if(isArray(o)) {
						var len=o.length;
						for(var i=0;i<len;i++) {
							out[i]=toscript(o[i]);
						}
						return "["+out.join(",")+"]";
					} else {
						var i=0;
						for(var n in o) {
							out[i++]="\""+cescape(n)+"\":"+toscript(o[n]);
						}
						return "{"+out.join(",")+"}";
					}
				}
			case "function":
				return ""+o;
		}
		try {
			return toscript(""+o);
		} catch(e) {
			return "undefined";
		};
	}

		
	function loadsession() {
		var s="";
		try {
			s=getcookie("session");
			//alert(s);
			try {
				session=eval("("+s+")");
			} catch(eee) {
				session=eval("("+unescape(s.replace(/\+/g,"%20"))+")");
			}
			if(session.key!="ICW") throw [];
			/*try {
				delete session.discount;
			} catch(ee) {}*/
			try {
				if(session.cart) {
					for(var n in session.cart) {
						var n2=htmlDecode(n); //unfix prior "fix"
						if(n2!=n) {
							var ci=session.cart[n];
							delete session.cart[n];
							session.cart[n2]=ci;
						}
					}
				}
			} catch(ee) {}
		} catch(e) {
			//alert("error loading "+(e.message||e.Description));
			session=[];
			session.key="ICW";
		}
	}
	
	function savesession() {
		try {
			if(!session || session.key!="ICW") {
				session=[];
				session.key="ICW";
			}
			setcookie("session",toscript(session));
		} catch(e) {
			//alert("error saving "+(e.message||e.Description));
		}
	}
	
	loadsession();

function toggleShip() {
	session.shipform=!session.shipform;
	savesession();
	displaycart();
}
	
	
function toggleCSV() {
	makeCSV=!makeCSV;
	displaycart();
}
function clearCart() {
	session.cart=[];
	session.discount=0;
	savesession();
	//setcookie("cust","{}");
	displaycart();
}
	
function addCart(s,p,q,cust,desc,ask,img,weight) {
	var err=isDiscontinued(s)
	if(q>0 && err) {
		alert(err);
		return;
	}

	var c=session.cart;
	if(!c) c=session.cart=[];
	if(!c[s]) {
		if(p<=0) return;
		if(weight) {
			c[s]=[p,0,cust||0,desc||0,img||0,weight];
		} else if(cust) {
			if(img) c[s]=[p,0,cust,desc,img];
			else c[s]=[p,0,cust,desc];
		} else {
			c[s]=[p,0];
		}
		
	}
	addQuantity(s,q,ask);
}

function addAcc(s,p,desc,img) {
	addCart(s,p,1,1,desc,1,img);
	scrollBy(0,10000);
}

function addQuantity(s,q,ask) {
	var qty=session.cart[s][1]||0;
	if(isNaN(qty)||qty<0||!isFinite(qty)) qty=0;
	var oldqty=qty;
	qty+=q;
	
	if(qty>5 || ask) {
		qty=parseInt(prompt("How many?",""+qty)||(""+oldqty))||0;
		while(qty>10000) {
			qty=parseInt(prompt("Honestly, how many?",""+qty)||(""+oldqty))||0;
		}
	}
	session.cart[s][1]=qty;
	if(qty<=0) delete session.cart[s];
	if(session.cart["Shipping"]&&s!="Shipping") {
		if(orderscriptloaded) {
			AddCartShip(); //also saves/displays
		} else {
			loadOrderScript(); //automatically calls AddCartShip()
		}
		return;
	}
	savesession();
	displaycart();
}

function setDiscount() {
	var disc=prompt("Discount percentage?",""+(session.discount||"0")+"%");
	try {
		disc=disc.replace(/[^0-9.]/g,"");
	} catch(e){}
	if(!disc && disc!="0") return;
	try {
		disc=1*disc;
		if(!(disc>0 && disc<=100)) disc=0;
	} catch(e) {
		disc=0;
	}
	if(!disc) disc=0;
	if(disc>0 && disc<1) disc=disc*100;
	if(disc) {
		session.rounding=confirm("Round discounted line items to the nearest dollar?");
	} else {
		session.rounding=0;
		delete session.rounding;
	}
	session.discount=disc;
	savesession();
	displaycart();
}

function reprice(s) {
	var c=session.cart[s];
	var p1=c[0];
	var p=p1;
	//try {
		p=1*prompt("New price?",p);
		if(p>0 && p!=p1) {
			c[0]=p;
			savesession();
			displaycart();
		}
	//} catch(e) {
	//}
}

function delCart(s) {
	if(!session.cart[s]) {
		cart={}; //final safeguard against escaping problems
	} else {
		delete session.cart[s];
	}
	if(session.cart["Shipping"]&&s!="Shipping") {
		if(orderscriptloaded) {
			AddCartShip(); //also saves/displays
		} else {
			loadOrderScript(); //automatically calls AddCartShip()
		}
		return;
	}
	savesession();
	displaycart();
}

function lescape(s) { //needs good testing
	if(s.indexOf("'")>=0) s.split("'").join("`");
	if(s.indexOf('"')>=0) s.split('"').join("``");
	return s;
}

function toform(o) {
	var frm=[];
	for(var n in o) {
		frm.push("<input type='hidden' name='"+lescape(n)+"' value='"+lescape(""+o[n])+"'>");
	}
	return frm.join("");
}

function ppc(c) {
	c=Math.round(100*c);
	var i,f;
	i=Math.floor(c/100);
	f=c%100;
	if(f<10) return ""+i+".0"+f;
	else return ""+i+"."+f;
}

function savecsv() {
	var csv=CSVtext; //el("csvtext").value;
	var out;
	try {
		out=chooseFile(true,"quote","csv","Comma delimited");
		if(!out) {
			//alert("Save cancelled");
			return;
		}
		saveFile(out,csv);
		alert("Saved to "+out.path);
	} catch(e) {
		alert("Error saving"+(out?" to "+out.path:"")+":\n"+(e.message||e.Description));
	}
}

function addCustom() {
	var part=prompt("Part number?","Shipping");
	if(!part) return;
	//part=htmlEncode(part);
	var price=prompt("Price?","0");
	if(!price) price='0';
	try {
		if(price.charAt(0)=="$") price=price.slice(1);
		if(price.indexOf(".")>=0) {
			while(price.slice(-1)=='0') price=price.slice(0,-1);
			if(price.slice(-1)=='.') price=price.slice(0,-1);
		}
	} catch(e) {}
	price=parseFloat(price);
	if(!(price>=0||price<=0)) return;
	
	var desc=prompt("Description?","");
	if(!desc) desc="";
	
	addCart(part,price,1,1,desc);
}

function CSV(a,newline) {
	var out=[];
	for(var i=0;i<a.length;i++) {
		var r=a[i];
		var s=[];
		for(var j=0;j<r.length;j++) {
			var t=""+r[j];
			if(t.indexOf("\"")>=0) t=t.split("\"").join("\"\"");
			s[j]=t;
		}
		out.push("\""+s.join("\",\"")+"\"");
	}
	return out.join(newline||"\n");
}

function discount(p) {
	if(session.discount) {
		p=p*(1-session.discount/100);
		if(session.rounding) p=Math.round(p);
		else p=Math.round(p*100)/100;
	}
	return p;
}

function isDiscontinued(p) {
	var bad={
		"The Rex has been discontinued and replaced with Paralink.":
			["T2R","T2ER","T2X","T2EX","ELR","ELX","RX"]
	};
	for(var n in bad) {
		var b=bad[n];
		for(var i=0;i<b.length;i++) {
			if(p.indexOf(b[i])>=0) return  n+" Please call us at 1-800-558-4435 for more details while we update our website. Sorry for the delay and inconvenience.";
		}
	}
}

function displaycart() {
	var e=el("cart");
	if(!e) return;
	var s=[];
	var c=session.cart;
	var total=0;
	var dtotal=0;
	var tq=0;
	var frm=[];
	var csv=[];
	var notes=[];
	frm.cmd="_cart";
	frm.upload="1";
	frm.business="sales@icwusa.com";
	var ccform=[];
	var i=1;
	//if(makeCSV) {
		csv.push(["quantity","product","desc","units","price","unused"]);
//	}
	var sd=el("shipcost");
	var proceed=true;
	if(sd) {
		if(!c.Shipping) sd.innerHTML="";
		proceed=false;
	}
	if((""+document.location.href).indexOf("order.")>=0) proceed=false;
	
	
	for(var n in c) {
		var p=c[n];
		var stockcode=htmlEncode(n);
		var cstockcode=htmlEncode(cescape(n)); //proper escaping for script
		//alert(cstockcode);
		var price=p[0];
		var custom=p[2];
		var dprice=custom?price:discount(price);
		var quantity=Math.round(p[1]);
		var showqty=true;
		var lstock=stockcode.toLowerCase()
		if(lstock.indexOf("ship")>=0) showqty=false;
		if(lstock.indexOf("freight")>=0) showqty=false;
		if(lstock.indexOf("tax")>=0) showqty=false;
		var title="";
		var img;
		
		if(!custom) {
			img="../images/product_images/72x64/"+stockcode+".jpg"
			try {
				title=AutoPartDesc(n,true); //we neither want to download a long list of product descriptions, nor store them in cookies that may truncate at 4k.
			} catch(ee) {}
		} else {
			if(p[4]) img="../images/product_images/acc/"+p[4]+".jpg"; else img=0;
			title=htmlEncode(p[3]||"");
		}
		if(quantity>0) {
			var scr="<a href='javascript:addQuantity(\""+cstockcode+"\",1)'>More</a><br>";
			if(quantity>1) {
				scr+="<a href='javascript:addQuantity(\""+cstockcode+"\",-1)'>Less</a>";
			}
			scr+="<br><a href='javascript:delCart(\""+cstockcode+"\")'>Remove</a>";
			if(!showqty) scr=scr.split("<br>").pop(); //stupid hack
			
			var extra="";
			if(stockcode=="Shipping") {
				scr="&nbsp;";
				if(sd)sd.innerHTML="Shipping estimate is: $"+price;
				extra="*";
				notes["* Estimated. Actual shipping charge may be less."]=1;
			}
			
			s.push("<tr><td>"+(img?"<img src='"+img+"' height='64'>":"")+"</td><td><b>"+stockcode+"</b><br>"+title+"</td><td>$"+((dprice==price)?price:dprice+"<br><small>(from "+price+")</small>")+extra+"</td><td>"+(showqty?quantity:"-")+"</td><td>"+scr+"</td></tr>");
			
			total+=price*quantity;
			dtotal+=dprice*quantity;
			tq+=quantity;
			
			//if(makeCSV) {
				csv.push([quantity,stockcode,title,"EA",price,""]);
			//}
			/*
			frm["item_name_"+i]=title.slice(0,120);
			frm["item_number_"+i]=stockcode;
			frm["amount_"+i]=ppc(price);
			frm["quantity_"+i]=quantity;*/
			/* out to change price to dprice
			if(session.shipform) {
				ccform.push("<input type='hidden' name='Part"+i+"' value='"+htmlEncode(stockcode)+"'>");
				ccform.push("<input type='hidden' name='Qty"+i+"' value='"+quantity+"'>");
				ccform.push("<input type='hidden' name='Price"+i+"' value='"+price+"'>");
				ccform.push("<input type='hidden' name='Desc"+i+"' value='"+htmlEncode(title)+"'>");
			}*/
			
			i++;
		}
		if(custom && session.discount) notes["Discount percentage does not affect custom line items."]=1

	}
	if(tq<=0) {
		s="";
	} else {
		s="<center><b><big>Current Cart</big></b><br>"+
			"<table class='cart' cellspacing='1' cellpadding='2'><tr><th>Unit</th><th>Description</th><th>MSRP</th><th>Quantity</th><th>Edit</th></tr>"+
			s.join("")+
			"<tr><td colspan=3 align=center><big><b>$"+dtotal+" total"+(dtotal==total?"":" (from $"+total+")")+"</b></big></td><td colspan=2>&nbsp;</td></tr><tr><td colspan=5 align=center>"+
			//"<td colspan=2 align=center><a href='javascript:setDiscount()'>"+(session.discount?"<b>"+session.discount+"% discount</b>":"Apply discount")+"</a><br><a href='javascript:addCustom()'>Add custom</a></td>"+
			//<a href='javascript:toggleShip()'><b>CC checkout</b></a> |  <a href='javascript:document.forms.frmpaypal.submit()'>Paypal checkout</a> |
			"<a href='javascript:emailcart()'>Email</a> | "+ /* | <a href='http://icw1.com' target='_blank'>Chat</a> " |*/ "Phone 541-608-2824 | Fax 541-608-2797"+(proceed?" | &nbsp; <button onclick='showOrderForm()'>Proceed to checkout</button>":"")+ /*| <a href='javascript:savecsv()'>Export CSV</a> | <a href='javascript:clearCart()'>Clear Quote</a> | <a href=\"javascript:window.open('../quote.xul','PrintPreview','chrome,chromeextra,resizable'),undefined\"><b>Create Quote</b></a>*/
			"</td></tr></table></center>";  /*+
			"<form method='post' name='frmpaypal' target='_blank' action='https://www.paypal.com/cgi-bin/webscr' style='display:inline'>"+toform(frm)+"</form>";*/
		//if(makeCSV) s+="<center><textarea id='csvtext' rows='"+(csv.length+1)+"' cols='70' wrap='off'>"+CSV(csv)+"\n</textarea><br><input type='button' value='Save to file' onclick='savecsv()'></center>";
		for(var n in notes) s+=n+"<br>";
/*
		if(session.shipform) {
			var f=[];
			f.push("<center><br>Where would you like to ship this?<br>");
			f.push("<form name='ship' style='display:inline' method='post' action='https://secure.icwusa.com/payment.asp'>")
			//don't forget hidden part fields
			f.push(ccform.join(""));
			f.push("<table>");
			f.push("<tr><td align='right'>Name/Company</td><td><input type='input' size='40' name='ShipName' value='"+htmlEncode(session.ShipName||"")+"' onchange='readship()'></td></tr>");
			f.push("<tr><td align='right'>Address1</td><td><input type='input' name='ShipAddr1' size='40' value='"+htmlEncode(session.ShipAddr1||"")+"' onchange='readship()'></td></tr>");
			f.push("<tr><td align='right'>Address2</td><td><input type='input' name='ShipAddr2' size='40' value='"+htmlEncode(session.ShipAddr2||"")+"' onchange='readship()'></td></tr>");
			f.push("<tr><td align='right'>City</td><td><input type='input' name='ShipCity' size='25' value='"+htmlEncode(session.ShipCity||"")+"' onchange='readship()'> ");
			f.push("Zip <input type='input' name='ShipZip' size='5' value='"+htmlEncode(session.ShipZip||"")+"' onchange='readship()'></td></tr>");
			f.push("<tr><td align='right'>State</td><td><input type='input' name='ShipState' size='16' value='"+htmlEncode(session.ShipState||"")+"' onchange='readship()'> ");
			f.push(" Country <input type='input' name='ShipCountry' size='9' value='"+htmlEncode(session.ShipCountry||"USA")+"' onchange='readship()'></td></tr>");
			f.push("<tr><td align='right'>Attention</td><td><input type='input' name='ShipAttn' size='40' value='"+htmlEncode(session.ShipAttn||"")+"' onchange='readship()'></td></tr>");
			f.push("<tr><td align='right'>Email</td><td><input type='input' name='Email' size='40' value='"+htmlEncode(session.Email||"")+"' onchange='readship()'></td></tr>");
			f.push("<tr><td align='right'>Phone</td><td><input type='input' name='Phone' size='40' value='"+htmlEncode(session.Phone||"")+"' onchange='readship()'></td></tr>");
			f.push("<tr><td>&nbsp;</td><td><input type='submit' value='Secure checkout' onsubmit='return validateship()'></td></tr>");
			f.push("<table>");
			f.push("</form></center>");
			s+=f.join("");
		}
	*/	
		
		
		CSVtext=CSV(csv);
	}
	try {
		e.innerHTML=s;
	} catch(ee) {}

}

function validateship() {
	var frm=document.forms.ship;
	if(!frm) return false; //??
	var err=[];
	if(frm.ShipName.value=="") err.push("Name/Company required");
	if(frm.ShipAddr1.value=="") err.push("Address required");
	if(frm.ShipCity.value=="") err.push("City required");
	if(frm.ShipState.value=="") err.push("State required");
	if(frm.ShipZip.value=="") err.push("Zip/Postal code required");
	if(frm.ShipCountry.value=="") err.push("Country required");
	if(frm.Email.value=="") err.push("Email required");
	if(frm.Phone.value=="") err.push("Phone required");
	
	var e=""+frm.Email.value;
	if(e.indexOf("@")<0 || e.indexOf(".")<0) err.push("Invalid email");
	
	var z=""+frm.Zip.value;
	if(z.length<5) err.push("Invalid zip");

	var z=""+frm.Phone.value;
	if(z.length<10) err.push("Phone # not long enough");

	if(err.length) {
		alert(err.join("\n"));
		return false;
	}

	return true;
}

function readship() {
	if(!session.shipform) return;
	var fields=["ShipName","ShipAddr1","ShipAddr2","ShipCity","ShipState","ShipZip","ShipCountry","ShipAttn","Email","Phone"];
	var frm=document.forms.ship;
	if(!frm) return;
	for(var i=0;i<fields.length;i++) {	
		var n=fields[i];
		var v=frm[n];
		if(v) {
			v=v.value;
			if(v=="") {
				if(session[n]) delete session[n];
			} else {
				session[n]=v;
			}
		}
	}
	savesession();
}


function emailcart() {
	var c=session.cart;
	var blah="@icw";
	var dest="sales"+blah+"usa.com";
	var subject="Order details";
	var body=[];
	var bb="href";
	var aa="location";
	var total=0;
	body.push("");
	body.push("");
	for(var n in c) {
		var p=c[n];
		var stockcode=n;
		var price=p[0];
		var quantity=p[1];
		var title="";
		if(!p[2]) {
		try {
			title=AutoPartDesc(n); //we neither want to download a long list of product descriptions, nor store them in cookies that may truncate at 4k.
		} catch(ee) {}
		}
		if(quantity>0) {
			if(quantity>1) {
				body.push(quantity+" x "+stockcode+", price $"+price+", extended $"+(price*quantity));
			} else {
				body.push(stockcode+", price $"+price);
			}
			if(title && title!="") body.push("  "+title);
			body.push("");
			total+=price*quantity;
		}
	}
	if(total>0) {
		body.push("Total at MSRP: $"+total+" (shipping not included)");
	}
	var eml="mailto:"+dest+"?subject="+escape(subject)+"&body="+escape(body.join("\r\n"));
	document[aa][bb]=eml;
}


var orderscriptloaded;
function loadOrderScript() {
	if(orderscriptloaded) return;
	var header=document.getElementsByTagName("head")[0];         
	var scr=document.createElement("script");
	scr.type="text/javascript";
	scr.src="../ord/order.js";
	header.appendChild(scr);
	orderscriptloaded=true;
}


var orderfrm;

function showOrderForm() {
	if(orderfrm) return;
	
	var url=""+document.location.href;
	if(url.slice(0,5).toLowerCase()!="https") {
		url=url.split("#")[0].split("?")[0].split("/");
		url[0]="https:";
		if(url[2].toLowerCase()=="icwusa.com") url[2]="www.icwusa.com";
		url[url.length-1]="order.html";
		document.location.href=url.join("/");
		return;
	}

	
	
	
	orderfrm=document.createElement("div");
	orderfrm.className='orderform';
	el("cart").parentNode.appendChild(orderfrm);
	if(orderscriptloaded) {
		orderfrm.innerHTML=make_order_form();
	} else {
		loadOrderScript();
	}
	scrollBy(0,1000);
}
function tabNext(e) {
	try {
		var f=e.form;
		for(var i=0;i<f.length;i++) {
			if(f[i]==e) {
				f[i+1].focus();
				return;
			}
		}
	} catch(ee) {}
}

function stopEnter(e) {
	var ret=true;
	e=e?e:event;
	var key=e.keyCode||e.which;
	if(key==13) {
		var node=e.target?e.target:e.srcElement;
		switch(node.tagName.toLowerCase()) {
		case "a":
		case "textarea":
		case "button":
			ret=true;
			break
		case "input":
			ret=false;
			switch(node.type.toLowerCase()) {
			case "submit":
			case "image":
				ret=true;
				break;
			case "text":
			case "password":
				tabNext(node);
				break;
			case "checkbox":
				node.checked=!node.checked;
			}
			break;
		default:
			ret=false;
		}
	}
	e.returnValue=ret;
	return ret;
}

/*A JavaScript implementation of the RSA Data Security, Inc. MD5 Message Digest Algorithm, as defined in RFC 1321.
Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
Distributed under the BSD License
See http://pajhome.org.uk/crypt/md5 for more info.*/
function md5(A){return P(Q(R(A),A.length*8))}function Q(O,J){O[J>>5]|=128<<((J)%32);O[(((J+64)>>>9)<<4)+14]=J;var N=1732584193,M=-271733879,
L=-1732584194,K=271733878;for(var C=0;C<O.length;C+=16){var E=N;var D=M;var B=L;var A=K;N=F(N,M,L,K,O[C+0],7,-680876936);K=F(K,N,M,L,O[C+1],
12,-389564586);L=F(L,K,N,M,O[C+2],17,606105819);M=F(M,L,K,N,O[C+3],22,-1044525330);N=F(N,M,L,K,O[C+4],7,-176418897);K=F(K,N,M,L,O[C+5],12,
1200080426);L=F(L,K,N,M,O[C+6],17,-1473231341);M=F(M,L,K,N,O[C+7],22,-45705983);N=F(N,M,L,K,O[C+8],7,1770035416);K=F(K,N,M,L,O[C+9],12,
-1958414417);L=F(L,K,N,M,O[C+10],17,-42063);M=F(M,L,K,N,O[C+11],22,-1990404162);N=F(N,M,L,K,O[C+12],7,1804603682);K=F(K,N,M,L,O[C+13],12,
-40341101);L=F(L,K,N,M,O[C+14],17,-1502002290);M=F(M,L,K,N,O[C+15],22,1236535329);N=G(N,M,L,K,O[C+1],5,-165796510);K=G(K,N,M,L,O[C+6],9,
-1069501632);L=G(L,K,N,M,O[C+11],14,643717713);M=G(M,L,K,N,O[C+0],20,-373897302);N=G(N,M,L,K,O[C+5],5,-701558691);K=G(K,N,M,L,O[C+10],9,
38016083);L=G(L,K,N,M,O[C+15],14,-660478335);M=G(M,L,K,N,O[C+4],20,-405537848);N=G(N,M,L,K,O[C+9],5,568446438);K=G(K,N,M,L,O[C+14],9,
-1019803690);L=G(L,K,N,M,O[C+3],14,-187363961);M=G(M,L,K,N,O[C+8],20,1163531501);N=G(N,M,L,K,O[C+13],5,-1444681467);K=G(K,N,M,L,O[C+2],9,
-51403784);L=G(L,K,N,M,O[C+7],14,1735328473);M=G(M,L,K,N,O[C+12],20,-1926607734);N=H(N,M,L,K,O[C+5],4,-378558);K=H(K,N,M,L,O[C+8],11,
-2022574463);L=H(L,K,N,M,O[C+11],16,1839030562);M=H(M,L,K,N,O[C+14],23,-35309556);N=H(N,M,L,K,O[C+1],4,-1530992060);K=H(K,N,M,L,O[C+4],11,
1272893353);L=H(L,K,N,M,O[C+7],16,-155497632);M=H(M,L,K,N,O[C+10],23,-1094730640);N=H(N,M,L,K,O[C+13],4,681279174);K=H(K,N,M,L,O[C+0],11,
-358537222);L=H(L,K,N,M,O[C+3],16,-722521979);M=H(M,L,K,N,O[C+6],23,76029189);N=H(N,M,L,K,O[C+9],4,-640364487);K=H(K,N,M,L,O[C+12],11,
-421815835);L=H(L,K,N,M,O[C+15],16,530742520);M=H(M,L,K,N,O[C+2],23,-995338651);N=I(N,M,L,K,O[C+0],6,-198630844);K=I(K,N,M,L,O[C+7],10,
1126891415);L=I(L,K,N,M,O[C+14],15,-1416354905);M=I(M,L,K,N,O[C+5],21,-57434055);N=I(N,M,L,K,O[C+12],6,1700485571);K=I(K,N,M,L,O[C+3],10,
-1894986606);L=I(L,K,N,M,O[C+10],15,-1051523);M=I(M,L,K,N,O[C+1],21,-2054922799);N=I(N,M,L,K,O[C+8],6,1873313359);K=I(K,N,M,L,O[C+15],10,
-30611744);L=I(L,K,N,M,O[C+6],15,-1560198380);M=I(M,L,K,N,O[C+13],21,1309151649);N=I(N,M,L,K,O[C+4],6,-145523070);K=I(K,N,M,L,O[C+11],10,
-1120210379);L=I(L,K,N,M,O[C+2],15,718787259);M=I(M,L,K,N,O[C+9],21,-343485551);N=S(N,E);M=S(M,D);L=S(L,B);K=S(K,A)}return[N,M,L,K]}
function T(J,C,B,A,E,D){return S(U(S(S(C,J),S(A,D)),E),B)}function F(C,B,K,J,A,E,D){return T((B&K)|((~B)&J),C,B,A,E,D)}function G(C,B,K,J,A,
E,D){return T((B&J)|(K&(~J)),C,B,A,E,D)}function H(C,B,K,J,A,E,D){return T(B^K^J,C,B,A,E,D)}function I(C,B,K,J,A,E,D){return T(K^(B|(~J)),C,
B,A,E,D)}function S(A,D){var C=(A&65535)+(D&65535);var B=(A>>16)+(D>>16)+(C>>16);return(B<<16)|(C&65535)}function U(A,B){return(A<<B)|(A>>>(
32-B))}function R(D){var C=[];var A=(1<<8)-1;for(var B=0;B<D.length*8;B+=8){C[B>>5]|=(D.charCodeAt(B/8)&A)<<(B%32)}return C}function P(D){
var C="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var J="";for(var B=0;B<D.length*4;B+=3){var E=(((D[B>>2]>>8*(B%4))&
255)<<16)|(((D[B+1>>2]>>8*((B+1)%4))&255)<<8)|((D[B+2>>2]>>8*((B+2)%4))&255);for(var A=0;A<4;A++){if(B*8+A*6<=D.length*32){J+=C.charAt((E>>6
*(3-A))&63)}}}return J}
