//<!-- hiding javascript code
	//   DO NOT ALTER THIS SCRIPT                 
	//   ....unless you really now what you are doing 
	//   These functions work as the "engine", and should not be touched.
	
	function getContentNumRows(n){
		return contentArray[n].length;
	}
	function getName(j){
		return eaArray[j]; 
	}
	function getTitleName(j){
		return subjectArray[j];
	}
	
	function getContentArray(j){
		return contentArray[j];
	}
	function getContentString(j){
		if(j>(contentArray.length+1)){
			return " "
		}
		return eaArray[contentArray[j]];
		
	}	
	//builds array of all references 
	function getAllRefs(){
		var allRefsArr = [];
		var c = 0;
		for(var i=0;i<eaArray.length;i++){
			if(eaArray[i]!=null){
				allRefsArr[c] = i;
				c++;
			}
		}
		return allRefsArr;
	}
	
	//This function writes the reference list
	//function writeRefList(stateString,stateValue){
	//	var v16header = "<div class=\"ibm-container\"><h2>" + getTitleName(stateValue) + "</h2><div class=\"ibm-container-body\"><ul class=\"ibm-link-list\">";
	//	var v16footer = "</ul></div></div>";
	//	var v16refElementHeader = "<li>";
	//	var v16refElementFooter = "</li>";
	//
	//	/* Build array */
	//	var array = contentArray[stateValue];
	//	if(array.length>1){
	//		array = sortArray(array);
	//	}
	//
	//	/* doc writing */
	//	
	//	document.write(v16header);
	//	
	//	/*The row loop*/
	//	for(g=0;g<array.length;g++){			
	//		document.write(v16refElementHeader);
	//		document.write(buildURL(array[g],stateString,stateValue,eaArray[array[g]][1],eaArray[array[g]][0]));
	//		document.write(v16refElementFooter);
	//	}
	//	document.write(v16footer);			
	//}
	function writeRefList(stateString,stateValue, columns){
		var debugMode = false;
		if((stateValue-1) > contentArray.length){
			alert("An error in reference generator has occurred!\n\nIndex value out of bounds in function writeRefList:\nSupplied index: "+stateValue + "\nArray size: "+contentArray.length);
			return false;
		}
		if(isNaN(columns)||columns<1||columns>3){columns = 1;}
		
		var v16header = 	"<div class=\"ibm-container\"><h2>" + getTitleName(stateValue) + "</h2>"+
						"<div class=\"ibm-container-body " + ((columns==1)?"":((columns==2)?" ibm-two-column": " ibm-three-column")) + " \">";
		var v16footer = 			
						"</div>"+
					"</div>";
		var outputString = "";
		var preOutputString = "";

		/* Build array */
		var array = contentArray[stateValue];
		//sorting the array alphabetically
		if(array.length>1){
			array = sortArray(array);
		}
		
		//there cannot be more columns than elements
		if(array.length<columns){columns = array.length;}

		var numPerRow = Math.ceil(getContentNumRows(stateValue)/columns);
		var arrayCnt = 0;
		var dist;

		/* doc writing */		
		outputString +=v16header + "\n";
		preOutputString += "columns:"+columns + "\n";
		preOutputString += "array.length:"+array.length + "\n";

		for(k=0;k<=(columns-1);k++){			
			/*the column loop*/
			if(k!=0 && (array.length%columns!=0)){
				dist = numPerRow-1;
			}else{
				dist = numPerRow;
			}		
			preOutputString += "k:"+k + "\n";
			preOutputString += "   dist:"+ dist + "\n";

			outputString +="<div class=\"ibm-column ibm-list-container ibm-" +(((k+1)==1)?"first":(((k+1)==2)?"second": "third"))+"\">" + "\n";
			outputString +="<ul class=\"ibm-link-list\">" + "\n";
			for(g=0;g<dist;g++){	
				preOutputString += "   g:"+g + "\n";
				preOutputString += "      arrayCnt:"+arrayCnt + "\n";

				if(arrayCnt >= array.length){
					preOutputString += "      ERR: \"array\" out of bounds \n";
				}else{
					if(array[arrayCnt] >= eaArray.length){
						preOutputString += "      ERR: Array \"array[arrayCnt]\" pointer out of bounds \n";	
					}else{		
						if(eaArray[array[arrayCnt]] == null){
							preOutputString += "      ERR: \"eaArray\" null reference at index "+array[arrayCnt]+" \n";	
						}else{
							outputString +="<li "+((g==0)?"class=\"ibm-first\"":"")+">"+buildURL(array[arrayCnt],stateString,stateValue,eaArray[array[arrayCnt]][1],eaArray[array[arrayCnt]][0])+"</li>" + "\n";
						}
					}
				}
				arrayCnt++;
			}
			outputString +="</ul>" + "\n";
			outputString +="</div>" + "\n";
		}
		outputString +=v16footer + "\n";	
			if(debugMode){
				document.write("<br />Reference generator is in debug mode, printing output code:<br /><br />");
				document.write("<textarea style=\"width:528px;height:200px;border:1px solid blue;background-color:#F9F9F9;\">"+preOutputString + "\n\nGenerated code:\n\n-----------------\n" + outputString + "\n----------------</textarea>");
			}else{
				document.write(outputString);
			}
	}
	function buildURL(id,URLappendVarString,URLappendVarVar,linkURL,linkDescription){
		url = "<a href=\"" + linkURL + "\" class=\"";
		if((linkURL.substring((linkURL.length-3),linkURL.length)).toLowerCase().match("pdf")){
			url += "ibm-pdf-link\" target=\"_blank\">";
		}else{
			url += "ibm-forward-link\">";
		}
		url += linkDescription + "</a>";
		return url;
	}
	//This function sorts elements alphabetically
	// Its not a very fast sorting algorithm (O(n^2)) but works well with few elements (n<100 approximately) 
	function sortArray(array){
		var tmpVal=0;
		var b=0;
		for(a=0;a<=(array.length-1);a++){
			for(b=a;b<=(array.length-1);b++){
				var dist;
				var bool=false;
				if(eaArray[array[a]][0].length<=eaArray[array[b]][0]){
					dist=eaArray[array[b]][0].length;
				}else{
					dist=eaArray[array[a]][0].length;
				}
				for(c=0;c<=(dist-1);c++){						
					if(eaArray[array[a]][0].toLowerCase().charAt(c)>eaArray[array[b]][0].toLowerCase().charAt(c)){
						bool=true;
						break;
					}
					if(eaArray[array[a]][0].toLowerCase().charAt(c)!=eaArray[array[b]][0].toLowerCase().charAt(c)){
						break;
					}
				}
				if(bool){
					tmpVal=array[b];
					array[b]=array[a];
					array[a] = tmpVal;
				}
			}		
		}
		return array;
	}
	function gup(name){
		name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		var regexS = "[\\?&]"+name+"=([^&#]*)";
		var regex = new RegExp(regexS);
		var results = regex.exec(window.location.href);
		if( results == null ){
			return "";
		}else{
			return results[1];
		}
	}
	function displayRefList(elementString, columns){
		var elementValue = gup(elementString);
		if(elementValue!=""){
			writeRefList(elementString,elementValue, columns);
		}
	}
	
	//This method is used to display a list of customer references in the RHC
	//the elementValue can either be a number (reference to a category), or an array 
	//of numbers (consisting of reference id's, for a custom list)
	function displayRhcRefList(elementValue,moduleTitle){
		var isArray = false;
		try{
			if(!isNaN(elementValue[0])){
				isArray = true;
			}
		}catch(e){alert(e.description);}
		if (isArray) {
			subjectArray[0] = moduleTitle;
			contentArray[0] = elementValue;
			writeRefList("",0, 1);
			return true;
		}else{
			if(contentArray[elementValue]==null || subjectArray[elementValue]==null){
				return false;
			}
			if(moduleTitle!=""||moduleTitle==null){
				subjectArray[elementValue] = moduleTitle;
			}
			writeRefList("",elementValue, 1);
			return true;
		}
		// The argument was neither a number or an array, do nothing
		return false;
	}
// end hiding -->