/* COPYRIGHT DREW WALLER - fizzstream 2004 - 2009*/
/* reversion 3 Feb 2008. Calculate multiple variable shipping rates in child datasets  */
/* reversion 4 Mar 2008. Add Protx integration    
/* reversion 16 Nov 2008. integration  with multi-product offline generator                                                       */
/* Base64 encode/decode public domain code from Tyler Akins -- http://rumkin.com */

       	var showDetail=false;var isIE=false;var badEmailFlag=true;
	var custName=custEMail="";
    GBPsym="&pound;";
    EURsym="&euro;";
    USDsym="$";
    currfactor=1;
    currsym=GBPsym;
    currcode="GBP";
    shipvalue=0;minShip=CONSTminShip=2;
   	var isIE = (window.navigator.userAgent.indexOf("MSIE") > 0);
	shippingPointer=0;

	/* for protx testing - first, safe characters for base64 encoding */
	var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	var init="ddw";																											init="foxylady";
	/* switch between servers here 0=simulator, 1=test, 2=live - any other number will do internal checks*/
	var vspSwitch=1;

	/* set a safe default and override after */
	var vspURL="http://www.hackup.co.uk/shop/paypal_vars.asp";
	var vspAct="";
	init=simpXOR(decodeBase64("CAAPWQMZHVkKDhwA"),init);


	/* Order constructor */
	function LineItem(desc,price,qty,suid,ship,shipa,currency,pointer) {
 		this.desc = desc;
 		this.price = price;
 		this.qty = qty;
 		this.suid = suid;
 		this.unitprice = price;
		this.ship = ship;
		this.unitship = shipa;
		this.currency = currency;
		this.shippoint = pointer;
		this.discount=discfactor;
	};

	/* define Order() constructor */
	function Order() {
		this.orders = new Array(arguments.length);
		for(i=0;i<arguments.length;i++){
   		    this.orders[i] = arguments[i];
		}
	
 	/* Order total method */
 	     this.totalPrice = function(n) {
//shipvalue=0;
   		var totalCost = new Number(0.00);
   		for(i=0;i<this.orders.length;i++){
		   if(n=="price") {
		     this.orders[i].price=((this.orders[i].unitprice*currfactor)*discfactor)*this.orders[i].qty;
		   }else{
		     adjustedCutOff=globalShippingCutOff*currfactor;		
		      if ((globalProductCost >= adjustedCutOff) && globalShippingDiscount) {
			this.orders[i].ship=0;shipvalue=0;
		      } else {
		     	this.orders[i].ship=(this.orders[i].unitship[shippingPointer]*currfactor)*this.orders[i].qty;
			shipvalue+=this.orders[i].ship;
		      }
		   }
     		     totalCost += (n=="price"?this.orders[i].price:this.orders[i].ship);
		     this.orders[i].currency = currcode;
   		}
		totalCost=totalCost.toFixed(2);
		globalProductCost=(n=="price"?totalCost:globalProductCost);
 		return totalCost;
	    };

 	/* Order recalc based on new shipping - Feb 2008 */
 	     this.recalcPrice = function(p) {
   		var totalCost = new Number(0.00);
//shipvalue=0;
   		for(i=0;i<this.orders.length;i++){
		      if ((globalProductCost >= adjustedCutOff) && globalShippingDiscount) {
			this.orders[i].ship=0;shipvalue=0;
		      } else  {
			if (shipvalue < minShip) {
			     this.orders[i].ship=(i==0?minShip:0);
			} else {
			     this.orders[i].ship=(this.orders[i].unitship[p]*currfactor)*this.orders[i].qty;
			}
		      // shipvalue+=this.orders[i].ship;

		      }
     		     totalCost += this.orders[i].ship;
		     this.orders[i].shippoint=p;		
   		}
//alert(shipvalue+" "+globalProductCost+" "+adjustedCutOff);

		totalCost=totalCost.toFixed(2);
 		return totalCost;
	     } ;

	/* remove item method (by desc[ription] comparison */
  	     this.removeItem = function(toRemove) {
		var iQty=0;
      		for (var j=0; j < this.orders.length; j++) {
            		     if ( toRemove == this.orders[j].suid) {
		        this.orders[j].qty--;
		        iQty=this.orders[j].qty;
		        this.orders[j].price-=Math.abs(((this.orders[j].unitprice * currfactor) * discfactor).toFixed(2));
		        this.orders[j].ship-=this.orders[j].unitship[shippingPointer]*currfactor;
shipvalue-=this.orders[j].ship;
		        if (this.orders[j].qty==0) {
                		              this.orders.splice(j, 1);
		        }
            		     }
        		}
	     return iQty;
  	     };

	/* add item method
	*/
 	this.addLineItem = function(obj) {
		var lineIndex=null;
		       if (obj.suid !=null ) {
		          for (var i=0; i<this.orders.length;i++) {
			if (obj.suid==this.orders[i].suid) {
			   this.orders[i].qty++;
			   this.orders[i].price+=Math.abs(((obj.unitprice * currfactor) * discfactor).toFixed(2));
			   this.orders[i].ship+=obj.unitship[shippingPointer] * currfactor; 
			   this.orders[i].currency=obj.currency;
			   this.orders[i].shippoint=shippingPointer;
			   lineIndex=i;
			   break;
		       	} 
		           }
			if (lineIndex==null) {
			   this.orders.push(obj);
			   lineIndex=this.orders.length-1;
			   this.orders[lineIndex].price=Math.abs(((obj.unitprice * currfactor) * discfactor).toFixed(2));
			   this.orders[lineIndex].currency=obj.currency;
			   this.orders[i].shippoint=shippingPointer;
		       	}
		       } else {
			this.orders.push(obj);
			lineIndex=this.orders.length-1;
			this.orders[lineIndex].price=Math.abs(((obj.unitprice * currfactor) * discfactor).toFixed(2));
			this.orders[lineIndex].currency=obj.currency;
			this.orders[i].shippoint=shippingPointer;
		       }
	     return lineIndex;
	     };

	/* utility methods */
  	    this.length = new Function("return this.orders.length");
  	    this.averagePrice = new Function("return this.totalPrice()/this.orders.length");
	};

	/* Instantiate Order -  IN persist.js window.onload*/
	thisOrder=new Order();

	/* HTML specific rendering utility functions */
	/* next three functions are interface drilldown show and hide (contents) - unused */

	function detShowHide(t) {
              var binPlus=/\+/.test(t.innerHTML);
              var binMinus=/\-/.test(t.innerHTML);
		if ( !(binPlus || binMinus)) { return true; };

		if (binPlus) {
	   	   t.innerHTML=t.innerHTML.replace(/\+/g,"-");
	  	  showDet(t);
		}
		if (binMinus) {
	   	   t.innerHTML=t.innerHTML.replace(/\-/g,"+");
	   	   hideDet(t);
		}
	};

	function showDet(d) {
	   var z="d_"+d.parentNode.id;

	/* kludge due Mozilla/IE differences in childnodes/empty innerHTML checking !!
	   'describe' will at least contain a vowel if there's content !!
	*/
	   if (/a|e|i|o|u/gi.test(document.getElementById(z).innerHTML)) {
	       document.getElementById(z).style.display="block";
	   }
	return true;
	};

	function hideDet(d) {
	   var z="d_"+d.parentNode.id;
	   document.getElementById(z).style.display="none";
		if(isIE) { 
		      showDetail=false; 
		}
	   return true;
	};


	function OrderAdd(s,n,id,c,ix) {
		n=Math.abs(n);
		d=c[ix];
		d=Math.abs(d);
		objS=new LineItem(s,n,1,id,d,c,currcode,shippingPointer);
		var itemNum=thisOrder.addLineItem(objS);
		objS=null;
		//var itemDisplay=DisplayAllOrders();
	    	//document.getElementById("ticket").innerHTML=itemDisplay;
		showOrderTotal();
		return true;
	};

	function OrderDisplay(id,txt,num,amt) {
		var domstr="<table class=\"lister\" border=\"0\">"
			+"<tr>"
			+"<td class=\"txt\">"+txt
			+"</td><td class=\"currency\"><strong>"+currsym+amt+"</strong>"
			+"</td><td class=\"small\"><div class=\"orderItem\" id=\""+num+"\">"
			+"<img src=\"assets/box_minus.gif\" alt=\"Delete item\" onclick=\"OrderRemove('"+id+"')\" "
			+"class=\"clearoff\" title=\"Delete\"/></div></td></tr></table>";

		return domstr;
	};

	function OrderRemove(t) {
	    thisOrder.removeItem(t); //.parentNode.id);
	    //document.getElementById("ticket").innerHTML=DisplayAllOrders();
	    showOrderTotal();
	    return true;
	} ;

	function showOrderTotal() {
	    var tmp=thisOrder.totalPrice("price");
	    shipvalue=Math.abs(thisOrder.totalPrice("ship"));
	    minShip=CONSTminShip*currfactor;
	    var tmpship=thisOrder.recalcPrice(shippingPointer);

	    tmp=(Math.abs(tmp)+Math.abs(tmpship)).toFixed(2);
//alert("minShip:  "+minShip+" shipvalue: "+shipvalue+" currfactor: "+currfactor);
	//    generateCartCookie();
	    //document.getElementById("totals").innerHTML+="<span>"+currsym+tmp+"</span>";
	    	document.getElementById("ticket").innerHTML=DisplayAllOrders();
	//           	document.getElementById("totalright").innerHTML="Order Total: "+currsym+tmp;

	};

	function recalcOrderTotal() {
	    var tmp=thisOrder.totalPrice("price");
	    shipvalue=Math.abs(thisOrder.totalPrice("ship"));
	    minShip=CONSTminShip*currfactor;
//alert("minShip:  "+minShip+" shipvalue: "+shipvalue+" currfactor: "+currfactor);
	//    var tmpShip=shipvalue==0?0:Math.max(minShip,shipvalue);
	    var tmpship=thisOrder.recalcPrice(shippingPointer);
	    tmp=(Math.abs(tmp)+Math.abs(tmpship)).toFixed(2);
	//    generateCartCookie();
		var itemDisplay=DisplayAllOrders();
	    	document.getElementById("ticket").innerHTML=itemDisplay;
	//	document.getElementById("totalright").innerHTML="Order Total: "+currsym+tmp;
	};

	function DisplayAllOrders() {
		var domstr=plural="",tqty=ship=tot=overtot=0;
		for (var i=0;i < thisOrder.length();i++) {
		     var qty=thisOrder.orders[i].qty;
		     var qtystr=qty>1?" ("+qty+")":"";
		tqty+=qty;
		     var id=thisOrder.orders[i].suid;
		     var desc=thisOrder.orders[i].desc+"<strong>"+qtystr+"</strong>";
		     var itemNum=i+1;
		     var curr=thisOrder.orders[i].price.toFixed(2);
		     tot+=Math.abs(curr);
		     ship+=Math.abs(thisOrder.orders[i].ship);
		     domstr+=OrderDisplay(id,desc,itemNum,curr);
		}
	overtot=(Math.abs(tot)+Math.abs(ship)).toFixed(2);	
	// now tabbed panel
	plural=tqty<=1?"":"s";
	var hilite=discfactor==1?"black":"red";
	var showmsg=discfactor==0.8?"Armed Forces Discount":discfactor==0.9?"Member Discount Applied":"";
	var enabler=discfactor==1?"":"disabled=\"disabled\"";
	 if(i == 0) {
		tabpanel.showPanel(0);
		document.getElementById("totals").innerHTML="Cart Empty";
		document.getElementById("totalright").innerHTML="";
		//document.getElementById("totals").style.backgroundColor="";
	  } else {
		var advisory=badEmailFlag?"<br/><strong>If you wish to receive a confirmation email of your order from Protx, you will need to to add a valid email address in the panel to the left.</strong>":"";
		document.getElementById("totals").innerHTML="<span style=\"padding-left:2px;\">("+tqty+") item"+plural+" </span><span>"+currsym+overtot+"</span>";
		document.getElementById("totalright").innerHTML="("+tqty+") item"+plural+" "+currsym+overtot;
		ship=ship.toFixed(2);
		domstr+="<div style=\"text-align:right;margin-right:25px;margin-top:10px;font-family:tahoma,helvetica,sans-serif;font-weight:bold;font-size:10pt;\">Shipping: "+currsym+ship+"</div>";
		domstr+="<div style=\"text-align:right;margin-right:25px;margin-top:10px;font-family:tahoma,helvetica,sans-serif;font-weight:bold;font-size:10pt;\">Total       : "+currsym+overtot+"</div>";
	//	domstr+="<div class=\"OrderBtn\">Disconnected from PSP<br/><img style=\"cursor:pointer;margin-top:3px;\" src=\"assets/btn_buynowCC_LG.gif\" onclick=\"tmpDB()\"/></div>";
		domstr+="<div class=\"OrderBtn\">Pay by PayPal<br/><img style=\"cursor:pointer;margin-top:3px;\" src=\"assets/btn_buynowCC_LG.gif\" onclick=\"doPayPal()\"/></div>";
		domstr+="<div style=\"text-align:left;/margin-top:10px;font-weight:bold;\">";
		domstr+="Enter your SOA (your letter and number e.g. U124) or 20th Century Wargamers Club Membership number (just your 5 digit member number e.g. 00001) ";
		domstr+="below or, for current and ex-Military service personnel, enter \"ARMED FORCES\"<br/>";
		domstr+="<span style=\"color:red;\">Discount Code:</span> <input type=\"text\" id=\"dcode\" "+enabler+" onblur=\"setDisc(this)\" value=\""+showmsg+"\" ";
		domstr+="onkeypress=\"keyCode=event.keyCode ?event.keyCode : event.which ; if(keyCode==13){this.blur();return false;}\"/></div>";

// <input type=\"button\" value=\"Click to Order\" onclick=\"tmpDB()\"/>
	//	domstr+="<div class=\"OrderBtn\">Pay by PayPal<br/><img style=\"cursor:pointer;margin-top:3px;\" src=\"assets/btn_buynowCC_LG.gif\" onclick=\"doPayPal()\"/></div>";
	//	domstr+="<div class=\"OrderBtn2\">Pay by Protx<br/><img style=\"cursor:pointer;margin-top:3px;\" src=\"assets/protx.gif\" onclick=\"doProtx()\"/></div>";
		domstr+="<div class=\"clr\"></div>";
		domstr+="<div id=\"dbug\"><!--Clicking the buttons above will link to our <span style=\"color:#00b77b;font-weight:bold;\">SECURE</span> payment pages on either "
			+"<span style=\"font-weight:bold;\">PROTX</span> "
			+"or PayPal. "+advisory+"-->";
			+"</div>";
	  }
	   return domstr;
	};

	
	function tmpDB(){
		var tb=""
		//tb+="<strong>This is a representation of the Order JSON object ready for transmission to a Payment Service Provider - </strong><br/></br/><br/>";
		tb+=Fizz.Utils.serializeObject(thisOrder.orders);
		document.getElementById('dbug').innerHTML=tb;
	};
	function generateCartCookie() {
		var sb=""
		//sb+="<strong>This is a representation of the Order JSON object ready for transmission to a Payment Service Provider - </strong><br/></br/><br/>";
		sb+=escape(Spry.Utils.serializeObject(thisOrder.orders));
		document.cookie = "fs_cart=" + sb;
	};


	function formatMoney(fp) { 
		return fp.toFixed(2);
	};


/* PayPal */
	function doPayPal(){
		var r="http://www.3vwargames.co.uk/" ;  
		var cr="http://www.3vwargames.co.uk/index.html" ;  
		var u=self.location.href
		var ustr=u.substr(0,u.lastIndexOf("/"));
		var uniqueID=new Date().getTime();
		//var currcode="GBP";

		sform="<form id='ppform' action='https://www.paypal.com/cgi-bin/webscr' method='POST' target='_self'>"
		  +"<input type='hidden' name='cmd' value='_cart'/>"
		  +"<input type='hidden' name='business' value='sales@3vwargames.co.uk'/>"
		  +"<input type='hidden' name='item_name' value='"+uniqueID+"'/>"
		  +"<input type='hidden' name='currency_code' value='"+currcode+"'/>"
		  +"<input type='hidden' name='return' value='"+r+"'/>"
		  +"<input type='hidden' name='cancel_return' value='"+cr+"'/>"
		  +"<input type='image' name='submit' src='mybutt.gif' style='visibilty:hidden;' onerror='return false;'/>"
		  +"<input type='hidden' name='upload' value='1'/>";
		sform+=getBasketContent();

		sform+="</form>";
		document.getElementById("payForm").innerHTML=sform;
	//	document.getElementById('dbug').innerHTML=currcode;

		document.getElementById("ppform").submit();
		document.getElementById("payForm").innerHTML="";
	};

	function getBasketContent() {
		var x="",cnt=0;
		for (var i=0;i < thisOrder.length();i++) {
		     cnt=i+1;
		     var qty=thisOrder.orders[i].qty;
		     var ship=thisOrder.orders[i].ship.toFixed(2); //unitship.toFixed(2);
		     var desc=thisOrder.orders[i].desc;
		     var price=((thisOrder.orders[i].unitprice*currfactor)*discfactor).toFixed(2);
		//     var price=(thisOrder.orders[i].price).toFixed(2) ;

		     x+="<input type=\"hidden\" name=\"quantity_"+cnt+"\" value=\""+qty+"\"/> \
		            <input type=\"hidden\" name=\"shipping_"+cnt+"\" value=\""+ship+"\"/> \
		            <input type=\"hidden\" name=\"item_name_"+cnt+"\" value=\""+desc+"\"/> \
		            <input type=\"hidden\" name=\"amount_"+cnt+"\" value=\""+price+"\"/>";
		}
	  return x;
	};
	
	function swapCurrency(evt,nc){ /* not used this implement */
	  currcode=nc;
	  currfactor=eval(nc);
	  currsym=eval(nc+"sym");
	  adjustedCutOff=globalShippingCutOff*currfactor;
	  minShip=CONSTminShip*currfactor;
	   if(evt=="click" && thisOrder.orders.length > 0 ) {
	     showOrderTotal();
	   }
	};
 
	function getPayPalHelp(){
		var src_url="https://www.paypal.com/cgi-bin/webscr?cmd=_help-ext&source_page=_home";
		newWindow = window.open(src_url,"newWindow","menubar=1,scrollbars=1,resizable=1,status=1,location=1,width=720,height=500,left=40,top=20");  
	};

/* Protx - added 10 March 2008 */

/* */
	function doProtx() {
	     if (vspSwitch==0) {	
	     	vspURL="https://ukvpstest.protx.com/VSPSimulator/VSPFormGateway.asp";
	    	vspAct=simpXOR(decodeBase64("GAEbFRkRSBAKOCc9AyUWZg=="),init); 
	     } else if (vspSwitch==1) {
	     	vspURL="https://ukvps.protx.com/vspgateway/service/vspform-register.vsp";
	     	vspAct=simpXOR(decodeBase64("BAwla1xNGlUoGCAhCFoRWg=="),init);
	     }

	    var totalnett=thisOrder.totalPrice("price");
	    var totalship=thisOrder.totalPrice("ship");
	    var totals=(Math.abs(totalnett)+Math.abs(totalship)).toFixed(2);
	    var encryptedField="";
		var buildForm="";
		buildform="<form id='pxform' action='"+vspURL+"' method='POST' target='_self'>"
		  +"<input type='hidden' name='VPSProtocol' value='2.22'/>"
		  +"<input type='hidden' name='TxType' value='PAYMENT'/>"
		  +"<input type='hidden' name='Vendor' value='oxyfizz'/>";
		  encryptedField=genCryptField(totals,totalship) ;

		/* nb - double quote 'encryptedField' for transmission */
		 buildform+="<input type='hidden' name='Crypt' value='"+encryptedField+"'/>"
		
		buildform+="</form>";

		document.getElementById("payForm").innerHTML=buildform;
		document.getElementById("pxform").submit();
		document.getElementById("payForm").innerHTML="";
		
	};

	function genCryptField(totals,totalship) {
	//	custName="";custEMail="drew@fizzequestrian.co.uk";
		custEMail=badEmailFlag?"":custEMail;
		var cfield=basketContent="";
		var strAct=vspAct; 
		var generalDesc="Your purchase from Hackup Ltd - UK Suppliers of Equine Oxyshot.";
		var authorisedEmailHeadingToClient="Thank you for your order from Hackup Ltd - UK Suppliers of Equine Oxyshot. "
					          +"Your order will be despatched immediately.";

		var ourTxID="oxy_"+new Date().getTime()+"_"+randomString(3);
		cfield+="VendorTxCode="+ourTxID+"&"
		        +"Amount="+totals+"&"
		        +"Currency=GBP&"
		        +"Description="+generalDesc+"&"
		        +"SuccessURL=http://www.hackup.co.uk/shop/thankyou.asp&"
		        +"FailureURL=http://www.hackup.co.uk/shop/cancelback.asp&"
		        +"CustomerName="+custName+"&"
		        +"CustomerEMail="+custEMail+"&"
		        +"VendorEMail=sales@hackup.co.uk&"
		        +"eMailMessage="+authorisedEmailHeadingToClient+"&";

		basketContent=getProtxBasketContent();
		cfield+="basket="+basketContent;    
		cfield+="Delivery:::::"+totalship;
		cfield=encodeBase64(simpXOR(cfield,strAct));

		return cfield;
	};

	function getProtxBasketContent() {
		var cart="",cnt=thisOrder.length();
		cart+=(cnt+1)+":"; 			// we're manually adding a row for delivery charges
		for (var i=0;i < cnt;i++) {
		     var qty=thisOrder.orders[i].qty;
		     var desc=thisOrder.orders[i].desc;
		     var price=thisOrder.orders[i].unitprice.toFixed(2);
		     var lineprice=(price*qty).toFixed(2);
		     cart+=desc+":"+qty+":"+price+":::"+lineprice+":" ;
		}
	  /* strip the trailing colon below ONLY if we're not adding a delivery total row - ('cart+=cnt' above) 
	     ie only rows in order constructor */
	  //cart=cart.substr(0,cart.length-1);
	  return cart;

	};

	 function randomString(length) {
   		chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
  		 pass = "";

  		 for(x=0;x<length;x++) {
      			i = Math.floor(Math.random() * 62);
      			pass += chars.charAt(i);
   		}

   		return pass.toString();
	};

	function simpXOR(instr, pwd) {
	 var enc_str="";
	 var pwindex=0;
	  for(var i=0; i<instr.length; i++) {
	    enc_chr = parseInt(instr.charCodeAt(i)) ^ parseInt(pwd.charCodeAt(pwindex));
	      pwindex++;
	      if(pwindex==pwd.length) {
	        pwindex=0;
	      } 
	   enc_str += String.fromCharCode(enc_chr);
	  }
	  return enc_str;
	};

	function encodeBase64(input) {
	   var output = "";
	   var chr1, chr2, chr3;
	   var enc1, enc2, enc3, enc4;
	   var i = 0;

	   do {
	      chr1 = input.charCodeAt(i++);
	      chr2 = input.charCodeAt(i++);
	      chr3 = input.charCodeAt(i++);

	      enc1 = chr1 >> 2;
	      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
	      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
	      enc4 = chr3 & 63;

	      if (isNaN(chr2)) {
	         enc3 = enc4 = 64;
	      } else if (isNaN(chr3)) {
	         enc4 = 64;
	      }

	      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
	      keyStr.charAt(enc3) + keyStr.charAt(enc4);
	   } while (i < input.length);
   
	   return output;
	};

	function decodeBase64(input) {
	   var output = "";
	   var chr1, chr2, chr3;
	   var enc1, enc2, enc3, enc4;
	   var i = 0;

	   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
	   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

	   do {
	      enc1 = keyStr.indexOf(input.charAt(i++));
	      enc2 = keyStr.indexOf(input.charAt(i++));
	      enc3 = keyStr.indexOf(input.charAt(i++));
	      enc4 = keyStr.indexOf(input.charAt(i++));

	      chr1 = (enc1 << 2) | (enc2 >> 4);
	      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
	      chr3 = ((enc3 & 3) << 6) | enc4;

	      output = output + String.fromCharCode(chr1);

	      if (enc3 != 64) {
	         output = output + String.fromCharCode(chr2);
	      }
	      if (enc4 != 64) {
	         output = output + String.fromCharCode(chr3);
	      }
	   } while (i < input.length);

	   return output;
	};


	function entryHelp(field) {
		badEmailFlag=true;
		document.getElementById("inputMessage").style.color="white";
		document.getElementById("inputMessage").innerHTML="Your email address";
			var checkStr=new String(field.value);
			if (checkStr=="") {
				return true;
			}

			if ( !checkStr.IsEmail()) {
				document.getElementById("inputMessage").style.color="yellow";
				document.getElementById("inputMessage").innerHTML="Please enter a valid email";
				if (document.getElementById("dbug")) {
				     document.getElementById("dbug").innerHTML="Clicking the buttons above will link to our "
					+"<span style=\"color:white;font-weight:bold;\">SECURE</span> payment pages on either "
					+"<span style=\"font-weight:bold;\">PROTX</span> "
					+"or PayPal. <br/><strong>If you wish to receive a confirmation email of your order from Protx, "
					+"you will need to to add a valid email address in the panel above.</strong>";
				}	
				return false;
			} else {
				badEmailFlag=false;
				custEMail=checkStr;
				if (document.getElementById("dbug")) {
				     document.getElementById("dbug").innerHTML="Clicking the buttons above will link to our "
					+"<span style=\"color:white;font-weight:bold;\">SECURE</span> payment pages on either "
					+"<span style=\"font-weight:bold;\">PROTX</span> "
					+"or PayPal. ";
				}		
			}
		return true;
	};

	function setDisc(t) 	{
		if ( /^[a-z0-9]{4,5}$/i.test(t.value)) {
			discfactor=dfMember;
			document.cookie = "fsFactor=" + discfactor;
			document.cookie = "fs_code=" + t.value;
			showOrderTotal();
		} else if (/^ARMED FORCES$/i.test(t.value)) {
			discfactor=dfMilitary;
			document.cookie = "fsFactor=" + discfactor;
			document.cookie = "fs_code=" + t.value;
			showOrderTotal();
		}
		//document.getElementById('dcode').value="No Discount";	
		//alert(re.test(t.value));
	};

/* ------------------------------------------------ */

function IsEmailAddress() {
	var s = "", re;
	//retrieve email instance.
	s = "" +this + "";

	//length check: remove leading and trailing spaces and then test length.
	//x@x.xx is the smallest address... that's 6 characters. so, length
	//must be greater than 5 to continue.
	s = s.replace(/^\s*|\s*$/g, "");
	if (s == "undefined" || s.length < 6) {return false;}

	//test for spaces before checking syntax. spaces are illegal 
	//in an email address. if a space is found, it's definitely an illegal address:
	re = /\s+/g
	if (re.test(s)) {return false;}

	//validate email address syntax and remove any emails that don't 
	//match the basic syntax pattern below.
	re = /^(\w|[^_]\.|[\-])+((\@){1}([^_]))(([a-z]|[\d]|[\-]|\.)+|([^_]\.[^_])*)+\.[a-z]{2,6}$/i
	if (!re.test(s)) {return false;}

	//validate domain part of the email against all known TLDs as of May 2001 
	re = /\.(a[c-gil-oq-uwz]|b[a-bd-jm-or-tvwyz]|c[acdf-ik-orsuvx-z]|d[ejkmoz]|e[ceghr-u]|f[i-kmorx]|g[abd-ilmnp-uwy]|h[kmnrtu]|i[delm-oq-t]|j[emop]|k[eg-imnprwyz]|l[a-cikr-vy]|m[acdghk-z]|n[ace-giloprtuz]|om|p[ae-hk-nrtwy]|qa|r[eouw]|s[a-eg-ort-vyz]|t[cdf-hjkm-prtvwz]|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[admrw]|com|edu|net|org|mil|gov|biz|pro|aero|coop|info|name|museum)$/i
	if (!re.test(s)) {return false;}

	//fix the .. problem...
	re = /\.\./
	if (re.test(s)) {return false;}

	//fix the @@ problem...
	re = /\@\@/
	if (re.test(s)) {return false;}

return true;
}

String.prototype.IsEmail = IsEmailAddress;

function getCookie(sName)
{
  // cookies are separated by semicolons
  var aCookie = document.cookie.split("; ");
  for (var i=0; i < aCookie.length; i++)
  {
    // a name/value pair (a crumb) is separated by an equal sign
    var aCrumb = aCookie[i].split("=");
    if (sName == aCrumb[0]) 
      return unescape(aCrumb[1]);
  }

  // a cookie with the requested name does not exist
  return "";
};

function createCookie(name,value,mins) { /*days) {*/
	//if (days) {
	if (mins) {

		var date = new Date();
		//date.setTime(date.getTime()+(days*24*60*60*1000));
		date.setTime(date.getTime()+(mins*60*1000));

		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+";"; /*path=/";*/
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
};






