/**
Function: getXMLHttpRequest()
Purpose: Creates a new XMLHttpRequest object and returns it.
*/
function getXMLHttpRequest() {
    var p;
    try {
        p= new XMLHttpRequest();
    } catch (trymicrosoft) {
        try {
			p= new ActiveXObject("Msxml2.XMLHTTP");
		} catch (othermicrosoft) {
			try {
				p= new ActiveXObject("Microsoft.XMLHTTP");
			} catch(failed) {
				alert("We're sorry but you are not using a ajax compatible browser");
			}
		}
    }
    return p;
}

/**
Function: validateEmail(strValue)
Purpose: Returns false if the string is not a valid email.
*/
function validateEmail(strValue) {
    var objRegExp  = /^.+@.+\..{2,4}$/;
    var illegalChars= /[\(\)\<\>\,\;\:\\\/\"\ \[\]]/;
    var flag = true;
    if (strValue.match(illegalChars))
        flag = false;

    if (flag)
        return objRegExp.test(strValue);
    else
        return flag;
}

/**
Function: inputValidate(form)
Purpose: Validate the email, captcha, and passwords when registering.
         Returns false if not validated and true if validated.
*/
function inputValidate(form) {
	//clear the error report fields
    document.getElementById('notanemail').style.display='none';
    document.getElementById('missfields').style.display='none';
    document.getElementById('notsamepass').style.display='none';
	document.getElementById('passisshort').style.display='none';
	document.getElementById('captcha').style.display='none';

	//not a valid email error
    if (!validateEmail(form.frmEmail.value)) {
        document.getElementById('notanemail').style.display='';
		return false;
    }
	//missing fields error
	else if (((form.frmEmail.value.length==0) || (form.frmEmail.value==null)) ||
        ((form.frmPassword.value.length==0) || (form.frmPassword.value==null)) ||
        ((form.frmConfirmPassword.value.length==0) || (form.frmConfirmPassword.value==null)) ||
        (!form.frmAjax13Terms.checked)) {
        document.getElementById('missfields').style.display='';
		return false;
    }
	//passwords don't match error
	else if (form.frmPassword.value != form.frmConfirmPassword.value) {
        document.getElementById('notsamepass').style.display='';
		return false;
    }
	//password needs to be at least 6 characters error
	else if (form.frmPassword.value.length < 6) {
		document.getElementById('passisshort').style.display='';
		return false;
	}
	//captcha word is invalid error
	else if (!jcap()) {
		document.getElementById('captcha').style.display='';
		return false;
	}
	else {
		return true;
	}
}

/*
Function: inputValidateLimited(form)
Purpose: Validate the email and passwords when registering.
         Returns false if not validated and true if validated.
*/
function inputValidateLimited(form) {
	//clear the error report fields
    document.getElementById('notanemail').style.display='none';
    document.getElementById('missfields').style.display='none';
    document.getElementById('notsamepass').style.display='none';
	
	//not a valid email error
    if (!validateEmail(form.frmEmail.value)) {
        document.getElementById('notanemail').style.display='';
		return false;
    }
	//missing fields error
	else if (((form.frmEmail.value.length==0) || (form.frmEmail.value==null)) ||
        ((form.frmPassword.value.length==0) || (form.frmPassword.value==null)) ||
        ((form.frmConfirmPassword.value.length==0) || (form.frmConfirmPassword.value==null))) {
        document.getElementById('missfields').style.display='';
		return false;
    }
	//passwords don't match error
	else if (form.frmPassword.value != form.frmConfirmPassword.value) {
        document.getElementById('notsamepass').style.display='';
		return false;
    }
	else
		return true;
}

//Global varibles for keeping track of status and responseText
var status;
var text;

/**
Function: doHttpRequest(s)
Purpose: Makes a request and updates the status and responseText.
*/
function doHttpRequest(s) {
	var p=getXMLHttpRequest();
    p.open('GET',s,false);
    if (p.readyState==1) { document.getElementById('confirm').style.display=''; }
	if (p.readyState==4) { document.getElementById('confirm').style.display=''; }
	p.send(null);
    var doc=p.responseXML;
    var result=doc.getElementsByTagName('result')[0];
	//var test=new XMLSerializer().serializeToString(doc);
    //alert(test);
	status=result.getAttribute('status');
	text=p.responseText;
}

var promo=false;
/**
Function: checkValidation()
Purpose: Checks validity of promo code
*/
function checkValidation() {
	if(!promo) {
		document.getElementById('validpromo').style.display='none';
		document.getElementById('unknownpromo').style.display='none';
		
		var input = document.getElementById('frmPromoCode').value.toLowerCase();
		if(hex_md5(input) == 'b1d066f875a66cfd53e32049ecc9a6e7') {
			document.getElementById('validpromo').style.display='';
			promo=true;	
		}
		else
			document.getElementById('unknownpromo').style.display='';
	}
}

/**
Function: doRegistration(form)
Purpose: Registration from the website only, not from ajaxWindows.
*/
function doRegistration(form) {
	if (!inputValidateLimited(form)) {
		return;
	}
	else {
		var pass = form.frmPassword.value;
		var s='../io/user/create?user='+form.frmEmail.value+'&pass='+escape(pass);
		doHttpRequest(s);

		var encPass = hex_md5(pass);
		if(status=='ok') { //status is global
        	var s='../io/user/login?user='+form.frmEmail.value+'&pass='+escape(encPass);
            doHttpRequest(s);

			if(status=='ok'){ //status is global
				if(form.frmSendContacts.checked) {
					s='../io/user/set?key=sendcontacts&val=true';
					doHttpRequest(s);
				}
				else {
					s='../io/user/set?key=sendcontacts&val=false';
					doHttpRequest(s);
				}
				//create scheduleWorld account
				scheduleWorldXml.createAccount(form.frmEmail.value,form.frmPassword.value);
				createCookie("username",form.frmEmail.value,1000);
				createCookie("password",pass,1000);
				location.href='../apps/syncwizard/content/index.html';
			}
			else
				alert('Sorry, but we could not login this newly registered user right now.');
        }
		else {
			if (text.toLowerCase().indexOf("user already exist") > -1)
            	location.href='registration_error.jsp';
			else
				alert('Sorry, but we currently are unable to process this transaction.');
		}
    }
}

/*********************** Cookie functions *************************/

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*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 httpSet(s) {
	var p=getXMLHttpRequest();
	p.open('GET',s,false);
    p.send(null);
    var doc=p.responseXML;
	var result=doc.getElementsByTagName('result')[0];
    var status = result.getAttribute('status');
}

/**
Function: doRegistration_win(form)
Purpose: Registration for ajaxWindows where user creation is on webdav.
*/
function doRegistration_win(form) {
	//flag for inside or outside ajaxWindows
	var outsideAW = true;
	if (window != top)
		outsideAW = false;

	//check if input is valid
	if (!inputValidate(form)) {
		return;
	}
	else {
		//create new user without storage preference
		var s='../../../io/user/create?user='+form.frmEmail.value+'&pass='+escape(form.frmPassword.value);
		doHttpRequest(s);

        if(status=='ok') {
			//login user
			var pass = form.frmPassword.value;
			pass = hex_md5(pass);
			var s='../../../io/user/login?user='+form.frmEmail.value+'&pass='+escape(pass);
			doHttpRequest(s);

			//proceed login or display error message
			if (status == 'ok') {
				//check for newsletters approval
				if (form.frmAjax13News.checked) {
					s='../../../io/user/set?key=news&val=yes';
					httpSet(s);
				}
				else {
					s='../../../io/user/set?key=news&val=no';
					httpSet(s);
				}
				//check if registering from ajaxWindows demo account
				if (!outsideAW) {
					location.href='register_confirm.html';
					return;
				}

				if (('product' in window.navigator)&&(window.navigator.product =='Gecko')) {
					setLoginRegister(form.frmEmail.value,escape(pass)); //a13_winLogin.js
					location.href='desktop_login.html';
				}
				else if (navigator.appName == "Microsoft Internet Explorer") {
					//check if user ever loged in with IE before
					var browser = readCookie("browser");
					if (browser == 'ie'){
						location.href='ie_confirm.html';
						return;
					}
					setLoginRegister(form.frmEmail.value,escape(pass)); //a13_winLogin.js
					location.href='desktop_login.html';
				}
				createCookie("username",form.frmEmail.value,1000);
				createCookie("password",pass,1000);
			}
			else
				alert('Sorry, but we can not login newly registered user right now.');
        }
		else {
            if (text.toLowerCase().indexOf("user already exist") > -1)
            	location.href='register_error.html';
			else
				alert('Sorry, but we currently are unable to process transactions.');
		}
	}
}

/**
Function: doLogin(form, lastpage)
Purpose: Login user from the website.
Param: lastpage - string of lastpage the user was on
*/
function doLogin(form, lastpage) {
    document.getElementById('noemail').style.display='none';
    document.getElementById('bademail').style.display='none';
    document.getElementById('badpass').style.display='none';
    document.getElementById('nopass').style.display='none';

	var pass = form.frmPassword.value;
	pass = hex_md5(pass);
    var s='../io/user/login?user='+form.frmEmail.value+'&pass='+escape(pass);
    if (form.remember.checked)
        s+='&remember=true';

	var p=getXMLHttpRequest();
    p.open('GET',s,false);
    p.setRequestHeader('Cache-Control','no-cache, must-revalidate');
	p.send(null);
	if(!p.getResponseHeader("Date")) {
		var cached = p;
		p=getXMLHttpRequest();
		var ifModifiedSince = cached.getResponseHeader("Last-Modified");
		ifModifiedSince = (ifModifiedSince) ? ifModifiedSince : new Date(0);
		p.open('GET',s,false);
		p.setRequestHeader("If-Modified-Since", ifModifiedSince);
		p.send("");
		if(p.status == 304)
    	{
      		request = cached;
    	}
	}
    var doc=p.responseXML;
    var result=doc.getElementsByTagName('result')[0];
    var status = result.getAttribute('status');

    if(status=='ok') {

    	/** Set cookies to login to other services as well **/
    	createCookie("username",form.frmEmail.value,1000);
        createCookie("password",form.frmPassword.value,1000);

        if (lastpage == 'products')
           	location.href='products.jsp';
       	else if (lastpage == 'services')
           	location.href='services.jsp';
       	else if (lastpage == 'about')
           	location.href='about.jsp';
       	else if (lastpage == 'jobs')
           	location.href='jobs.jsp';
       	else if (lastpage == 'contact')
           	location.href='contact.jsp';
       	else if (lastpage == 'terms')
           	location.href='terms.jsp';
       	else
            location.href='index.jsp';

    }
	else {
           var resultText=result.getElementsByTagName("error")[0].firstChild.data.toLowerCase();

        if (resultText.indexOf('missing username')>-1) {
           	document.getElementById('noemail').style.display='';
           	document.getElementById('noemail').style.color='red';
       	} else if (resultText.indexOf('user unknown')>-1) {
           	document.getElementById('bademail').style.display='';
           	document.getElementById('bademail').style.color='red';
       	} else if (resultText.indexOf('password unknown')>-1) {
           	document.getElementById('badpass').style.display='';
           	document.getElementById('badpass').style.color='red';
       	} else if (resultText.indexOf('missing password')>-1) {
			document.getElementById('nopass').style.display='';
           	document.getElementById('nopass').style.color='red';
        }/* else {
           	location.href='loginError.jsp';
       	}*/
	}
}


/**
Function: doLogin_win(form)
Purpose: Login for ajaxWindows.  This function is designed for working with streamload.
DEPRECATED
*/
function doLogin_win(form) {
	//reading parameters
	var searchString = location.search;
	var email = searchString.substring(7,searchString.indexOf('&'));
	var pass = searchString.substring(searchString.indexOf('&')+6,searchString.length);

	//converting email to not have @ and .
	var st_email = email;
		st_email = st_email.replace(/@/g,"_");
		st_email = st_email.replace(/\./g,"_");
		st_email = st_email.replace(/-/g,"_");

	//making a call to streamload to check login validation
	var login_call='reroute?path=http://services.streamload.com/v1.4/Login.slapi?license=a96ca8fdb882465dbdb8c6a70ecc390b&appKey=Ajax13StorageKey13&user='+st_email+'&pass='+escape(pass);
	var p=getXMLHttpRequest();
    p.open('GET','../../../' + login_call,false);
    p.send(null);
    var doc=p.responseXML;
	var response=doc.getElementsByTagName('response')[0];
	var text=p.responseText;

	if(text.indexOf('code="101"') > -1) {
		/*var error=doc.getElementsByTagName('error')[0];
		alert(error.getAttribute('message')); //display error message from media max
		return;*/
		var n = text.indexOf('message="');
		var m = text.indexOf('"', n+9);
		alert(text.substring(n+9,m));
	}
	//code 0 from streamload is a non-error
	else if (text.indexOf('code="0"') > -1) {

		//checking if the account is really verified
		var sessionToken=doc.getElementsByTagName('sessionToken')[0];
		var authTicket=doc.getElementsByTagName('authTicket')[0];

		var a = text.indexOf('<sessionToken>');
		var b = text.indexOf('</sessionToken>');
		var session = text.substring(a+14,b);

		var c = text.indexOf('<authTicket>');
		var d = text.indexOf('</authTicket>');
		var auth = text.substring(c+12,d);

		var getAccountInfo_call='reroute?path=http://services.streamload.com/v1.4/GetAccountInfo.slapi?sessionToken='+session+'&authTicket='+auth;

		var p=getXMLHttpRequest();
    	p.open('GET','../../../' + getAccountInfo_call,false);
    	p.send(null);
    	var doc=p.responseXML;
		var isEmailAddressVerified=doc.getElementsByTagName('isEmailAddressVerified')[0];
		var textaccount=p.responseText;

		var e = textaccount.indexOf('<isEmailAddressVerified>');
		var f = textaccount.indexOf('</isEmailAddressVerified>');
		var emailVerified = textaccount.substring(e+24,f);

		//code 0 but the email account is not verified
		if (emailVerified.toLowerCase() == 'false') {
			alert('Email has not been verified yet.');
		}
		else {

			var s='../../../io/user/login?user='+email+'&pass='+pass+'&storage=streamloadVerified';
			var status=doHttpRequest(s);

			if (status=='ok')
				regSignIn(email, pass);
			else
				alert('Sorry, user cannot be signed in at the moment');
		}
	}//else if
	else {
		alert('An unknown error has occured with MediaMax');
	}

}

/************************* start of changing user account info **********************************/

function doEdit(form) {
	try {
		//check for errors in password input
		if (form.name.value == "") {
			alert('Name Input is empty');
			return;
		}

		//check for errors in password input
		if (form.newpass.value == "") {
			alert('New password is empty');
			return;
		}
		else if (form.password.value != form.confirmPass.value) {
			alert("Opps! New and Retyped passwords do not match");
		}
		else {
			var doc = doHttpRequest('../../../../io/user/key=pass&val=' + form.password.value);
			var doc2 = doHttpRequest('../../../../io/user/key=name&val=' + form.name.value);
		}

	} catch(e) {
		alert('exception');
	}

}

function setPassword2(form) {
	try {
		document.getElementById('badoldpass').style.display='none';
		document.getElementById('less6char').style.display='none';
		document.getElementById('badconfirmpass').style.display='none';

		if (form.oldpass.value != getPassword2()) {
			document.getElementById('badoldpass').style.display='';
		}
		else if (form.newpass.value != form.confirmpass.value) {
			document.getElementById('badconfirmpass').style.display='';
		}
		else if (form.newpass.value.length < 6) {
			document.getElementById('less6char').style.display='';
		}
		else {
			var status=storePassword2(form.newpass.value);
			if(status=='ok') {
				top.alert('Your new password has been set');
				location.href='myaccount.jsp';
			}
			else
				top.alert('Error in storing password');
		}
	} catch(e) {
		alert(e.message);
		top.alert('Error in setting password');
	}
}

function getPassword2() {
	var s='../io/user/get?key=pass';
	var p=getXMLHttpRequest();
	p.open('GET',s,false);
    p.send(null);
    var doc=p.responseXML;
	var value=doc.getElementsByTagName('value')[0];
	return value.firstChild.nodeValue;
}

function storePassword2(str) {
	var s='../io/user/set?key=pass&val=' + str;
	var p=getXMLHttpRequest();
	p.open('GET',s,false);
    p.send(null);
    var doc=p.responseXML;
	var result=doc.getElementsByTagName('result')[0];
	return result.getAttribute('status');
}

/**
*Purpose: To update the password setings
*When: User clicks on change button
*/
function setPassword(form) {
	try {
		if (form.oldpass.value != getPassword()) {
			top.alert('Old password is not correct');
		}
		else if (form.newpass.value != form.confirmpass.value) {
			top.alert('New and confirm passwords do not match');
		}
		else if (form.newpass.value.length < 6) {
			top.alert('New password needs to be at least 6 characters long');
		}
		else {
			var status=storePassword(form.newpass.value);
			if(status=='ok') {
				//top.alert('Your new password has been set');
				top.nes.core.Desktop.showStatus("Your new password has been set");
				top.Desktop.closeWindow(frameElement.parentNode.parentNode.parentNode.parentNode);
			}
			else
				top.alert('Error in storing password');
		}
	} catch(e) {
		top.alert('Error in setting password');
	}
}

/**
*Purpose: To get old password
*When: setPassword() called
*/
function getPassword() {
	var s='../../../../io/user/get?key=pass';
	var p=getXMLHttpRequest();
	p.open('GET',s,false);
    p.send(null);
    var doc=p.responseXML;
	var value=doc.getElementsByTagName('value')[0];
	return value.firstChild.nodeValue;
}

/**
*Purpose: To store the password on user profile
*When: setPassword() called
*/
function storePassword(str) {
	var s='../../../../io/user/set?key=pass&val=' + str;
	var p=getXMLHttpRequest();
	p.open('GET',s,false);
    p.send(null);
    var doc=p.responseXML;
	var result=doc.getElementsByTagName('result')[0];
	return result.getAttribute('status');
}

/************************* end of changing user account info **********************************/

function doForgotPassword(form) {
    document.getElementById('notanemail').style.display='none';
    if (!validateEmail(form.frmEmail.value)) {
        document.getElementById('notanemail').style.display='';
        document.getElementById('notanemail').style.color='red';
    } else {
        //var s='http://127.0.0.1:8080/ajax/io/user/forgotpw?email=';
        var s='../io/user/forgotpw?email=';
        var p=getXMLHttpRequest();
        p.open('GET',s,false);
        p.send(null);
        var doc=p.responseXML;
        var result=doc.getElementsByTagName('result')[0];
        var status=result.getAttribute('status');
        if(status=='ok')
            location.href='forgot_confirmation.jsp';
        else
            location.href='forgot_error.jsp';
    }
}

function doLogoutWin() {
    //var s='http://127.0.0.1:8080/ajax/io/user/logout';
    var s='../../../io/user/logout';
    var p=getXMLHttpRequest();
    p.open('GET',s,false);
    p.send(null);
    var doc=p.responseXML;
    var result=doc.getElementsByTagName('result')[0];
    var status=result.getAttribute('status');
    if(status=='ok')
        location.href='index.html';
    else
        alert(result.firstChild.nodeValue.toLowerCase());
}

function doLogout() {
    var s='../io/user/logout';
    var p=getXMLHttpRequest();
    p.open('GET',s,false);
	p.setRequestHeader('Cache-Control','no-cache, must-revalidate');
    p.send(null);
	if(!p.getResponseHeader("Date")) {
		var cached = p;
		p=getXMLHttpRequest();
		var ifModifiedSince = cached.getResponseHeader("Last-Modified");
		ifModifiedSince = (ifModifiedSince) ? ifModifiedSince : new Date(0);
		p.open('GET',s,false);
		p.setRequestHeader("If-Modified-Since", ifModifiedSince);
		p.send("");
		if(p.status == 304)
    	{
      		request = cached;
    	}
	}
    var doc=p.responseXML;
    var result=doc.getElementsByTagName('result')[0];
    var status=result.getAttribute('status');

    if(status=='ok')
        location.href='index.jsp';
    else
        alert(result.firstChild.nodeValue.toLowerCase());
}

function doLogout2() {
    var s='../io/user/logout';
    var p=getXMLHttpRequest();
    p.open('GET',s,false);
	//p.setRequestHeader('Cache-Control','no-cache, must-revalidate');
    p.send(null);
	if(!p.getResponseHeader("Date")) {
		var cached = p;
		p=getXMLHttpRequest();
		var ifModifiedSince = cached.getResponseHeader("Last-Modified");
		ifModifiedSince = (ifModifiedSince) ? ifModifiedSince : new Date(0);
		p.open('GET',s,false);
		p.setRequestHeader("If-Modified-Since", ifModifiedSince);
		p.send("");
		if(p.status == 304)
    	{
      		request = cached;
    	}
	}
    var doc=p.responseXML;
    var result=doc.getElementsByTagName('result')[0];
    var status=result.getAttribute('status');

    if(status=='ok'){
        location.href='index.jsp';
        eraseCookie("username");
        eraseCookie("password");
    }
    else
        alert(result.firstChild.nodeValue.toLowerCase());
}

function doAccount() {
	//checks if user is in session and routes to proper page
    var s='../io/user/check';
    var p=getXMLHttpRequest();
    p.open('GET',s,false);
    p.send(null);
    var doc=p.responseXML;
    var result=doc.getElementsByTagName('result')[0];
    var status=result.getAttribute('status');
    if(status=='ok')
        location.href='myaccount.jsp';
    else
        location.href='login.jsp';
}

var req;
var lookupBtn;
//called from the "lookup" button in registration.jsp
function lookup(btn){
	var email = document.registrationform.frmEmail.value;
	email = trim(email);
	if(email == "") return;
	if(!validateEmail(email)){
		var lookupSpan = document.getElementById("lookupSpan");
		lookupSpan.innerHTML = "<font color=\"red\">Invalid email format. Please try again.</font>";
		return;
	}
	lookupBtn = btn;
	btn.disabled = true;
	req=getXMLHttpRequest();
	var s = "../io/user/exists?user=" + email;	
	req.open('GET',s,true);
	req.onreadystatechange = lookupHandler;
    req.send(null);
}

function lookupHandler(){
	if (req.readyState == 4 && req.status == 200) {
		var doc=req.responseXML;
    	var result=doc.getElementsByTagName('result')[0];
		var status=result.getAttribute('status');
		lookupBtn.disabled = false;
		var img = document.getElementById("lookupimg");
		img.style.display = "none";
		var lookupSpan = document.getElementById("lookupSpan");
		if(status == "ok"){			
			lookupSpan.innerHTML = "<font color=\"red\">Email already taken!</font>";
		}
		else{
			lookupSpan.innerHTML = "<font color=\"green\">Email available.</font>";
		}	
	}
}

function ltrim(str) { 
	for(var k = 0; k < str.length && isWhitespace(str.charAt(k)); k++);
	return str.substring(k, str.length);
}
function rtrim(str) {
	for(var j=str.length-1; j>=0 && isWhitespace(str.charAt(j)) ; j--) ;
	return str.substring(0,j+1);
}
function trim(str) {
	return ltrim(rtrim(str));
}
function isWhitespace(charToCheck) {
	var whitespaceChars = " \t\n\r\f";
	return (whitespaceChars.indexOf(charToCheck) != -1);
}

