// JavaScript Document

/*
To Do List/Bugs

1. Rate this wine

8. Personal Cellar
9. Shareef's Cellar

*/

$(function() {
	// initialize scrollable
	
	
	$("div.regionscrollable").scrollable({ 
        vertical:true,
		size:4
    }).mousewheel();	
	$("div.vintagescrollable").scrollable({ 
        vertical:true,
		size:4
    }).mousewheel();	
	$("div.varietalscrollable").scrollable({ 
        vertical:true,
		size:4
    }).mousewheel();	
	$("div.stationscrollable").scrollable({ 
        vertical:true,
		size:4
    }).mousewheel();	
	
	// Initialize Global Objects/Variables Namespace (holder for global variables)
	$.ColumnVariables = {};
	$.ColumnTemplates = {};
	initializeColumnTemplates();
	loadRegions();
	loadVintages();
	loadVarietals();
	loadStations();
	initializeModalDialogs();
	checkAndDisplayLogin();
	
});
function doNothing(){}
function nextRegionPage(){var api = $("div.regionscrollable").scrollable();api.nextPage();}
function prevRegionPage(){var api = $("div.regionscrollable").scrollable();api.prevPage();}
function nextVintagePage(){var api = $("div.vintagescrollable").scrollable();api.nextPage();}
function prevVintagePage(){var api = $("div.vintagescrollable").scrollable();api.prevPage();}
function nextVarietalPage(){var api = $("div.varietalscrollable").scrollable();api.nextPage();}
function prevVarietalPage(){var api = $("div.varietalscrollable").scrollable();api.prevPage();}
function nextStationPage(){var api = $("div.stationscrollable").scrollable();api.nextPage();}
function prevStationPage(){var api = $("div.stationscrollable").scrollable();api.prevPage();}
function hideLoginModalDialog(){var api = $("#loginlink").overlay({oneInstance: false, api: true}); api.close();}
function showLoginModalDialog(){var api = $("#loginlink").overlay({oneInstance: false, api: true}); api.load();}
function hideRegisterModalDialog(){var api = $("#registerlink").overlay({oneInstance: false, api: true}); api.close();}
function showRegisterModalDialog(){var api = $("#registerlink").overlay({oneInstance: false, api: true}); api.load();}
function hideVintagesModalDialog(){var api = $("#vintagelink").overlay({oneInstance: false, api: true}); api.close();}
function showVintagesModalDialog(){var api = $("#vintagelink").overlay({oneInstance: false, api: true}); api.load();}

function checkAndDisplayLogin(){
	if(checkIfValidCookieExists() == true){
		cookieemail = getCookieEmailAddress();
	$("#loginlabel").css("display","block");
	$("#loginlink").css("display","none");
	$("#logoutlink").css("display","block");
	$("#registerlink").css("display","none");
	$("#personalcellarlink").css("display","block");
	$("#loginlabel").attr("innerHTML",cookieemail + " is logged in");
	
	}else{
	$("#loginlabel").css("display","none");
	$("#loginlink").css("display","block");
	$("#logoutlink").css("display","none");
	$("#registerlink").css("display","block");
	$("#personalcellarlink").css("display","none");
	}
	}
function doLogout(){
	logout();
	$("#loginlabel").css("display","none");
	$("#loginlink").css("display","block");
	$("#logoutlink").css("display","none");
	$("#registerlink").css("display","block");
	$("#personalcellarlink").css("display","none");
}
function initializeModalDialogs(){
	  var triggers = $("a.modalInput").overlay({ 
	   
		  // some expose tweaks suitable for modal dialogs 
		  expose: { 
			  color: '#333', 
			  loadSpeed: 200, 
			  opacity: 0.9 
		  }, 
	   
		  closeOnClick: true 
	  });
	  
	  
	

}

function initializeColumnTemplates(){
	$.ColumnTemplates.TTBox = "<div class=\"TTbox\"><a href=\"#\" onclick=\"openWinePage('DATABASE_COLUMN_KEY',escape('DATABASE_COLUMN_VALUE'));\">DATABASE_COLUMN_2_VALUE</a></div>";
	$.ColumnTemplates.TTBoxVintage = "<li><div class=\"TTbox\"><a href=\"#VintageDrillDown\" onclick=\"fillWebAppVintageDrillDownList('vintagedrilldown_ul','VINTAGES');scroll(0,0);\">VINTAGE_RANGE</a></div></li>"; 
}

function fillWebAppVintageDrillDownList(ulid,vintageslist){
	$("#vintagesdrilldown").attr("innerHTML","");
	var vintagestemplate = "<a href=\"winepage.php?columnkey=wine_vintage&columnvalue=VINTAGE_NAME\">VINTAGE_NAME</a><br/>";
	var splitvintages = vintageslist.split(",");
	$('ul#'+ulid).attr('innerHTML',"");
	for(x in splitvintages){
		fulltemplate = vintagestemplate.replace(new RegExp('VINTAGE_NAME','g'),splitvintages[x]);	
		$(fulltemplate).appendTo('#vintagesdrilldown');	  
     }
	 showVintagesModalDialog();
}

function returnFilledOutTTBox(DatabaseColumnKey,DatabaseColumnValue){
	var fulltemplate;
		fulltemplate = $.ColumnTemplates.TTBox.replace('DATABASE_COLUMN_KEY',DatabaseColumnKey);
		fulltemplate = fulltemplate.replace('DATABASE_COLUMN_VALUE',DatabaseColumnValue);
		fulltemplate = fulltemplate.replace('DATABASE_COLUMN_2_VALUE',truncateString(DatabaseColumnValue,20));	
	return fulltemplate;
}

function returnFilledOutTTBoxVintage(VintageList,VintageRange){
	var fulltemplate;
		fulltemplate = $.ColumnTemplates.TTBoxVintage.replace('VINTAGES',VintageList);
		fulltemplate = fulltemplate.replace('VINTAGE_RANGE',VintageRange);
	return fulltemplate;
}

function truncateString(str,len){
	if(str.length > len){
		return str.substr(0,len-3)+"...";	
	} else {
		return str;
	}
}

function loadPageColumn(PageColumnName){
if(PageColumnName == "Regions"){
	loadRegions();
}
if(PageColumnName == "Vintages"){
	loadVintages();
}
if(PageColumnName == "Varietals"){
	loadVarietals();
}
if(PageColumnName == "Stations"){
	loadStations();
}

	
}

function openWinePage(DatabaseColumnKey,DatabaseColumnValue){
	window.location = "winepage.php?columnkey="+DatabaseColumnKey+"&columnvalue="+DatabaseColumnValue;
}

function loadRegions(){
		$.getJSON("desktop_inc/desktopcontroller.php",{func:"return_regions"},function(data){processLoadRegions(data);}); 
}
	
function processLoadRegions(data){
		var api = $("div.regionscrollable").scrollable(); 
		$.each(data.Results, function(i,item){
				api.getItemWrap().append(returnFilledOutTTBox('wine_region',item.region_name));			
		api.reload().begin();
          }); 
}
function loadVintages(){
		$.getJSON("desktop_inc/desktopcontroller.php",{func:"return_vintages"},function(data){processLoadVintages(data);}); 
}
function processLoadVintages(data){
		var api = $("div.vintagescrollable").scrollable(); 
		$.each(data.Results, function(i,item){
				api.getItemWrap().append(returnFilledOutTTBoxVintage(item.wine_vintages,item.vintage_range));
          });
		api.reload().begin();
}


function loadVarietals(){
		$.getJSON("desktop_inc/desktopcontroller.php",{func:"return_varietals"},function(data){processLoadVarietals(data);}); 
	}
function processLoadVarietals(data){
		var api = $("div.varietalscrollable").scrollable(); 
		$.each(data.Results, function(i,item){
				api.getItemWrap().append(returnFilledOutTTBox('wine_varietals',item.varietal_name));
          }); 
		api.reload().begin();
	}
function loadStations(){
		$.getJSON("desktop_inc/desktopcontroller.php",{func:"return_stations"},function(data){processLoadStations(data);}); 
	}
function processLoadStations(data){
		var api = $("div.stationscrollable").scrollable(); 
		$.each(data.Results, function(i,item){
				api.getItemWrap().append(returnFilledOutTTBox('wine_location',item.location_name));
          });
		api.reload().begin();
	}

// Login section
function capitalize(xx) {	
  var xx = xx.toLowerCase();	
  var yy = xx.split(" "); 
  
  for (x=0; x<yy.length; x++) {
	yy[x] = yy[x].substring(0, 1).toUpperCase()+yy[x].substring(1);
  };
	str = yy.join(" ");
	return str;
};

//loginregister.js
			
function saltedDoubleHash(pwd,seedval){
	//alert("pwd " + pwd + " seedval " + seedval);
	return MD5(MD5(pwd) + seedval.toString());
}

function autologin(){
	if(checkIfValidCookieExists() == true){
		cookieemail = getCookieEmailAddress();
		//cookieusername = getCookieUserName();
		cookiepasshash = getCookiePassHash();
		cookieseed = getCookieSeed();
		//alert("pwd before logging in is " + cookiepasshash + " seed is " + cookieseed);
		login(cookieemail,cookieusername,cookiepasshash,cookieseed);
	}
}

function resetPassword(em){
	if (em != ""){	
		$.post("inc/logincontroller.php",{func:"resetpassword",email:em},function(data){
		jsonobj=eval("("+data+")");
		if(jsonobj.success == "true"){
			alert("Your password has been reset and sent to your email address.");
			window.location = "index.php";
		}else{
			alert("Password reset failed. " + jsonobj.error);
		}
		});
	} else {
		alert("No entry found in Email field.");
	}
}

function changePassword(){
	var em = $('#email_change').val();
	var oldpwd = MD5($('#password_change_old').val());
	var pwdval = "";
	if($('#password_change').val() == $('#password_change2').val()){
		pwdval = MD5($('#password_change').val());
	}else{
		alert("New password doesn't match in both fields.")
		return false;	
	}
	
	if (em != ""){		
		$.post("inc/logincontroller.php",{func:"changepassword",email:em,oldpwd:oldpwd,pwd:pwdval},function(data){
		jsonobj=eval("("+data+")");
		if(jsonobj.success == "true"){
			alert("Your password has been changed.");
			window.location = "index.php";
		}else{
			alert("Password change failed. " + jsonobj.error);
		}
		});
	} else {
		alert("No entry found in Email field.");
	}
}

function executelogin(){
	//alert(MD5($("#password").val()));
	login($("#emailaddress").val(),$("#password").val(),-1);
}
//seed set to -1 if using function directly (you need the function to generate the seed for you)
function login(em,pwd,seed){
	seedval = seed;
	pwdval = pwd;
	if (seed == -1){
		seedval = Math.floor(Math.random()*257); //0-256 random number
		pwdval = saltedDoubleHash(pwd,seedval);
	} 
	//alert("pwd before posting is " + thepwd);
	$.post("../inc/logincontroller.php",{func:"login",email:em,pwd:pwdval,seed:seedval},function(data){processLogin(data);});
}

function logout(){
	//erase cookie by create
	eraseCookie("theforgewineapp");
	//redirect???
}


function checkIfValidCookieExists(){
	
cookiestring = eval('(' + readCookie("theforgewineapp") + ')');
okflag = true;

  if(document.cookie.indexOf("theforgewineapp") > -1){
	  
		$.each(cookiestring,function(key,val){
			//alert(key + " - " + val);
			if ((val.indexOf("undefined") != -1) || (val == "")){
				//alert("got here");
				okflag = false;
			}
		});
  } else {
	  okflag = false;
  }
return okflag;
}

function getCookieEmailAddress(){
	cookiestring = eval('(' + readCookie("theforgewineapp") + ')');
	if(cookiestring != null){
		return cookiestring['emailaddress'];	
	} else {
		return "";
	}
}


/*function getCookieUserName(){
	cookiestring = eval('(' + readCookie("theforgewineapp") + ')');
    return cookiestring['username'];
}*/

function getCookiePassHash(){
	cookiestring = eval('(' + readCookie("theforgewineapp") + ')');
    
		if(cookiestring != null){
		return cookiestring['passhash'];	
	} else {
		return "";
	}
}

function getCookieSeed(){
	cookiestring = eval('(' + readCookie("theforgewineapp") + ')');
 
		if(cookiestring != null){
   return cookiestring['seed'];
   } else {
		return "";
   }
}

function executeregister(){
	//don't need seed
register($('#new_username').val(),$('#new_password').val(),$('#new_password_confirm').val(),$('#new_emailaddress').val(),0);	
}

function register(un,pwd,pwd2,em,seed){
	
	seedval = seed;
	pwdval = MD5(pwd);
	if (validateRegistration() == true){
		//alert("pwd before posting is " + thepwd);
			$.post("../inc/registercontroller.php",{func:"register",un:un,hashedpwd:pwdval,seed:seedval,email:em},function(data){processRegister(data);});
	}
}

function validateEmailAddress(elem){
 var emailExp = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/;
	if(elem.value.match(emailExp)){
		return true;
	}else{
		
		return false;
	}

 }

function validateRegistration(){
	var valflag = true;
	
	if($("#new_username").val() == ""){
		//document.getElementById('username_new_label').style.color = "#F00";
	 valflag = false;
	}else {
		//document.getElementById('username_new_label').style.color = "#000";
	}

	if(($("#password_new").val() == "")||($("#password_new2").val() == "")||($("#password_new").val() != $("#password_new2").val())){
		//document.getElementById('password_new_label').style.color = "#F00";
		//document.getElementById('password_new2_label').style.color = "#F00";
	 valflag = false;
	}else {
		//document.getElementById('password_new_label').style.color = "#000";
		//document.getElementById('password_new2_label').style.color = "#000";
	}	
	
	if($("#new_emailaddress").val() == ""){
		//document.getElementById('email_new_label').style.color = "#F00";
	 valflag = false;
	}else {
		//document.getElementById('email_new_label').style.color = "#000";
	}
	if(validateEmailAddress(document.getElementById('new_emailaddress')) == false){
		//document.getElementById('email_new_label').style.color = "#F00";

	 valflag = false;
	}else{
		//document.getElementById('email_new_label').style.color = "#000";
	}
	
	return valflag;
}
function eraseCookie(){
	createCookie("","","",-1);
}
	
function readCookie(name){
	return $.cookie("theforgewineapp");
}

function createCookie(un,pw,em,seed){
	var date = new Date();
	date.setTime(date.getTime()+(7*24*60*60*1000)); //add 7 days to current login time;
	jQuery.cookie("theforgewineapp", "{\"username\" : \"" + un + "\", \"emailaddress\" : \"" + em + "\", \"passhash\" : \"" + pw + "\", \"seed\" : \"" + seed + "\"}");
}


function processLogin(data){
	//alert(data);
	//document.getElementById("output").innerHTML = data;
	
	jsonobj = eval('(' + data + ')');
	
	if(jsonobj['valid'] == 'true'){
		createCookie(jsonobj['username'],jsonobj['password'],jsonobj['email'],jsonobj['seed']);
		//window.location = "index.php";
		hideLoginModalDialog();		
		checkAndDisplayLogin();
	} else {
		if(jsonobj['error'] == 'email'){
			//document.getElementById('username_label').style.color = "#F00";
			alert("Email address incorrect.");
		}
		
		if(jsonobj['error'] == 'password'){
			//document.getElementById('username_label').style.color = "#F00";
			//document.getElementById('password_label').style.color = "#F00";
			alert("Email or Password incorrect.");
		}
	}
}

function processRegister(data){
	//alert(data);
	//document.getElementById("output").innerHTML = data;
	
	jsonobj = eval('(' + data + ')');
	
	if(jsonobj['valid'] == 'true'){
		createCookie(jsonobj['username'],jsonobj['password'],jsonobj['email'],jsonobj['seed']);
		//$("#newusererrormessage").val("");
		//window.location = "index.php"; 
		alert("Congratulations! Registration successful. Please login.");
		hideRegisterModalDialog();
	} else {
		if(jsonobj['error'] == 'email'){
			//document.getElementById('email_new_label').style.color = "#F00";
			alert("Email address already exists.");
		}
		
		if(jsonobj['error'] == 'password'){
			//document.getElementById('password_new_label').style.color = "#F00";
			//document.getElementById('password_new2_label').style.color = "#F00";
			alert("Password incorrect.");
		}
		//validateNewPasswordFields();
		
	}
}

function displayPersonalCellar(){
value = getCookieEmailAddress();
window.location = "winepage.php?columnkey=user_id&columnvalue=" + value;	
}
//cookie and md5
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();
}

// Cookie Section
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};

