
//This file uses the BTree, Chapter and objects to display the table of contents.
var oBrowser = new BrowserObject();
var oTOC;
var List = new Array();
var manual = getQueryStringVar("manual");
var selectedNode = getQueryStringVar("selectednode");
var BookmarkURL = "";
var TOCTitle = "";
var TOCDOC = getQueryStringVar("manual");
var loadedInitialView = false;
var ClickedNode = "";
var StyledNode = "";
var PrintURL = "";
var xOffSet = 0;
var yOffSet = 0;
var LoadFirstTime = 0;

var openImg = new Image();
   openImg.src = "/NASDAQOMXPHLX/images/b_expand.gif";
var closedImg = new Image();
   closedImg.src = "/NASDAQOMXPHLX/images/b_collapse.gif";
var emptyImg = new Image();
	emptyImg.src = "/NASDAQOMXPHLX/images/b_emptynode.gif";

function DrawTheTree(){
	if(! loadedInitialView)	addQueryStringNodetoArray();

	oTOC = window.frames[0].document;
	oTOC.open();
	oTOC.writeln( "<html><head>");
	if(oBrowser.isNS && oBrowser.version==4)
		oTOC.writeln("<link rel=\"stylesheet\" type=\"text/css\" href=\"/NASDAQOMXPHLX/styles/JSTOC_NS4x.css\" />");
	else
		oTOC.writeln("<link rel=\"stylesheet\" type=\"text/css\" href=\"/NASDAQOMXPHLX/styles/JSTOC.css\" />");

	oTOC.writeln("</head>");

	if(! loadedInitialView)
		oTOC.writeln("<body height=\"100%\" onload=\"parent.ScrollToAnchor('" + selectedNode + "');" + ReturnOnload() + "\" >");
	else
		oTOC.writeln("<body height=\"100%\" onload=\"parent.ScrollToOffsets();" + ReturnOnload() + "\" >");

	oTOC.writeln("<form name=\"TOCForm\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" ><tr><td valign=\"top\" align=\"left\">");

	if(oBrowser.isNS && oBrowser.version==4)
		TraverseTreeNS4x( root, 0);
	else
		TraverseTree( root, 0);

    oTOC.writeln("</td></tr></table></form></body></html>");
    oTOC.close();

    if(! loadedInitialView){
    	 //this is only when someone has bookmarked a section , or is viewing a search result.
			 //Otherwise there is no reason to load contents if no chapter parameter has been passed.

    	 if(selectedNode!="")
    	 	 displaySelectedNode();

			 loadedInitialView = true;
		}

	if(StyledNode != "")StyleElement("A"+StyledNode,"bold");
}

function ReturnOnload(){
	   if(oBrowser.isNS)
		   return "parent.ReplaceStyles('"+ selectedNode +"');"
}

function TraverseTree(oNode, iPosition)
{
	var Expanded = false;
	Expanded = isExpanded(oNode.NodeObject);

	if( oNode.hasChildren() ){
		if(iPosition>0){
			if(iPosition==1)
				writeChapterSpan();
			else
				writeSubChapterSpan();

			writeContents(oNode,iPosition,Expanded);
		}

		if( Expanded )
			for(var i =0 ; i<oNode.NodesArray.length ; i++)
				TraverseTree(oNode.NodesArray[i], iPosition+1);

		if(iPosition>0)writeCloseSpan();

	}else{
		if(iPosition==1)
			writeChapterSpan();
		else
			writeLeafSpan();

		writeContents(oNode,iPosition,false);
		writeCloseSpan();
	}
}

function TraverseTreeNS4x(oNode, iPosition)
{
	  	 var Expanded = false;
		 Expanded = isExpanded(oNode.NodeObject);

		 if( oNode.hasChildren() ){
			if(iPosition>0)
			  writeContentsNS4x(oNode,iPosition,Expanded);

			if( Expanded )
			   for(var i =0 ; i<oNode.NodesArray.length ; i++)
			     TraverseTreeNS4x(oNode.NodesArray[i], iPosition+1);

		  }else
		 	  writeContentsNS4x(oNode,iPosition,false);

}

function writeContents(oNode,iPosition,Expanded){
   oTOC.write(returnAnchor(oNode.NodeObject.Number));
   oTOC.write("<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" ><tr height=\"20\"><td align=\"top\" nowrap>");
   WriteTheNode(oNode, iPosition, Expanded);
   oTOC.write("</td></tr></table>");
}

function writeContentsNS4x(oNode,iPosition,Expanded){
   oTOC.write(returnAnchor(oNode.NodeObject.Number));
   WriteTheNodeNS4x(oNode, iPosition, Expanded);
}

function WriteNSSpacing(aNumber){
	var ReturnString = "";
	var Spacer = "&nbsp;&nbsp;"
	while(aNumber>1){
		ReturnString+=Spacer;
		aNumber--;
	}
	return ReturnString;
}

function isExpanded(oChapter){
	if(oChapter==null)return true;  //this is the root of the tree

	var count = 0;
	while( count < List.length ){
		if( List[count]==(oChapter.Number) )
			return true;

		count++;
	}
	return false;
}

function WriteTheNode( oNode, iPosition, Expanded )
{
	var oChapter = oNode.NodeObject
	var theHref = returnTheHref( oChapter, iPosition );
	var symbol  = returnSymbols( oNode, Expanded );
	var indent =  returnIndent( iPosition );
	var URLInput = returnHiddenInput("URL_" + oChapter.Number, oChapter.URL);
	var BookmarkInput = returnHiddenInput("B" + oChapter.Number, oChapter.SGML_ID);
	oTOC.write( "<table cellpadding=\"1\" cellspacing=\"0\" border=\"0\" ><tr><td valign=\"top\" >" + symbol + "</td><td width=\"1\"></td><td valign=\"top\" >" + theHref + "</td></tr></table>" + URLInput + BookmarkInput );
}

function WriteTheNodeNS4x( oNode, iPosition, Expanded )
{
	var oChapter = oNode.NodeObject
	var theHref = returnTheHref( oChapter, iPosition );
	var symbol  = returnSymbols( oNode, Expanded );
	var indent =  returnIndent( iPosition );
	var URLInput = returnHiddenInput("URL_" + oChapter.Number, oChapter.URL);
	var BookmarkInput = returnHiddenInput("B" + oChapter.Number, oChapter.SGML_ID);
	oTOC.write( "<table cellpadding=\"1\" cellspacing=\"0\" border=\"0\" ><tr><td valign=\"top\" nowrap>" + WriteNSSpacing(iPosition) + symbol + "</td><td width=\"1\"></td><td valign=\"top\" >" + theHref + "</td></tr></table>" + URLInput + BookmarkInput );
}

function returnHiddenInput(name,value){
	return "<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\" />";
}

function returnAnchor(number){
 	return "<a name=\"" + number + "\" />";
}

function returnIndent( iPosition ){
   var count = 0;
   var returnString = "";
   var spacer = "&nbsp;&nbsp;";

   while( count < iPosition ){
		returnString += spacer;
		count++;
   }

   return returnString;
}

function returnTheHref( oChapter, iPosition ){
	var title =	oChapter.Title;
	var url	  = oChapter.URL;
	var number = oChapter.Number;

	if( iPosition > 1 )
		return "<a name=\"A" + number + "\" class=\"TOC\" href=\"javascript:parent.targetContent('" + url + "','" + number + "',false);\">" + title + "</a>";
	else
		return "<a name=\"A" + number + "\" class=\"TOC\" href=\"javascript:parent.changeContent('" + url + "','" + number + "',false);\" >" + title + "</a>";
}

function returnSymbols(oNode , Expanded){
	   if(! oNode.hasChildren() ){
		 return "<img src=\"/NASDAQOMXPHLX/images/b_emptynode.gif\" border=\"0\"></img>";
	   }else{
		 if(Expanded){
		 	return "<a href=\"javascript:parent.hideChapter('" + oNode.NodeObject.Number + "');\"><img src=\"/NASDAQOMXPHLX/images/b_collapse.gif\" border=\"0\"></img></a>";
		 }else{
		 	return "<a href=\"javascript:parent.showChapter('" + oNode.NodeObject.Number + "');\"><img src=\"/NASDAQOMXPHLX/images/b_expand.gif\" border=\"0\"></img></a>";
		 }
	   }
}

function writeChapterSpan(){
	writeSpanTag("chapter");
}

function writeSubChapterSpan(){
	writeSpanTag("subchapter");
}

function writeLeafSpan(){
	writeSpanTag("leaf");
}

function writeCloseSpan(){
	   oTOC.write("</span>\n");
}

function writeSpanTag(name){
	 oTOC.write("<span class=\"" + name + "\" >\n");
}

function showChapter(ChapterID){
  RecordOffSets();
  ClickedNode = ChapterID;

  List[List.length] = ChapterID;
  DrawTheTree();

}

function hideChapter(ChapterID){
  RecordOffSets();
  ClickedNode = ChapterID;

  var count = 0;
  while(count < List.length){
	   if( List[count].indexOf(ChapterID)>-1  )
			List[count]="";

	   count++;
  }

  CleanUpArray();
  DrawTheTree();

}

function RecordOffSets(){
   if(oBrowser.isIE){
   	xOffSet = oTOC.body.scrollLeft;
   	yOffSet = oTOC.body.scrollTop;
   }else{
	xOffSet = window.frames["tree"].pageXOffset;
	yOffSet = window.frames["tree"].pageYOffset;
   }
}

function CleanUpArray(){
   var TempArray = new Array();
   var count = 0;

   while(count<List.length){
   		if(List[count]!="")
		   TempArray[TempArray.length]=List[count];

   		count++;
   }

   List = TempArray;
}

function addQueryStringNodetoArray(){
	//First find out what the starting value is:

	if( ! root.hasChildren() ) return;

	var FirstChapter = root.NodesArray[0].NodeObject.Number;
	var lastIndex = FirstChapter.lastIndexOf("_");

	//this is used to start all Chapter ID's
	var GlobalTag = FirstChapter.substr(0,lastIndex);
	var ChaptersArray = (selectedNode.substr(GlobalTag.length+1)).split("_");

	var count=0;
	var ChapterString = "";

	while(count<ChaptersArray.length){
		ChapterString += "_" + ChaptersArray[count];
		List[List.length] = GlobalTag + ChapterString;
	 count++;
	}
	ClickedNode = List[List.length-1];
}

function ReplaceStyles(titleElement){
	StyleTitles(titleElement, StyledNode);
	StyledNode = titleElement;
}

function StyleTitles(ActiveElement, FormerElement){
	if(FormerElement!="") StyleElement("A" + FormerElement,'normal');

	if(ActiveElement!="") StyleElement("A" + ActiveElement,'bold');
}

function StyleElement(ElementID,style){
	 	if((ElementID=="") || (style=="")) return;
		var objChapter;
	 	if(oBrowser.isIE){
	 		if(oTOC.getElementById(ElementID)){
				objChapter = oTOC.getElementById(ElementID).style;
		 		objChapter.fontWeight=style;
		 	}
		}else{
		  if(oBrowser.isNS)
			if(oBrowser.version>4)
				for(var i=0;i<=oTOC.links.length-1;i++)
					if(oTOC.links[i].name==ElementID){
						  oTOC.links[i].style.fontWeight=style;
						  return;
					}
		}
}

function changeContent(VirtualPath,chapter){
		var ViewerURL = ModifyURL(VirtualPath,chapter);

		if((getQueryStringVar("searched")=="1") && (! loadedInitialView))
			  ViewerURL = AddSearchElementsToURL(ViewerURL,chapter);

		SetBookmark(chapter);
		SetPrint(VirtualPath,chapter);
		ReplaceContentFrame(ViewerURL,chapter);
}

function targetContent(VirtualPath, chapter, Search){
		var currentContent = eliminateSubchapters((window.frames[1].location).toString());

		var ViewerURL = eliminateSubchapters(ModifyURL(VirtualPath,chapter));

		if(viewingSameSection(currentContent,ViewerURL)){
			window.frames[1].location.hash="#" + chapter;
			ReplaceStyles(chapter);
			SetBookmark(chapter);
			SetPrint(VirtualPath,chapter);
		}
		else{
			//need a little string manuipulation here, the chpaters in level one load in their entirety,
			//but for viewer purposes, we just want to target the sub chapters.
			//So find the first chapter occurence, and then eliminate all chP that occur after it
			ViewerURL= "/NASDAQOMXPHLXTools/" + ViewerURL + "#" + chapter;

			if(Search)
				ViewerURL=AddSearchElementsToURL(ViewerURL,chapter);

			ReplaceContentFrame( ViewerURL, chapter);
			SetBookmark(chapter);
			SetPrint(VirtualPath,chapter);
		}
}

function displaySelectedNode(){
	 var ChapterURL = GetElement(selectedNode,"URL");

	 if(getQueryStringVar("searched"))
	 	targetContent( ChapterURL ,selectedNode, true);
	 else
		targetContent( ChapterURL ,selectedNode, false);
}

function SetPrint(url,chapter){
	PrintURL = ModifyURL(url,chapter);
}

function SetBookmark(chapter){
	   var uniqueTitle = GetElement(chapter,"SGML_ID");
	   TOCTitle = GetElement(chapter,"Title");
	   BookmarkURL = "http://" + location.host + "/NASDAQOMXPHLXTools/bookmark.asp?id="+ escape(uniqueTitle) + "&manual=" + escape(TOCDOC);
}

function viewingSameSection(ContentURL, ViewerURL){
	 var CArray =  ContentURL.substr(ContentURL.indexOf("?")+1).split("&");
	 var VArray =  ViewerURL.substr(ViewerURL.indexOf("?")+1).split("&");

	 var count = 0;
	 var found = false;
	 while( count < CArray.length ){
		if( ((CArray[count]).toLowerCase()).indexOf("manual=")>-1 ){
			 if(CArray[count] == VArray[count])
			 	return true;
			 else
				return false;

		}
		count++;
	 }
	 return false;
}

function eliminateSubchapters(aURL){
		var tempArray = aURL.split("/");
		var returnArray = new Array();

		var found = false;

		for(var i=0; i<tempArray.length ; i++)
		  if( tempArray[i].indexOf("chp_")==0){
			  if(!found) returnArray[returnArray.length] = tempArray[i];
			  found=true;
		  }else{
			 returnArray[returnArray.length] = tempArray[i];
		  }

		return  returnArray.join("/");
}

function ModifyURL(FilePath,Chapter){
		   return "TOCChapter.asp" + "?manual=" + escape(FilePath) + "&selectedNode=" + escape(Chapter) ;
}

function AddFileAndChapterToURL(VirtualPath,FilePath,Chapter){
	   return VirtualPath + "?manual=" + escape(FilePath) + "&selectedNode=" + escape(Chapter) ;
}

function AddSearchElementsToURL(VirtualPath,DivId){
	  var replacement = "?Searched=1&CiRestriction=" + escape(getQueryStringVar("CiRestriction")) + "&DivId=" + escape(DivId) + "&" ;
	  var newVirtualPath = VirtualPath.replace(/[?]/i,replacement);
	  return newVirtualPath;
}

function ReplaceContentFrame(newURL,chapter){
	    WriteLoading();
     LoadFirstTime = 1;
	    window.frames[1].location.replace( newURL );
		ReplaceStyles(chapter);
}

function WriteLoading(){
	var oContentFrame = window.frames[1].document;
	oContentFrame.open();
	oContentFrame.writeln( "<html><head></head>");
	oContentFrame.writeln("<body height=\"100%\"><table height=\"100%\" width=\"100%\" ><tr><td valign=\"middle\" align=\"center\" >");
	oContentFrame.writeln("<h2><font weight=\"bold\" color=\"#007dc9\" family=\"Arial, Helvetica, Sans-Serif\">Loading, please wait...</font></h2>");
	oContentFrame.writeln("</td></tr></table></form></body></html>");
    oContentFrame.close();
}

function getQueryStringVar(QVariable){
	  var queryString = location.search.substring(1);
	  var ArrayOfPairs = queryString.split("&");
	  var indexOfEqual;

	  for(var i=0;i<ArrayOfPairs.length;i++){
			if(  (ArrayOfPairs[i].toLowerCase()).indexOf(QVariable.toLowerCase())==0){
	  	   indexOfEqual=ArrayOfPairs[i].indexOf("=") +1 ;	
	  	   return unescape(ArrayOfPairs[i].substr(indexOfEqual,ArrayOfPairs[i].length));
			}
	  }
	  return "";
}

function ScrollToAnchor(AnchorID){
 	if(AnchorID=="") return;

	if(oBrowser.isIE){
 	   window.frames[0].location.replace("#"+AnchorID);  
       if (LoadFirstTime == 0)
          {
             var xPos = window.frames["tree"].document.body.scrollLeft;
             var yPos = window.frames["tree"].document.body.scrollTop;
             window.frames["tree"].history.back();
             window.frames["tree"].scrollTo(xPos,yPos);
          }
	}
	//else{
	//  location.replace("#"+AnchorID);
	//}
 LoadFirstTime = 0;
}

function ScrollToOffsets(){
	window.frames["tree"].scrollTo(xOffSet,yOffSet);
}

//Browser Object Below ---------------------------->
function BrowserObject()
{
	//Properties
	this.appName = navigator.appName;
	this.version = parseInt(navigator.appVersion);

	//methods
	this.isIE = (this.appName=='Microsoft Internet Explorer') ? true : false ;
	this.isNS = (this.appName=='Netscape') ? true : false ;
	this.isOther = ((!this.isIE) && (!this.isNS)) ? true : false ;
}

//used by the GetChapterFromTree & GetElement Functions
var SelectedChapterNode;

function GetElement(ID, Prop){
	//The content of the tree is drawn dynamically.
	//Using GetElementById works with IE, but fails
	//with Netscape (possible other browsers too) when you are 
	//working with client-side, javascript generated content.
	//So in this function, we make the app multi-browser compliant
	//by forcing the lookup through he B-Tree rather than using
	//dynamic ouput. 

	GetChapterFromTree(root, ID);
	return SelectedChapterNode[Prop];
}

function GetChapterFromTree(oNode, ID){
	  	 if( ( oNode.NodeObject!=null ) && ( oNode.NodeObject.Number==ID ) ){
			//I can't seem to pass around objects, so I'm a global one, curses!
			SelectedChapterNode = new Chapter(oNode.NodeObject.Number, oNode.NodeObject.Title, oNode.NodeObject.URL, oNode.NodeObject.SGML_ID);
			return true;
		 }

	  	 if( oNode.hasChildren() )
			if( (oNode.NodeObject==null) || ( NodeIsRelative(ID , oNode.NodeObject.Number) ) )
			   for(var i =0 ; i<oNode.NodesArray.length ; i++)
				  GetChapterFromTree(oNode.NodesArray[i], ID);

			return false;
}

function NodeIsRelative(IDSought, NodeID){
	if( (IDSought.indexOf(NodeID)==0  ) )
		return true;
		return false;
}

function setTimer()
{
     if (oBrowser.isNS)
     {
         var frmContent = window.frames['iFrme'].frames['TOCFrames'];
         // Get whether the content has been fully loaded or not from the TOCChapter.asp
         var strValue = frmContent.frames['content'].contentLoaded;
        // If content has been loaded completely, then stop the window
         if (strValue)
         {
             window.stop();
             // Also clear the timeinterval so that this function is not called each and every time
             window.clearInterval(IntervalID);
         }
     }
     else
     {
         window.clearInterval(IntervalID);
     }
}
