/* lib.js */
/* javascript library for silentonline.com */
/* copyright 2008 silentonline.com */

// globals (also set in config_auction.php)
opencloselogow = 85;
opencloselogoh = 123; // still used?

// onload function for curvycorners
// www.curvycorners.net
  window.onload = function()
  {
      /*
      The new 'validTags' setting is optional and allows
      you to specify other HTML elements that curvyCorners
      can attempt to round.

      The value is comma separated list of html elements
      in lowercase.

      validTags: ["div", "form"]

      The above example would enable curvyCorners on FORM elements.
      */
      settings = {
          tl: { radius: 8 },
          tr: { radius: 8 },
          bl: { radius: 8 },
          br: { radius: 8 },
          antiAlias: true,
          autoPad: true,
          validTags: ["div"]
      }

      /*
      Usage:

      newCornersObj = new curvyCorners(settingsObj, classNameStr);
      newCornersObj = new curvyCorners(settingsObj, divObj1[, divObj2[, divObj3[, . . . [, divObjN]]]]);
      */
      var myBoxObject = new curvyCorners(settings, "curved_small");
      myBoxObject.applyCornersToAll();
  }
  


// open a new window
function newwindow(windowurl, windowname, windowparams) {
	var nwindow = window.open(windowurl, windowname, windowparams);
}

// set up navigation to archive pages
function jumpPage(newLoc) {
	newPage = newLoc.options[newLoc.selectedIndex].value;
	if (newPage != "") {
		window.location = newPage;
	}
}
function newPage(pageLoc) {
  	window.location = pageLoc;
}


// ajax functions
var xmlHttp;

function GetXmlHttpObject() {

	var xmlHttp=null;
	try {
		// Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}
	catch (e) {
		//Internet Explorer
		try {
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	
	return xmlHttp;
}


//********** sign in ******************
// parameters username,password - DEPRECATED???
var xmlReq = null;
function signin(theform,theaction) {
	var str = getFormValues(theform); //second argument was "validate"
	xmlHttp=GetXmlHttpObject();
	
	switch (theaction) {
		case 'profile':
			var file="ajax_checkpw.php";
			xmlHttp.onreadystatechange = showbidder;
		break;
		case 'update':
			var file="ajax_updatebidder.php";
			xmlHttp.onreadystatechange = updatebidder;
		break;
	}
   
	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; //for POST
}
function showbidder() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("updatebidder").innerHTML=xmlHttp.responseText;
 	} 
}
function updatebidder() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("updatebidder").innerHTML=xmlHttp.responseText;
		document.getElementById("registerbidder").style.display = 'block';
 	} 
}

//********* mark a bidder as paid *********************
function markpaid(theform) {
	var str = getFormValues(theform);
	xmlHttp=GetXmlHttpObject();

	var file="ajax_markpaid.php";
	xmlHttp.onreadystatechange = bidderpaid;

	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; //for POST
}
function bidderpaid() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		// get the biddersid off the start of the responsetext
		var parseresponse = xmlHttp.responseText;
		var starindex = parseresponse.indexOf("*");
		var biddersid = parseresponse.substr(0,starindex);
		parseresponse = parseresponse.substr(starindex+1);
		var targetid = "bidderpaid" + String(biddersid);

		document.getElementById(targetid).innerHTML=parseresponse;

 	} 
}
//********* remove a watch list item ******************
function remwatch(theform) { // called from bidderprofile to redisplay bidderinfo when an item is removed from the watch list
	var str = getFormValues(theform);
	xmlHttp=GetXmlHttpObject();
	
	var file="ajax_remwatch.php";
	xmlHttp.onreadystatechange = watchlistprofile;
   
	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; //for POST
}
function watchlistprofile() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("watchlistprofile").innerHTML=xmlHttp.responseText;
 	} 
}

//********* send email to a friend ******************
function sendtoafriend(theform) {
	var str = getFormValues(theform); //second argument was "validate"
	xmlHttp=GetXmlHttpObject();
	
	var file="ajax_friendemail.php";
	xmlHttp.onreadystatechange = sentfriend;

	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; //post
}
function sentfriend() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("emailbox").innerHTML=xmlHttp.responseText;
 	} 
}

//********* tell a friend (from auction email - sends an auction email) ******************
function tellafriend(theform) {
	var str = getFormValues(theform);
	xmlHttp=GetXmlHttpObject();
	
	var file="ajax_tellafriendemail.php";
	xmlHttp.onreadystatechange = toldafriend;

	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; //post
}
function toldafriend() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		// first character of response indicates success (T) or failure (N)
		var responsestr = xmlHttp.responseText;
		var testchar = responsestr.charAt(0);
		if (testchar == 'T') {
			document.getElementById("tellafriendbox").innerHTML=xmlHttp.responseText;
		}
		else {
			document.getElementById("emailsuccess").innerHTML=xmlHttp.responseText;
		}
 	} 
}
//********* checkopen ******************
function checkopen(theform) {	// was called from onsubmit in form tag but can't do ajax call and submit form together, readystate hangs at 1
	var str = getFormValues(theform);
	xmlHttp=GetXmlHttpObject();
	
	var file="ajax_checkopen.php";
	xmlHttp.onreadystatechange = checkedopen;

	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	xmlHttp.send(str);
	return xmlHttp; //post
}
function checkedopen() {
	alert('checkedopen start, readystate= ' + xmlHttp.readyState + ', responsestr=' + xmlHttp.responseText);
	var auctionopen = true;
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		// first character of response indicates open (T) or failure (F)
		var responsestr = xmlHttp.responseText;
		var testchar = responsestr.charAt(0);

		if (testchar == 'F') {
			auctionopen = false;
			// second character indicates online auction (o) or live (l)
			testchar = responsestr.charAt(1);
			if (testchar == 'o') {
				alert("The Online Auction has closed.");
			}
			else {
				alert("Live Auction bidding has closed.");
			}
		}
 	} 
 	
  	return auctionopen;
}

//********* checklogin ******************
function checklogin(theform) {

	var str = getFormValues(theform);
	xmlHttp=GetXmlHttpObject();
	var file="ajax_checklogin.php";
	xmlHttp.onreadystatechange = loginresult;

	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; //post
}
function loginresult() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		// see if returned response is preceded by a *.  If so, login was successful and we need to update topnav
		var responsestr = xmlHttp.responseText;
		var testchar = responsestr.charAt(0);

		if (testchar == '*') {
			// strip off the leading *
			responsestr = responsestr.substring(1);
			// update topnav
			document.getElementById("welcome").innerHTML = "Welcome!";
			document.getElementById("topnav").innerHTML= '<ul><li class="first"><a href="mailinglist.php">Mailing List</a></li><li><a style="text-decoration:underline;cursor:pointer;" onclick="logout();">Sign out</a></li><li><a href="bidderprofile.php">My Auction Page</a></li><li><a href="auctionhome.php">Auction Home</a></li></ul>';
			// see if the next char is a b.  If so, this login is from placebid and we need to display the bid fields after successful login.
			testchar = responsestr.charAt(0);
			if (testchar == 'b') {
				// strip off the 'b' and then get the username
				responsestr = responsestr.substring(1);
				document.getElementById("loginnotice_b").style.display = 'none';
				document.getElementById("signin_b").style.display = 'none';
//				document.getElementById("dataentryform2").username.value = responsestr;
				document.getElementById("usernameid").value = responsestr;
				document.getElementById("showplacebid").style.display = 'block';
			}
			else if (testchar == 'c') { //checkout page
				// strip off the 'c' and then get the username
				responsestr = responsestr.substring(1);
				var starindex = responsestr.indexOf("*");
				var usernamestr = responsestr.substr(0,starindex);
				responsestr = responsestr.substr(starindex+1);
				document.getElementById("loginnotice").style.display = 'none';
				document.getElementById("signin").style.display = 'none';
//				document.getElementById("dataentryform2").username.value = usernamestr;
				document.getElementById("usernameid").value = responsestr;
				document.getElementById("winningitems").innerHTML = responsestr;
				document.getElementById("showcheckout").style.display = 'block';
			}
			else if (testchar == 'w') { // did we come from addwatch section of placebid page?
				// strip off the 'w' 
				responsestr = responsestr.substring(1);
				document.getElementById("loginnotice_w").innerHTML = '<p>Welcome back to the auction!<br>Click the button below to add this item to your Watch List.</p>';
				document.getElementById("signin_w").style.display = 'none';
//				document.getElementById("dataentryform5").username.value = responsestr;
				document.getElementById("usernameid").value = responsestr;
				document.getElementById("showaddwatch").style.display = 'block';
			}
			else if (testchar == 'u') { // update bidder page
				// strip off the 'u' 
				responsestr = responsestr.substring(1);
				document.getElementById("loginbox").innerHTML=responsestr;
			}
			else { // login or profile page call to checklogin => update page with returned html
				document.getElementById("loginbox").innerHTML=responsestr;
			}
			
		}
		else {	// unsuccessful login - check for page type to handle error
			if (testchar == 'b') { // placebid
				document.getElementById("loginnotice_b").innerHTML = '<p><span style="color:#ff0000;">Username and Password combination not found.</span><br>Please try again or <a href="registerbidder.php">click here</a> to register.</p>'
			}
			else if (testchar == 'w') { // addwatch
				document.getElementById("loginnotice_w").innerHTML = '<p><span style="color:#ff0000;">Username and Password combination not found.</span><br>Please try again or <a href="registerbidder.php">click here</a> to register.</p>'
			}
			else if (testchar == 'c') { // checkout
				document.getElementById("loginnotice_b").innerHTML = '<p><span style="color:#ff0000;">Username and Password combination not found.</span><br>Please try again.</p>'
			}
			else { // updatebidder or profile
				document.getElementById("loginnotice").innerHTML = '<p><span style="color:#ff0000;">Username and Password combination not found.</span><br>Please try again or <a href="registerbidder.php">click here</a> to register.</p>'
			}
		}
 	} 
}

//********* logout ******************
function logout() {
	var str="";
	xmlHttp=GetXmlHttpObject();

	var file="ajax_logout.php";
	xmlHttp.onreadystatechange = loggedout;

	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; 
}
function loggedout() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 

		document.getElementById("topnav").innerHTML= '<ul><li class="first"><a href="mailinglist.php">Mailing List</a></li><li><a href="login.php">Sign in</a></li><li><a href="bidderprofile.php">My Auction Page</a></li><li><a href="auctionhome.php">Auction Home</a></li></ul>';
		document.getElementById("center").innerHTML = xmlHttp.responseText;
		document.getElementById("welcome").innerHTML = 'Welcome, Guest!';

 	} 
}


//************* increment the clickthrough counter for an ad **************
function adclick(theform) {
	var str = getFormValues(theform);
	xmlHttp=GetXmlHttpObject();
	
	var file="ajax_adclick.php";
	xmlHttp.onreadystatechange = adclicked;

	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; //post
}
function adclicked() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
 	} 
}

//********* get database information for admin functions ******************
function getentryinfo(theform,adminfn) {

	var str = getFormValues(theform);
	xmlHttp=GetXmlHttpObject();
	
	var file="ajax_admin_" + adminfn + ".php";
	switch (adminfn) {			
		case 'remdonor':
			xmlHttp.onreadystatechange = remdonor;
		break;
		case 'upddonor':
			xmlHttp.onreadystatechange = upddonor;
		break;
		case 'remcategory':
			xmlHttp.onreadystatechange = remcategory;
		break;
		case 'updcategory':
			xmlHttp.onreadystatechange = updcategory;
		break;
		case 'rembidder':
			xmlHttp.onreadystatechange = rembidder;
		break;
		case 'updbidder':
			xmlHttp.onreadystatechange = updbidder;
		break;
		case 'remitem':
			xmlHttp.onreadystatechange = remitem;
		break;
		case 'upditem':
			xmlHttp.onreadystatechange = upditem;
		break;
		case 'remad':
			xmlHttp.onreadystatechange = remad;
		break;
		case 'updad':
			xmlHttp.onreadystatechange = updad;
		break;
		case 'remprogram':
			xmlHttp.onreadystatechange = remprogram;
		break;
		case 'updprogram':
			xmlHttp.onreadystatechange = updprogram;
		break;
		case 'remprospect':
			xmlHttp.onreadystatechange = remprospect;
		break;
		case 'updprospect':
			xmlHttp.onreadystatechange = updprospect;
		break;
		
		default:		// add a default case here in case the person hits go without choosing a donor - just go back to the same page
			file="ajax_admin_nonechosen.php";
			xmlHttp.onreadystatechange = nonechosen;
		break;
	}

	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; 
}
function nonechosen() {
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
 	} 
}
function remdonor() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("removedonor").innerHTML=xmlHttp.responseText;
 	} 
}
function upddonor() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("updatedonor").innerHTML=xmlHttp.responseText;
 	} 
}
function remcategory() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("removecategory").innerHTML=xmlHttp.responseText;
 	} 
}
function updcategory() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("updatecategory").innerHTML=xmlHttp.responseText;
 	} 
}
function rembidder() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("removebidder").innerHTML=xmlHttp.responseText;
 	} 
}
function updbidder() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("updatebidder").innerHTML=xmlHttp.responseText;
 	} 
}
function remitem() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("removeitem").innerHTML=xmlHttp.responseText;
 	} 
}
function upditem() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("updateitem").innerHTML=xmlHttp.responseText;
 	} 
}
function remad() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("removead").innerHTML=xmlHttp.responseText;
 	} 
}
function updad() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("updatead").innerHTML=xmlHttp.responseText;
 	} 
}
function remprogram() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("removeprogram").innerHTML=xmlHttp.responseText;
 	} 
}
function updprogram() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("updateprogram").innerHTML=xmlHttp.responseText;
 	} 
}
function remprospect() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("removeprospect").innerHTML=xmlHttp.responseText;
 	} 
}
function updprospect() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
		document.getElementById("updateprospect").innerHTML=xmlHttp.responseText;
 	} 
}

//********* check username to see if it already exists ***********
function checkusername(theform,outcome) {
	var str = getFormValues(theform); //second argument was "validate"

   xmlHttp=GetXmlHttpObject();
   	
   switch (outcome) {
   		case 'availability':
			var file="ajax_checkun.php";
			xmlHttp.onreadystatechange = showunokay;
   		break;
   		
   		case 'emailpw':
    		var file="ajax_emailpw.php";
   			xmlHttp.onreadystatechange = emailpw;
  		break;

   		case 'emailun':
    		var file="ajax_emailun.php";
   			xmlHttp.onreadystatechange = emailun;
  		break;
	}
	
	xmlHttp.open( "POST", file, true );
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // to be able to access POST vars
	xmlHttp.send(str);
	return xmlHttp; //? need this?
}
function showunokay() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 

		var responsestr = xmlHttp.responseText;
		var testchar = responsestr.charAt(0);

		if (testchar == '1') { // username doesn't match any in database
			responsestr = responsestr.substring(1);
			document.getElementById("showunokay").innerHTML='<p class="heavy">Username available.</p>';
			document.getElementById("registerbidder").style.display = 'block';
			document.getElementById("okusername").innerHTML = responsestr;
			//document.getElementById("dataentryform2").username.value = responsestr;
			// or try to set the id of the username input and then target the value of that id?
			document.getElementById("usernameid").value = responsestr;
			
//			document.getElementById("okusername").innerHTML = document.getElementById("dataentryform").username.value;
//			document.getElementById("dataentryform2").username.value = document.getElementById("dataentryform").username.value;
		}
		else {
			document.getElementById("showunokay").innerHTML='<span style="color:#ff0000;">Username not available.  Please choose a different username.</span>';
			document.getElementById("registerbidder").style.display = 'none';
			document.getElementById("okusername").innerHTML = ''; 
		}
 	}
}
function emailpw() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
	
		// responseText doesn't seem to handle string matching, so boolean used
		var userfound = parseInt(xmlHttp.responseText);

		if (userfound) { // successful match and mailing
			document.getElementById("instructions").style.display = 'none';
			document.getElementById("showunokay").innerHTML='<p>Your bidder password was reset.</p><p>A temporary password will be emailed to the email address in your bidder profile.</p>';
			setopacity('submitbutton',100);
		}
		else {
			document.getElementById("showunokay").innerHTML='<p style="color:#ff0000;">The username you entered was not found in bidders database.<br><br>Please try a different username, or <a href="forgotun.php">click here to get an email reminder of your username.</p>';
			setopacity('submitbutton',100);
		}
 	} 
}
function emailun() {
	
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { 
	
		// responseText doesn't seem to handle string matching, so boolean used
		var emailfound = parseInt(xmlHttp.responseText);

		if (emailfound) { // successful match of email address, username email sent
			document.getElementById("showunokay").innerHTML='<p>Your bidder username will be emailed to this address.</p>';
			setopacity('submitbutton',100);
		}
		else {
			document.getElementById("showunokay").innerHTML='<span style="color:#ff0000;"><p>This email address was not found in the Bidders database.</p><p>Please enter the email address you used during Bidder Registration.</p></span>';
			setopacity('submitbutton',100);
		}
 	} 
}


// getFormValues(fobj): get form values, build into a string to be passed to the POST buffer
function getFormValues(fobj) // second argument was valFunc
{
   var str = "";
   var valueArr = null;
   var val = "";
   var cmd = "";
   for(var i = 0;i < fobj.elements.length;i++)
   {
       switch(fobj.elements[i].type)
       {
           case "text":
           case "hidden":
//               if(valFunc)
//                {
//                    use single quotes for argument so that the value of
//                    fobj.elements[i].value is treated as a string not a literal
//                    cmd = valFunc + "(" + 'fobj.elements[i].value' + ")";
//	                  val = eval(cmd)
//      		 }
                str += fobj.elements[i].name +
                 "=" + escape(fobj.elements[i].value) + "&";
                 break;
           case "password":
                     //use single quotes for argument so that the value of
                    //fobj.elements[i].value is treated as a string not a literal
                    cmd = "MD5" + "(" + 'fobj.elements[i].value' + ")";
                    val = eval(cmd)
                str += fobj.elements[i].name +
                 "=" + escape(val) + "&";
            		break;
           case "select-one":
                str += fobj.elements[i].name +
                "=" + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + "&";
                break;
           case "checkbox":
                str += fobj.elements[i].name +
                "=" + fobj.elements[i].value + "&";
                break;
       }
   }
   str = str.substr(0,(str.length - 1));
   return str;
}
 
 
/**
*
* MD5 (Message-Digest Algorithm)
* http://www.webtoolkit.info/
*
**/

var MD5 = function (string) {

    function RotateLeft(lValue, iShiftBits) {
        return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
    }

    function AddUnsigned(lX,lY) {
        var lX4,lY4,lX8,lY8,lResult;
        lX8 = (lX & 0x80000000);
        lY8 = (lY & 0x80000000);
        lX4 = (lX & 0x40000000);
        lY4 = (lY & 0x40000000);
        lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
        if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
            }
        } else {
            return (lResult ^ lX8 ^ lY8);
        }
    }

    function F(x,y,z) { return (x & y) | ((~x) & z); }
    function G(x,y,z) { return (x & z) | (y & (~z)); }
    function H(x,y,z) { return (x ^ y ^ z); }
    function I(x,y,z) { return (y ^ (x | (~z))); }

    function FF(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function GG(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function HH(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function II(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function ConvertToWordArray(string) {
        var lWordCount;
        var lMessageLength = string.length;
        var lNumberOfWords_temp1=lMessageLength + 8;
        var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
        var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
        var lWordArray=Array(lNumberOfWords-1);
        var lBytePosition = 0;
        var lByteCount = 0;
        while ( lByteCount < lMessageLength ) {
            lWordCount = (lByteCount-(lByteCount % 4))/4;
            lBytePosition = (lByteCount % 4)*8;
            lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
            lByteCount++;
        }
        lWordCount = (lByteCount-(lByteCount % 4))/4;
        lBytePosition = (lByteCount % 4)*8;
        lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
        lWordArray[lNumberOfWords-2] = lMessageLength<<3;
        lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
        return lWordArray;
    };

    function WordToHex(lValue) {
        var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
        for (lCount = 0;lCount<=3;lCount++) {
            lByte = (lValue>>>(lCount*8)) & 255;
            WordToHexValue_temp = "0" + lByte.toString(16);
            WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
        }
        return WordToHexValue;
    };

    function Utf8Encode(string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    };

    var x=Array();
    var k,AA,BB,CC,DD,a,b,c,d;
    var S11=7, S12=12, S13=17, S14=22;
    var S21=5, S22=9 , S23=14, S24=20;
    var S31=4, S32=11, S33=16, S34=23;
    var S41=6, S42=10, S43=15, S44=21;

    string = Utf8Encode(string);

    x = ConvertToWordArray(string);

    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

    for (k=0;k<x.length;k+=16) {
        AA=a; BB=b; CC=c; DD=d;
        a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
        d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
        c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
        b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
        a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
        d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
        c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
        b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
        a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
        d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
        c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
        b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
        a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
        d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
        c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
        b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
        a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
        d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
        c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
        b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
        a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
        d=GG(d,a,b,c,x[k+10],S22,0x2441453);
        c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
        b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
        a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
        d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
        c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
        b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
        a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
        d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
        c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
        b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
        a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
        d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
        c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
        b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
        a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
        d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
        c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
        b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
        a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
        d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
        c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
        b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
        a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
        d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
        c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
        b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
        a=II(a,b,c,d,x[k+0], S41,0xF4292244);
        d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
        c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
        b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
        a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
        d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
        c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
        b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
        a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
        d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
        c=II(c,d,a,b,x[k+6], S43,0xA3014314);
        b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
        a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
        d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
        c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
        b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
        a=AddUnsigned(a,AA);
        b=AddUnsigned(b,BB);
        c=AddUnsigned(c,CC);
        d=AddUnsigned(d,DD);
    }

    var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);

    return temp.toLowerCase();
}
//
// add this to form field where 'enter' should cause submit:  onKeyPress="return submitenter(this,event)"
function submitenter(myfield,e)
{
var keycode;
if (window.event) keycode = window.event.keyCode;
else if (e) keycode = e.which;
else return true;

if (keycode == 13)
   {
   myfield.form.submit();
   return false;
   }
else
   return true;
}

// Add the following attribute into each input type="text" tag(s) in your form: onkeypress="return noenter()"
function noenter() {
  return !(window.event && window.event.keyCode == 13); }

function setopacity(whichid,newopacity) {
	var element = document.getElementById(whichid);
	element.style.filter = 'alpha(opacity=' + newopacity + ');';
//	element.style.-moz-opacity = '.' + newopacity + ';';
	element.style.opacity = newopacity/100;
}

// form validation
function checkEmail (strng) {
var error="";
if (strng == "") {
   error = "You didn't enter an email address.  ";
}

    var emailFilter=/^.+@.+\..{2,3}$/;
    if (!(emailFilter.test(strng))) { 
       error = "Please enter a valid email address.  ";
    }
    else {
//test email for illegal characters
       var illegalChars= /[\(\)\<\>\,\;\:\\\"\[\]]/
         if (strng.match(illegalChars)) {
          error = "The email address contains illegal characters.  ";
       }
    }
return error;    
}
function validatePassword(fld) {
    var error = "";
    var illegalChars = /[\W_]/; // allow only letters and numbers 
 
    if (fld.value == "") {
        error = "Please enter a password.  ";
    } 
    else if ((fld.value.length < 5) || (fld.value.length > 10)) {
        error = "The password must be between 5 and 10 characters.  ";
    } 
    else if (illegalChars.test(fld.value)) {
        error = "The password contains illegal characters.  ";
    } 
    
   return error;
}  
function checkPhone (strng) {
var error = "";
if (strng == "") {
   error = "You didn't enter a phone number.  ";
}

var stripped = strng.replace(/[\(\)\.\-\ ]/g, ''); //strip out acceptable non-numeric characters
    if (isNaN(parseInt(stripped))) {
       error = "The phone number contains illegal characters.";
  
    }
    if (!(stripped.length == 10)) {
	error = "The phone number is the wrong length. Make sure you included an area code.  ";
    } 
return error;
}


function nocommas(thevalue) {
	
	var beforecomma;
	var aftercomma;
	var commaindex;
	var numberstring = thevalue;
	
	while ((commaindex = numberstring.indexOf(",")) >= 0) {
		beforecomma = numberstring.substr(0,commaindex);
		aftercomma = numberstring.substring(commaindex+1);
		numberstring = beforecomma + aftercomma;
	}	
	return numberstring;
}

function IsNumeric(strString)
   //  check for valid numeric strings	
   {
   var strValidChars = "0123456789.-";
   var strChar;
   var blnResult = true;

   if (strString.length == 0) return false;

   //  test strString consists of valid characters listed above
   for (i = 0; i < strString.length && blnResult == true; i++)
      {
      strChar = strString.charAt(i);
      if (strValidChars.indexOf(strChar) == -1)
         {
         blnResult = false;
         }
      }
   return blnResult;
   }
function valUsername(theForm) {
	var unerror = validateUsername(theForm.username);
	if  (unerror != "") {
		alert(unerror);
		theForm.username.value = "";
		theForm.username.focus();
		return false;
	}
	return true;
}

function validateUsername(fld) {
    var error = "";
    var illegalChars = /\W/; // allow letters, numbers, and underscores
 
    if (fld.value == "") {
        error = "Please enter a username.  ";
    } else if ((fld.value.length < 5) || (fld.value.length > 10)) {
        error = "The username must be between 5 and 10 characters.  ";
    } else if (illegalChars.test(fld.value)) {
        error = "The username contains illegal characters.  ";
    } 
     
    return error;
}
function validateName(fld) {
    var error = "";
    var illegalChars = /\W/; // allow letters, numbers, and underscores
 
    if (fld.value == "") {
        error = "Please enter a first and last name.  ";
    } else if (fld.value.length > 20) {
        error = "The first and last names must be 20 characters or less.  ";
    } else if (illegalChars.test(fld.value)) {
        error = "A name field contains illegal characters.  ";
    } 

    return error;
}

