/*------------------------------------------------------------
	External script to create nav.
--------------------------------------------------------------*/

/*******************************************************************************************
 *Initialization Variables
 *******************************************************************************************/

var manifest_file = "imsmanifest.xml";
var large_file_msg="This learning object is too large to be played in your web browser. Please notify the copyright owner of this problem."

//====== do not change after this line
var xmlDoc;
var res="IE";
var resourcesHash = new Hashtable();
var resultStr= '';
var currentLevel=0;
var cnumber=0;
var lastItemLine="";
var lastItemName="";
var first=true;
var p="";
var TREE_ITEMS = new Array();
var pre_items=new Array();
var org="";
var recCtr=0;


/*
  display
    input: null
    output: null
    desc:
	initialize menu from xml file
	this is the main function for cp viewer
	
*/
function display()
{
	
	if (initValidate(xmlDoc,large_file_msg)){
		init();
		document.body.innerHTML+=displayMenu(TREE_ITEMS);
		close();
	}
}

/*
getItems
 input: array from parsed items
 output: array of items
 desc:
 format of array:
[ 
	["about.htm" , "about" , "0.0"]
	,["item1.htm","item1","0.1"]
]
*/
function getItems(iArr)
{
	var zArr = new Array();
	for (var ii=0;ii<iArr.length;ii++)
	{
		var xArr = iArr[ii].split('|');
		var contentArr = new Array();
		contentArr[0]=xArr[0];
		contentArr[1]=xArr[1];
		contentArr[2]=xArr[2];
		zArr.push(contentArr);
	}
	return zArr;
}

/*
displayMenu
 input: array of items
 output: HTML script of menu items
 desc:
	display left menu navigation
*/
function displayMenu(tArr)
{
	var tmpStr="";
	for (var jj=0;jj<tArr.length;jj++)
	{
		
			if(jj<tArr.length)
			{
				
				var currentPosition=tArr[jj][2].split('.');
				var nextPosition="";
				if(jj<tArr.length-1) nextPosition=tArr[(parseInt(jj)+parseInt(1))][2].split('.');
				
				//if  item has sub menu items
				if((nextPosition!="")&&(currentPosition.length<nextPosition.length))
				{
					if (tArr[jj][0]=="#")
					{
						
						tmpStr+="\n<li><a onclick=\"showHide(\'"+tArr[jj][2]+"\');updateCurrentItem("+jj+",0);\" target=\"bodyframe\">";
						tmpStr+=tArr[jj][1]; //item name
						tmpStr+="&nbsp;&gt;<\/a>";
					}else{
						tmpStr+="\n<li><a href=\"\.\.\/"+tArr[jj][0]+"\" onclick=\"showHide(\'"+tArr[jj][2]+"\');updateCurrentItem("+jj+",0);\" target=\"bodyframe\">";
						tmpStr+=tArr[jj][1]; //item name
						tmpStr+="&nbsp;&gt;<\/a>";
					}
					tmpStr+="\n<ul id=\""+tArr[jj][2]+"\" class=\"hide\">";
				}else
				{	
					if (tArr[jj][0]=="#")
					{
						tmpStr+="\n<li><a onclick=\"showHide(\'"+tArr[jj][2]+"\');updateCurrentItem("+jj+",0);\" target=\"bodyframe\">";
						tmpStr+=tArr[jj][1]; //item name
						tmpStr+="&nbsp;&gt;<\/a>";
					}else{
						tmpStr+="\n<li><a href=\"\.\.\/"+tArr[jj][0]+"\" onclick=\"updateCurrentItem("+jj+",0);\" target=\"bodyframe\">";
						tmpStr+=tArr[jj][1]; //item name
						tmpStr+="<\/a><\/li>";						
					}
					
				}
				//if there are less item.position's than previous item's item.position's
				if((nextPosition!="")&&(currentPosition.length>nextPosition.length))
				{
				var dif=currentPosition.length-nextPosition.length;
					
					for (var zz=dif;zz>0;zz--)
					{
							tmpStr+="\n<\/ul>";
							tmpStr+="\n<\/li>";			
					}
					dif=0;
				}
			}
	}
	return tmpStr;
}
/*
  forwardbackLinks
    input: array of menu items, current item's index
    output: html code for forward back links
    desc:
	this is to create previous and next button @ lnav.htm
	
*/
function forwardbackLinks(tArr,current)
{
	var nextHref="<input type=\"button\" value=\"Next\" disabled>";
	var prevHref="<input type=\"button\" value=\"Prev\" disabled>";
	var result="";
	
	if(current<tArr.length-1)
	{
		nextHref="<input type=\"button\" value=\"Next\" onclick=\"parent.nav.updateCurrentItem("+parseInt(current+1)+",1);\">";
	}
	
	if(current>0) 
	{	
		prevHref="<input type=\"button\" value=\"Prev\" onclick=\"parent.nav.updateCurrentItem("+parseInt(current-1)+",1);\">";
	}
	result+=prevHref;
	result+=nextHref;
	return result;
}
/*
 updateTitle
    input: array of menu items, current item's index
    output: html code for item title
    desc:
	this is to display item title @ lnav.htm
	
*/
function updateTitle(tArr,current)
{	
	var result="";	
	if(tArr){
		if (tArr[current]){
			if (tArr[current][1]) 
			{
				result+=tArr[current][1];
				return result;
			}else{
				return "";
			}
		}
	}
}
/*
    updateCurrentItem
    input: current item index
    output: null
    desc:
	this is to update:
		* next and previous URL
		* bodyframe  page
	
*/
function updateCurrentItem(n,nextprev)
{
	
	if(parseInt(n)>0) 
	{
		document.getElementById("currentItem").value=parseInt(n);	
	}else{
		n=0;
		document.getElementById("currentItem").value=0;
	}
	parent.footer.document.getElementById("nextPrev").innerHTML=forwardbackLinks(TREE_ITEMS,n);
	parent.footer.document.getElementById("itemTitle").innerHTML=updateTitle(TREE_ITEMS,n);
	if (parent.bodyframe) 
	{
		if(TREE_ITEMS[n][0]=="#") 
		{
		
		}else{
			parent.bodyframe.location.href="../"+TREE_ITEMS[n][0];
		}
	}
	if (nextprev==1){

		if(document.getElementById(TREE_ITEMS[n][2])){
			if(document.getElementById(TREE_ITEMS[n][2]).className=='hide') {
				showHide(TREE_ITEMS[n][2]);
				if(document.getElementById(TREE_ITEMS[n-1][2])){
					if(document.getElementById(TREE_ITEMS[n-1][2]).className=='hide') showHide(TREE_ITEMS[n-1][2]);
				}

			}
		}
		
	}
}



/*
   initResources
    input: XML Document
    output: hashtable containing list of resources
    desc:
	this is to initiate HREFs from XML Document (imsmanifest.xml)
	
*/
function initResources(doc)
{
	
	var ctrRes;
	var tempHash = new Hashtable();
	
	for (ctrRes=0;ctrRes<doc.getElementsByTagName("*").length;ctrRes++){
	
		var thisResource = doc.documentElement.getElementsByTagName("*")[ctrRes];
		if (thisResource){
			if (thisResource.nodeName=="resource"){
				if((thisResource.attributes.getNamedItem('identifier'))&&(thisResource.attributes.getNamedItem('href'))){
					tempHash.put(thisResource.attributes.getNamedItem('identifier').nodeValue,thisResource.attributes.getNamedItem('href').nodeValue);
				}
			}
		}
		
	}
	return tempHash;
}

/*
   displayNodes
    input: root node of xml document
    output: array of items
    desc:
	this is to generate array of items : ["(href_1)|(item_name_1)|(item_position_1)","(href_2)|(item_name_2)|(item_position_2)", ...,"(href_n)|(item_name_n)|(item_position_n)"]
	
*/

function displayNodes(node,pos,i,r)
{


	var htmlLine="";
	//display current node
	if (node!=null) {
		if ((node.nodeName!="#text")&&(node.nodeName!="title")&&(node.nodeName!="#document")&&(node.nodeName!="xml")&&(node.nodeName!="#comment")&&(node.nodeName!="manifest")&&(node.nodeName!="metadata")&&(node.nodeName!="schema")&&(node.nodeName!="schemaversion")&&(node.nodeName!="adlcp:location")&&(node.nodeName!="file"))
		{
			var totalSpaces=pos.split(".").length-5;
			if ((node.nodeName=="organization"))
			{
				if (res=="FF")
				{
					curNode=node.childNodes[1].childNodes[0];
				}else{
					curNode=node.childNodes[0].childNodes[0];
				}
				
				if (curNode)
				{
					org = curNode.nodeValue;
				
				}//end if organization has children
			}//end if organization
			
			if ((node.nodeName=="item"))
			{
				if (res=="FF")
				{
					if(node.childNodes[1]){
						curNode=node.childNodes[1].childNodes[0];
					}else{
						curNode=node.childNodes[0].childNodes[0];
					}
				}else{
					curNode=node.childNodes[0].childNodes[0];
				}
				if (curNode)
				{
					var itemName=curNode.nodeValue;
						var lastDot=0;
						var lastThirdDigit=0;
						var lastSecondDigit=0;
						var tlastDigit=0;
						var tremoveLastDigit="";
						var removeLastSecondDigit="";
						var removeLastThirdDigit="";
						
						var itemRef="#";
						if (node.attributes.getNamedItem('identifierref'))
						{
							var itemRefValue=node.attributes.getNamedItem('identifierref').nodeValue;
							itemRef=r.get(itemRefValue);
						}
						
						var tmp;
						var howMany=0;
						var stats=0;
						var diff=0;
						if(p=="") p="0.0";
								tremoveLastDigit=removeLastDigit(p,1);
								
								tlastDigit=getLastDigit(removeLastDigit(p,0));
								removeLastSecondDigit=removeLastDigit(p,2);
								lastSecondDigit=getLastDigit(tremoveLastDigit);
								

								if (currentLevel==totalSpaces)
								{
										if (tremoveLastDigit!="")
										{
											tlastDigit++;
											p=tremoveLastDigit+"."+tlastDigit;
										}
								}
								if (currentLevel<totalSpaces)
								{
									cnumber+=1;
									resultStr = Left(resultStr,parseInt(resultStr.length)-parseInt(lastItemLine.length));
									
									if(first) first=false;
									if ((tremoveLastDigit!="")&&(p!="0.0")) p+=".0";
									currentLevel = totalSpaces;
								}
								if(currentLevel>totalSpaces)
								{
									
									if ((tremoveLastDigit!="")&&(p!="0.0"))
									{
										diff=currentLevel-totalSpaces+1;
										
										tremoveLastDigit=removeLastDigit(p,diff);
										tlastDigit=getLastDigit(removeLastDigit(p,diff-1));
										tlastDigit++;
										p=tremoveLastDigit+"."+tlastDigit;
									}
									cnumber=cnumber-totalSpaces;
									currentLevel = totalSpaces;

								}
						pre_items.push(itemRef+"|"+itemName+"|"+p);
				}//end if item has children
			}//end if item
		}// end if 
	}//end if nodename =organisation, items, etc..
	//display children
	if (node.hasChildNodes()) 
	{
		i=i+1;
		//add more level down
		pos+=".0";
		recCtr++;
		displayNodes(node.firstChild,pos,i,r);
	}//end if has children
	
	//display sibling
	if (((node.nextSibling!=null) || (node.nextSibling)))
	{
		//add last digit with 1
		var lastDigit = parseInt(Right(pos,pos.length-(pos.lastIndexOf('.')+1)));
		var x=0;

		pos = Left(pos,pos.lastIndexOf('.'));
		if ((node.nextSibling.nodeName=="resource")||((node.nextSibling.nodeName=="item"))) 	
		{
			pos = Left(pos,pos.lastIndexOf('.'));
			
		}
		pos +="."+(lastDigit+1).toString();
		recCtr++;
		displayNodes(node.nextSibling,pos,i,r);
		
	}// end if has sibling
			
	if ((!node.nextSibling)&&(!node.hasChildNodes))
	{
		return;
	}//end if process ends
}// end function
/*
   getBrowser
    input: 
    output: string of browser type
    desc:
	this is to generate browser type
	
*/
function getBrowser(){
	if (navigator.appName=="Microsoft Internet Explorer"){
		if(navigator.appVersion.indexOf("MSIE 7")>=0){
			//IE 7
			return "IE7";
		}else{
			if(navigator.appVersion.indexOf("MSIE 6")>=0){
				return "IE6";
			}else{
				return "OTHER";
			}
		}
	}else{
		if (navigator.appName=="Netscape"){
			if(navigator.appVersion.indexOf("Safari")>=0){
				return "SAFARI";
			}else{
				return "OTHER";		
			}
		}
	}

}
/*
   initValidate
    input: xml document of imsmnanifest.xml
    output: true=valid, false=invalid
    desc:
	this is to check xml file size
	
*/

function initValidate(doc,msg)
{
	if (doc.getElementsByTagName("*").length>10000){
	
		if (getBrowser()!="IE7"){
			alert(msg);
			return false;
		}
		else {
			if (doc.getElementsByTagName("*").length>15000) {
			alert(msg);
			return false;
			}

		} 
	}
	
	return true;
}


//-->
// End -->