var url="";
var req;
function backgroundSave(){
	var lfield = "userid";
	var lfield2 = "password";
	if (document.getElementById('userid').value != "" || document.getElementById('mruserid').value != "")
	{
		if( document.getElementById('mruserid') ) {
			lfield = "mruserid";
			lfield2 = "mrpassword";
		}
		//alert("lfield= " + lfield + "=#" + document.getElementById(lfield).value + "# lfield2 " + lfield2 + "=#" + document.getElementById(lfield2).value) +"#";
		url = "/tryAJAXsaver.jsp";
		url += "?userId=" + document.getElementById(lfield).value;
		var pwd = trim(document.getElementById(lfield2).value);
		//alert("lfield= " + lfield + "=" + document.getElementById(lfield).value + " lfield2 " + lfield2 + "=" + document.getElementById(lfield2).value);
		if (pwd == "" || pwd == null) pwd = "##--nopasswordsupplied--##";
		else
			document.getElementById(lfield2).value = pwd;
		var pw = encodeBase64(pwd);
		url += "&pw=" + pw;
		loadXMLDoc(url);
	}
	else document.getElementById('msg').innerHTML = "unverified";
}
var isCheckUniv = false;
var thisElement = null;
function checkUnivExists(element){
	thisElement = element;
	var email = document.getElementById('email').value;
	var universityName = document.getElementById('contactuniversity').value;
	var contactEmail = document.getElementById('contactemail').value;
	if (email == "" || universityName == "" || contactEmail == "") return;
	isCheckUniv = true;
	url = "/servlet/UniversityExistServlet";
	url += "?email=" + email;
	url += "&universityName=" + universityName;
	url += "&contactEmail=" + contactEmail;
	loadXMLDoc(url, processReqChange);
}
function loadXMLDoc(url, readyproc) 
{		
    if (readyproc == null) readyproc = ajx_processReqChange; 
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) 
    {
        req = new XMLHttpRequest();
        req.onreadystatechange = readyproc;
        req.open("GET", url, true);
        req.send(null);
    	// branch for IE/Windows ActiveX version
    } 
    else if (window.ActiveXObject) 
    {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) 
        {
            req.onreadystatechange = readyproc;
            req.open("GET", url, true);
            req.send();
        }
    }
}
	//keep-alive:
	//this function calls a keep-alive function on the server.
	// the response
	var url="/entry/KeepAlive.jsp";
	function backgroundKeepAlive(){
			//alert("In backgroundKeepAlive");
			var thisUrl = url + "?now=" + Number(new Date());
			loadXMLDoc(thisUrl, keepAliveResponse);
	}
	function keepAliveResponse() 
	{
	    // only if req shows "complete"
	    if (req.readyState == 4) 
	    {
		// only if "OK"
		if (req.status == 200) 
		{
			//we have (by sending to the server, re-set the session timer, now tally it up and see whether we need to log out
			accumulatedKeepAliveTime += keepAliveInterval;
			if (autoKeepAlive){
				if (accumulatedKeepAliveTime >= maxKeepAliveTime){
					maxKeepAliveTime += .25* maxKeepAliveTime;
					showSessionPopOver('sessionTimeOut','sessioncoverFrame');
				}
				else
					continueWork();
			} else 
			showSessionPopOver('sessionTimeOut','sessioncoverFrame');
		} 
		else 
		{
			//Alert("There was a problem retrieving the page:\n" + req.statusText);            
		}
	    }
	}

function ajx_processReqChange() 
{
    // only if req shows "complete"
    if (req.readyState == 4) 
    {
        // only if "OK"
		try{
        if (req.status == 200) 
        {
            // ...processing statements go here...
	    if (!isCheckUniv) return;
      		var response  = req.responseText;
		//alert("response is: " + response);
		if (response != null && response.length > 0 && showPopOver) 
			showPopOver(response);
      		//result    = response.getElementsByTagName('result')[0].firstChild.data;
      		//result = unescape(result);
		//var address = document.getElementById('mailAddress').value;
		//document.getElementById('mailAddress').value = "";
		//if (result == "true") document.getElementById('msg').innerHTML= address + " is verified";
		//else document.getElementById('msg').innerHTML= address + " is unverified";
      		//alert(result);					
		//window.clearTimeout(iTimerID2);
		//StartSessionTimerToDisplay();
		//replaceContentAfterRefresh(result);
		//hideOverlay();      		
        } 
        else 
        {
        		//replaceContentAfterRefresh("There was a problem retrieving the XML data:\n" + req.statusText);            
        }
		}catch(e){}
    }
}

	function continueWork(){
		InitializeTimer();
		hideSessionPopOver('sessionTimeOut');
	}
	var secs;
	var keepAliveInterval = 15*60;	// 15 minutes as secs.
	var timerID = null;
	var timerRunning = false;
	var delay = 300000; //300000 or 5000
	var sessionTimeOutCheckTime = 25;
	var maxKeepAliveTime = 7.5 * 60 * 60;	//7.5 hours as seconds.
	var accumulatedKeepAliveTime = 0;
	var autoKeepAlive = false;
	
	function InitializeTimer(minutes)
	{
	    // Set the length of the timer, in seconds
	    //alert("Setting Timer");
	    //alert("minutes=" + minutes);
	    if (minutes != null) sessionTimeOutCheckTime = minutes;
	    //alert("sessionTimeOutCheckTime=" + sessionTimeOutCheckTime);
	    secs = sessionTimeOutCheckTime * 60;
	    if (autoKeepAlive) secs = keepAliveInterval;
	    StopTheClock();
	    StartTheTimer();
	}
	
	function StopTheClock()
	{
	    if(timerRunning)
		clearTimeout(timerID);
	    timerRunning = false;
	}
	
	function StartTheTimer()
	{
	    if (secs <= 0)
	    {
		StopTheClock();
		//alert("Session time-out prevention function fired.");
		backgroundKeepAlive();	//when timer has counted down through the period(sessionTimeOutCheck, or keepAliveInteval), do the background keep-alive function.
	    }
	    else
	    {
		secs = secs - (delay/1000);	//decrement secs by delay amount (e.g. come here every 'delay' seconds - default 300 secs = 5 mins.)
		timerRunning = true;
		timerID = self.setTimeout("StartTheTimer()", delay);
	    }
	}
	function startKeepAlive(refreshInterval, setMaxKeepAliveTime){
	    autoKeepAlive = true;
	    maxKeepAliveTime = setMaxKeepAliveTime;
	    if (refreshInterval != null) keepAliveInterval = refreshInterval * 60;
	    sessionTimeOutCheckTime = keepAliveInterval;
	    //alert("sessionTimeOutCheckTime=" + sessionTimeOutCheckTime);
	    secs = keepAliveInterval;
	    delay = (secs/4) * 1000;
	    StopTheClock();
	    StartTheTimer();
	}

function urlDecode(str){
    str=str.replace(new RegExp('\\+','g'),' ');
    return unescape(str);
}
function urlEncode(str){
    str=escape(str);
    str=str.replace(new RegExp('\\+','g'),'%2B');
    return str.replace(new RegExp('%20','g'),'+');
}

var END_OF_INPUT = -1;

var base64Chars = new Array(
    'A','B','C','D','E','F','G','H',
    'I','J','K','L','M','N','O','P',
    'Q','R','S','T','U','V','W','X',
    'Y','Z','a','b','c','d','e','f',
    'g','h','i','j','k','l','m','n',
    'o','p','q','r','s','t','u','v',
    'w','x','y','z','0','1','2','3',
    '4','5','6','7','8','9','+','/'
);

var reverseBase64Chars = new Array();
for (var i=0; i < base64Chars.length; i++){
    reverseBase64Chars[base64Chars[i]] = i;
}

var base64Str;
var base64Count;
function setBase64Str(str){
    base64Str = str;
    base64Count = 0;
}
function readBase64(){    
    if (!base64Str) return END_OF_INPUT;
    if (base64Count >= base64Str.length) return END_OF_INPUT;
    var c = base64Str.charCodeAt(base64Count) & 0xff;
    base64Count++;
    return c;
}
function encodeBase64(str){
    setBase64Str(str);
    var result = '';
    var inBuffer = new Array(3);
    var lineCount = 0;
    var done = false;
    while (!done && (inBuffer[0] = readBase64()) != END_OF_INPUT){
        inBuffer[1] = readBase64();
        inBuffer[2] = readBase64();
        result += (base64Chars[ inBuffer[0] >> 2 ]);
        if (inBuffer[1] != END_OF_INPUT){
            result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]);
            if (inBuffer[2] != END_OF_INPUT){
                result += (base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]);
                result += (base64Chars [inBuffer[2] & 0x3F]);
            } else {
                result += (base64Chars [((inBuffer[1] << 2) & 0x3c)]);
                result += ('=');
                done = true;
            }
        } else {
            result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30)]);
            result += ('=');
            result += ('=');
            done = true;
        }
        lineCount += 4;
        if (lineCount >= 76){
            result += ('\n');
            lineCount = 0;
        }
    }
    return result;
}
function readReverseBase64(){   
    if (!base64Str) return END_OF_INPUT;
    while (true){      
        if (base64Count >= base64Str.length) return END_OF_INPUT;
        var nextCharacter = base64Str.charAt(base64Count);
        base64Count++;
        if (reverseBase64Chars[nextCharacter]){
            return reverseBase64Chars[nextCharacter];
        }
        if (nextCharacter == 'A') return 0;
    }
    return END_OF_INPUT;
}

function ntos(n){
    n=n.toString(16);
    if (n.length == 1) n="0"+n;
    n="%"+n;
    return unescape(n);
}

function decodeBase64(str){
    setBase64Str(str);
    var result = "";
    var inBuffer = new Array(4);
    var done = false;
    while (!done && (inBuffer[0] = readReverseBase64()) != END_OF_INPUT
        && (inBuffer[1] = readReverseBase64()) != END_OF_INPUT){
        inBuffer[2] = readReverseBase64();
        inBuffer[3] = readReverseBase64();
        result += ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));
        if (inBuffer[2] != END_OF_INPUT){
            result +=  ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));
            if (inBuffer[3] != END_OF_INPUT){
                result +=  ntos((((inBuffer[2] << 6)  & 0xff) | inBuffer[3]));
            } else {
                done = true;
            }
        } else {
            done = true;
        }
    }
    return result;
}

var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
function toHex(n){
    var result = ''
    var start = true;
    for (var i=32; i>0;){
        i-=4;
        var digit = (n>>i) & 0xf;
        if (!start || digit != 0){
            start = false;
            result += digitArray[digit];
        }
    }
    return (result==''?'0':result);
}

function pad(str, len, pad){
    var result = str;
    for (var i=str.length; i<len; i++){
        result = pad + result;
    }
    return result;
}

function encodeHex(str){
    var result = "";
    for (var i=0; i<str.length; i++){
        result += pad(toHex(str.charCodeAt(i)&0xff),2,'0');
    }
    return result;
}

function decodeHex(str){
    str = str.replace(new RegExp("s/[^0-9a-zA-Z]//g"));
    var result = "";
    var nextchar = "";
    for (var i=0; i<str.length; i++){
        nextchar += str.charAt(i);
        if (nextchar.length == 2){
            result += ntos(eval('0x'+nextchar));
            nextchar = "";
        }
    }
    return result;
    
}
function trim(str){
	// trim off leading spaces
	while (str.charAt(0) == ' '){
		str = str.substring(1);
	}

	//trim off trailing spaces
	while (str.charAt(str.length-1) == ' '){
		str = str.substring(0,str.length-1);
	}

	return str;
}
	var theSessionPopOverDiv;
	var theSessionPopOverDivTop = 200;
	var oldSessionPopOverDivTop = theSessionPopOverDivTop;
	var pos;
	var sessionTimeOutCountDown = 120;
	
	function showSessionPopOver(divName, coverDiv){
		var txtHeight = 86;
		var ttop = 100;
		ttop += 30;
		ttop += "px";
		var tleft = 300;
		tleft += "px";
		document.getElementById(divName).style.height = txtHeight + 20 + "px";
		theSessionPopOverDiv = document.getElementById(divName);
		movePopOver();  //.style.top = f_scrollTop() +200 + "px";
		document.getElementById(divName).style.left = tleft;//leftTop[0] + "px";
		//alert("Divloc: top: " + document.getElementById(univListDiv).style.top );
		document.getElementById(divName).style.display = "block";
		if (document.getElementById(coverDiv)){
			var outerHeight = document.getElementById(divName).style.height + 6;
			document.getElementById(coverDiv).style.height =  txtHeight + 26 + "px";
		}
		document.getElementById('sessionCountDownDiv').innerHTML = sessionTimeOutCountDown + " seconds remaining.";
		poppedUp = true;
		setTimeout('sessionCountDown()',2000);
	}
	function sessionCountDown(){
		if (!poppedUp) return;
		sessionTimeOutCountDown--;
		if (sessionTimeOutCountDown <= 0) sessionTimedOut();
		else {
			document.getElementById('sessionCountDownDiv').innerHTML = sessionTimeOutCountDown + " seconds remaining.";
			setTimeout('sessionCountDown()',2000);
		}
	}
	function sessionTimedOut(){
		alert("Your session has timed out");
		window.location = "/entry/logout.jsp";
	}
	function hideSessionPopOver(divName){
		document.getElementById(divName).style.display = "none";
		sessionTimeOutCountDown = 120;
		poppedUp = false;
	}
	function f_scrollTop() {
		return f_filterResults (
			window.pageYOffset ? window.pageYOffset : 0,
			document.documentElement ? document.documentElement.scrollTop : 0,
			document.body ? document.body.scrollTop : 0
		);
	}
	
	function movePopOver()
	{
		if (window.innerHeight)
		{
			  pos = window.pageYOffset
		}
		else if (document.documentElement && document.documentElement.scrollTop)
		{
			pos = document.documentElement.scrollTop
		}
		else if (document.body)
		{
			  pos = document.body.scrollTop
		}
		if (pos < theSessionPopOverDivTop) pos = theSessionPopOverDivTop;
		else pos += 200;
		if (pos == oldSessionPopOverDivTop)
		{
			theSessionPopOverDiv.style.top = pos + "px";
		}
		oldSessionPopOverDivTop = pos;
		temp = setTimeout('movePopOver()',500);
	}
	
	function f_filterResults(n_win, n_docel, n_body) {
		var n_result = n_win ? n_win : 0;
		if (n_docel && (!n_result || (n_result > n_docel)))
			n_result = n_docel;
		return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
	}
	function findPos(obj) {
		var curleft = 0;
		var curtop = 0;
		if (obj.offsetParent) {
			curleft = obj.offsetLeft
			curtop = obj.offsetTop
			while (obj = obj.offsetParent) {
				curleft += obj.offsetLeft
				curtop += obj.offsetTop
			}
		}
		return [curleft,curtop];
	}
