/**************************************************************************
 **
 ** @Copy Right Knowledge Window Inc. 2002
 **
 ** Cookie functions to handle the user login information and 
 ** offline progress tracking.
 **
 ** Note: offline progress tracking only tracks the first level items of 
 **       imsmanifest.xml. Because of the 4K limitation of cookie.
 **
 ** 
 ** Revision: 
 **	5/20/2002	1.0.1	ANDY 	- SWITCH TO FIRST LEVEL
 **	1/12/2001	1.0.0   KWI	- SUPPORT USER INFO
 **	
 **
 ** Owner:	Andy Li
 **
 **
 ***************************************************************************/

//cookie object, used to tracking user progress, shared by lrnnavigation.htc
var m_objCookieXML = null;
var m_objXSL = null;


/***************************************************************************
 **
 ** Function to save user information cookie
 **
 ***************************************************************************/
function setNavInfoCookie()
{
	traceLog ("Entering setNavInfoCookie()...");

	var nextYear = new Date();
	nextYear.setFullYear(nextYear.getFullYear() + 1);
	var nextYearStr = nextYear.toGMTString();
	var fResult = true;
	var navXML ="";
	
	SafeXMLPointer();
	
	navXML= m_objCookieXML.xml;
	
	traceLog ( "Saved Cookie: " + navXML);
	document.cookie = "vNavInfo=" +escape(navXML) + "; expires=" + nextYearStr; "; path=/";
	
	traceLog ("Finished setNavInfoCookie. Cookie. ");
}

/***************************************************************************
 **
 ** Function to initialize user inforamtion cookie.
 **
 ***************************************************************************/
function initNavInfoCookie()
{
	traceLog ("Entering initNavInfoCookie()");

	var oNodes = null;
	var objManifestXML = null;
	var objCookieXML = null;
	var nextYear = new Date();
	nextYear.setFullYear(nextYear.getFullYear() + 1);
	var nextYearStr = nextYear.toGMTString();
	
	objManifestXML = loadImsXML();
	var len=0;

	if(objManifestXML != null ){
		var szQuery="//manifest[0]/organizations/tableofcontents/item"
		//var szQuery="//*[@identifierref]";
		var oNodes = objManifestXML.documentElement.selectNodes(szQuery);	
		len= oNodes.length;

	}
	
	traceLog ("Loaded Nodes Lenght: " + len);
	
	objCookieXML = new ActiveXObject("Microsoft.XMLDOM");
	objCookieXML.async = false;
	objCookieXML.validateOnParse = false;
	
	if(false==objCookieXML.loadXML("<?xml version='1.0' ?><T></T>")){
	 	showErrorMsg("failed to load cookie XML. Please contact your technical support", null);
	}
	
	rNode =objCookieXML.documentElement;
	
	var x= null;
	for(var i=0; i< len; i++){
		id= oNodes(i).getAttribute("identifier");
		x = objCookieXML.createElement("I");
		x.setAttribute("id", id);
		x.setAttribute("vi", "0");
		x.setAttribute("cu", "0");
		rNode.appendChild(x);
		traceLog ("Finished create node for identifier " + id);
	}
	
	traceLog ("Initialized Cookie: " + objCookieXML.xml); 
	try
	{
		document.cookie = "vNavInfo=" + escape(objCookieXML.xml) + "; expires=" + nextYearStr; "; path=/";
	}catch (e)
	{
		alert ("Cookie setting error: " + e.description);
	}
	traceLog ("Finished initNavInfoCookie. cookie = " + document.cookie);
}

/***************************************************************************
 **
 ** Function to load imsmanifest.xml
 **
 ** imsmanifest file must be located at the parent directory of the launch page
 ** 
 ** or you may need to customize the file location.
 **
 ***************************************************************************/
function loadImsXML()
{
	traceLog ("Entering cookie.js loadImsXML()");
	var fResult = true;
	var manifest_file = "..\\imsmanifest.xml";
	var objXML  = null;
	
	objXML = new ActiveXObject("Microsoft.XMLDOM");	
    	objXML.async = false;
    	objXML.validateOnParse = false;
		
    	if (false == objXML.load(manifest_file))
	{
		alert ("Failed to load imsmanifest.xml. Contact your technical support.");
		return null;
	}
	
	traceLog ("Loaded IMS manifest XML = " + objXML.xml);
	return objXML;
}

/***************************************************************************
 **
 ** Fucntion to load the nave information cookie and populate the xml object
 **
 **
 ** Revision: 5/20/2002 ali - sever may insert a session cookie
 **                           added the additional checkpiont.
 **
 ***************************************************************************/
function loadNavXML(){	
	traceLog ("Entering loadNavXML()");
	var fResult = true;
	var allCookies = "";
	var valArray = null;
	var cookieString = "";
	var navXML = "";
	var eqIndex = 0;
	
	allCookies = document.cookie;
	
	traceLog ( "Cookie Length = " + allCookies.length);
	traceLog ( "current cookie is: " + document.cookie);
		
	if(allCookies.length == 0){
		traceLog ("No Cookie exists, try to initialize a cookie");
		initNavInfoCookie();
		allCookies = document.cookie;		
	}
	
	valArray = allCookies.split(";");
	for(var x=0; x < valArray.length;x++)
	{
		if(valArray[x].indexOf("vNavInfo") > -1)
			cookieString = valArray[x];
	}
	
	eqIndex = cookieString.indexOf("=");
	

	navXML = unescape(cookieString.substring(eqIndex+1,cookieString.length));
	traceLog ("Get navXML --" + navXML);
	
	//navXML is null, may mean there is a tracking session in the cookie
	if ( navXML =="")
	{
		traceLog ("No nav XML because of server puting session into cookie");
		initNavInfoCookie();
		allCookies = document.cookie;
		valArray = allCookies.split(";");
		for(var x=0; x < valArray.length;x++)
		{
			if(valArray[x].indexOf("vNavInfo") > -1)
			cookieString = valArray[x];
		}
	
		eqIndex = cookieString.indexOf("=");
	

		navXML = unescape(cookieString.substring(eqIndex+1,cookieString.length));
		traceLog ("Get navXML --" + navXML);
	}
	
	m_objCookieXML = new ActiveXObject("Microsoft.XMLDOM");
	m_objCookieXML.async = false;
	m_objCookieXML.validateOnParse = false;
	
	traceLog ("Initializing m_objCookieXML ...");
	if(false==m_objCookieXML.loadXML(navXML)){
		alert("failed to load XML");
		alert("Fatal Error: Please contact your technical support");
		fResult = false;
	}
	traceLog ("Success m_objCookieXML initialization");
	return fResult;
		
}

/**************************************************************************
 **
 ** Function to make sure that cookie had been loaded before accessing
 ** the XML object
 **
 **************************************************************************/
function SafeXMLPointer()
{
	var fResult = true;
	if(!m_objCookieXML)
	{
		traceLog ("cookie SafeXMLPointer reload cookie");
		return loadNavXML();
	}
}


/*****************************************************************************
 *
 * Function to load XSL object
 *
 *****************************************************************************/
 function loadObjXSL()
 {
	var xsl_file="..\\LRN Viewer\\XSL\\LRNToSyllabus.xsl";
	traceLog ("Try to load the xsl file from " + xsl_file);
	var objXSLTest = new ActiveXObject("Microsoft.XMLDOM");	
    	objXSLTest.async = false;
    	objXSLTest.validateOnParse = false;
		
    	if (false == objXSLTest.load(xsl_file))
    	{
    		alert("failed to load xsl");
    	}
    	traceLog("Finished xsl loading " + objXSLTest.xml);
    	return objXSLTest;
}


/***************************************************************************
 **
 ** Function to set the vi flag in XML object
 **
 ** The function is called by lrnnavigation.htc
 **
 ***************************************************************************/
function setViInfoInXMLDoc(menuId)
{
	traceLog ("Setting Vi info for menu " + menuId);
	SafeXMLPointer();
	
	var oNode = null;
	if (menuId != null)
	{
		var szQuery = "//I[@id='" + menuId + "']";
		var oNode = m_objCookieXML.documentElement.selectSingleNode(szQuery);
		if (oNode!=null){
			vi=oNode.getAttribute("vi");
			if(vi=="0")
			{
				traceLog ("setting viewed menuid " + menuId );
				oNode.setAttribute("vi", "1");
			}
		}
	}
	
}

/**************************************************************************
 **
 ** Function to set the cu flag
 **
 **************************************************************************/
function setCuInfoInXMLDoc(menuId)
{
	traceLog ("Entering setCuInfoInXMLDoc(menuId) .");

	SafeXMLPointer();
	
	var oNode = null;
	if (menuId != null)
	{
		var szQuery = "//I[@cu='1']";
		var oNode = m_objCookieXML.documentElement.selectSingleNode(szQuery);
		if(oNode!=null)
			oNode.setAttribute("cu", "0");
		var szQuery = "//I[@id='" + menuId + "']";
		var oNode = m_objCookieXML.documentElement.selectSingleNode(szQuery);
		if(oNode!=null)
			oNode.setAttribute("cu", "1");
	}
	
}


/***************************************************************************
 ** 
 ** Function to save the xml object into cookie
 **
 ** This is the public function that shall be called before content exits
 **
 ***************************************************************************/
function saveInfoOnExit(){
	traceLog("saveInfoOnExit() -- calling setNavInfoCookie");
	setNavInfoCookie();
}

/**************************************************************************
 **
 ** reduandant function to initialize the cookie.
 **
 **************************************************************************/
function initNavXML(){
	traceLog ("Entering initNavXML...");
	SafeXMLPointer();
}

/********************************************************************
 ** Public function to get the nav info cookie XML object
 ** called by lrnsyllabus.htc f_init to init the page
 ********************************************************************/
function getObjXML(){
	traceLog ("Entering getObjXML...");
	SafeXMLPointer();
	return m_objCookieXML;
}


/********************************************************************
 ** Public function to get the XSL object
 ** called by lrnsyllabus.htc f_init to init the page
 ********************************************************************/
function getObjXSL()
{
	if (m_objXSL==null )
	{
		m_objXSL=loadObjXSL();
	}	
	return m_objXSL;
}


//Handle user's login information section

var vCookieFName = "";
var vCookieMName = "";
var vCookieLName = "";
var vCookieEmpID = "";
var vCookieOffName = "";
var vCookieOffNum = "";
var vCookieCity = "";
var vCookieState = "";
var vCookieCountry = "";
var vCookieEmail = "";
var vCookieUSEmp = true;
var vCookiePass = "";

//added the following fields for KPMG-MGH project Andy Li 03/09/2003
var vCookieCourse="NO_VALUE";		//course id
var vCookieClass="NO_VALUE";		//class id
var vCookieReg="NO_VALUE";		//registration number

var vCookieBookmark = "";
var vCookieModuleCompleted = new Array();
var vCookieCurrentModule = 1;
var vCookieCurrentLesson = 1;

/**************************************************************************
 **
 ** Function to read user information cookie
 **
 **************************************************************************/
function readUserInfoCookie()
{
	//alert("called readUserInfoCookie()");
	var allCookies = "";
	var valArray = null;
	var cookieString = "";
	var cookieArray = "";
	var eqIndex = 0;
	
	allCookies = document.cookie;
	
	//alert("allcookies=" + allCookies);

	if(allCookies.length == 0)
		return;
		
	valArray = allCookies.split(";");
	
	// Each array element is a cookie...or some of them are at least.
	// This loop will find the one named vUserInfo.
	for(var x=0; x < valArray.length;x++)
	{
		if(valArray[x].indexOf("vUserInfo") > -1)
			cookieString = valArray[x];
	}
	
	eqIndex = cookieString.indexOf("=");
	//added unescape to decode url encode done by iPlanet - Ali - 4-29-2003
	cookieString = unescape(cookieString.substring(eqIndex+1,cookieString.length));
	//alert ("cookie string=" + cookieString);
	cookieArray = cookieString.split("|");
		
	for(var i=0; i < cookieArray.length; i++)
	{	
		var vNameValue = cookieArray[i].split(":");
		if(vNameValue[0].toUpperCase() == "VFNAME")
		{	
			vCookieFName = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VMNAME")
		{
			vCookieMName = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VLNAME")
		{
			vCookieLName = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VEMPID")
		{
			vCookieEmpID = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VOFFNAME")
		{
			vCookieOffName = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VOFFNUM")
		{
			vCookieOffNum = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VCITY")
		{
			vCookieCity = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VSTATE")
		{
			vCookieState = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VCOUNTRY")
		{
			vCookieCountry = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VEMAIL")
		{
			vCookieEmail = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VUSEMP")
		{
			var temp = unescape(vNameValue[1]);
			if(temp == "true")
				vCookieUSEmp = true;
			else
				vCookieUSEmp = false;
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VPASSSTATUS")
		{
			var temp = unescape(vNameValue[1]);
			if(temp == "true")
				vCookiePass = true;
			else
				vCookiePass = false;
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VCOURSE")
		{
			vCookieCourse = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VCLASS")
		{
			vCookieClass = unescape(vNameValue[1]);
			continue;
		}
		if(vNameValue[0].toUpperCase() == "VREG")
		{
			vCookieReg = unescape(vNameValue[1]);
			continue;
		}		
	}
	
}

/**************************************************************************
 **
 ** Function to create user info cookie
 **
 ** revision:  5/20/2002 ali	- move out the navInfo cookie setting
 **************************************************************************/
function setUserInfoCookie()
{
	//Set date for expiry - 1 year from save date.
	var nextYear = new Date();
	nextYear.setFullYear(nextYear.getFullYear() + 1);
	var nextYearStr = nextYear.toGMTString();
	
	//crteate or update a cookie named vUserInfo.
	document.cookie = "vUserInfo=vFName:" + escape(vCookieFName) +
					"|vMName:" + escape(vCookieMName) +
					"|vLName:" + escape(vCookieLName) +
					"|vEmpID:" + escape(vCookieEmpID) +
					"|vOffNum:" + escape(vCookieOffNum) +
					"|vOffName:" + escape(vCookieOffName) +
					"|vCity:" + escape(vCookieCity) +
					"|vState:" + escape(vCookieState) +
					"|vCountry:" + escape(vCookieCountry) +
					"|vEmail:" + escape(vCookieEmail) +
					"|vUSEmp:" + escape(vCookieUSEmp) +
					"|vPassStatus:" + escape(vCookiePass) +
					"|vCourse:" + escape(vCookieCourse) +
					"|vClass:" + escape(vCookieClass) +
					"|vReg:" + escape(vCookieReg) +
					"; expires=" + nextYearStr;
					"; path=/";
	//document.cookie = "vNavInfo=" + escape("");
}

/***************************************************************************
 ** 
 ** Function to save user info cookie
 **
 ***************************************************************************/
function saveToCookie()
{
	vCookieFName = replaceExtraBlanks(document.all.userInfo1.value);
	vCookieMName = replaceExtraBlanks(document.all.userInfo2.value);
	vCookieLName = replaceExtraBlanks(document.all.userInfo3.value);
	vCookieEmpID = replaceExtraBlanks(document.all.userInfo4.value);
	vCookieOffName = replaceExtraBlanks(document.all.userInfo6.value);
	vCookieOffNum = replaceExtraBlanks(document.all.userInfo7.value);
	vCookieCity = replaceExtraBlanks(document.all.userInfo8.value);
	vCookieState = replaceExtraBlanks(document.all.userInfo9.value);
	//vCookieCountry = replaceExtraBlanks(document.all.userInfo10.value);
	vCookieCountry = replaceExtraBlanks(document.all.userCombo.value)
	//vCookieEmail = replaceExtraBlanks(document.all.userInfo10.value);
	if(document.all.userCombo.value == 0)
		vCookieUSEmp = "true";
	else
		vCookieUSEmp = "false";	
	// actually set the cookie values.
	setUserInfoCookie();
	//setNavInfoCookie();
	//initNavInfoCookie();
}

/***************************************************************************
 **
 ** Function to trim the string
 **
 ***************************************************************************/
function replaceExtraBlanks(str)
{
	if(str == "")
		return "";
	 var blankFound = true;
	 while(blankFound)
	{
		if(str.lastIndexOf(" ") == (str.length-1))
		{
			str = str.substring(0,str.length-1);
		}
		else if(str.indexOf(" ") == 0)
		{
			str = str.substring(1,str.length);
		}
		else
			blankFound = false;
	}
	return str;
 }