//////////////// dependencies  ///////////////////////////////
//	must have "ExtendArray.js" included
//	must have "ArrayList.js" included
//	must have "jdPage.js" included
//
///////////////////////////////////////////////////////////////////////////////
// 2006/4/4, Jalen: function "getCompletionRate()" added.
// 2006/1/9, Jalen: Code modified to make it inheritable; function "getNextPage()" bug fixed; function "setSectionStatus()" added.
// 2006/1/3, Jalen: Structure data can be initialized from an XML object as well as an array and a string.
// Last revised on 2005/7/7, Jalen


function jdPageStruct(vaPages) {
	this.buildTree = buildTree;
	this.init = init;
	this.initXML = initXML;
	this.getTreeData = getTreeData;
	this.setTreeData = setTreeData;
	this.getPage = getPage;
	this.getPageLink = getPageLink;
	this.getChildren = getChildren;
	this.doesBelongToSection = doesBelongToSection;
	this.getPageIDFromLink = getPageIDFromLink;
	this.isSectionVisited = isSectionVisited;
	this.isSectionCompleted = isSectionCompleted;
	this.areAllPagesVisited = areAllPagesVisited;
	this.getSectionStatus = getSectionStatus;
	this.setSectionStatus = setSectionStatus;
	this.getAllPagesString = getAllPagesString;
	this.getVisitedPagesString = getVisitedPagesString;
	this.setPagesVisited = setPagesVisited;
	this.getCompletionRate = getCompletionRate;
	this.toString = toString;
	this.getPreviousPage = getPreviousPage;
	this.getSectionLastPage = getSectionLastPage;
	this.getNextPage = getNextPage;
	this.getNextSectionFirstPage = getNextSectionFirstPage;
	this._UnitTestError = _UnitTestError;

	var sItemDelimiter = "|", sDelimiter = "~";
	
	this.buildTree(vaPages);
	
	function buildTree(vaPages) {
		this.aTreeData = new Array();
		if (vaPages != null && vaPages.length > 0) {
			for (var i = 0; i < vaPages.length; i++) {
				this.aTreeData.push(new jdPage(vaPages[i]));
			}
		}
	}
	
	function init(vsData) {
		this.aTreeData = new Array();
		if (vsData != null && vsData.length > 0) {
			var aData = vsData.split(sDelimiter);
			if (aData.length > 0) {
				for (var i = 0; i < aData.length; i++) {
					this.aTreeData.push(new jdPage(aData[i]));
				}
			}
		}
	}
	
	function buildFromXML(aData, oNode) {
		if (oNode != null) {
			var oItem = new jdPage();
			oItem.ID = oNode.attributes.ID;
			if (oNode.parentNode != null) {
				oItem.Parent = oNode.parentNode.attributes.ID;
				for (var i = 0; i < oNode.parentNode.childNodes.length; i++) {
					if (oNode.parentNode.childNodes[i].attributes.ID == oNode.attributes.ID) {
						oItem.SiblingPosition = i + 1;
						break;
					}
				}
			}
			oItem.FilePath = oNode.attributes.path;
			oItem.Title = oNode.attributes.title;
			oItem.Type = oNode.attributes.pageType;
			oItem.ContentFileName = oNode.attributes.filename;
			oItem.ContentFileName2 = oNode.attributes.filename2;
			oItem.Theme = oNode.attributes.theme;
			oItem.Menu = oNode.attributes.menu;
			oItem.Lessons = oNode.attributes.lessons;
			oItem.xOffset = oNode.attributes.xOffset;
			oItem.AutoAdvance = oNode.attributes.autoadvance;
			aData.push(oItem);
			delete oItem;
			if (oNode.hasChildNodes()) {
				for (var j = 0; j < oNode.childNodes.length; j++) {
					buildFromXML(aData, oNode.childNodes[j]);
				}
			}
		}
	}
	
	function initXML(oXML) {
		this.aTreeData = new Array();
		if (oXML != null) {
			buildFromXML(this.aTreeData, oXML);
		}
	}
	
	function getTreeData() {
		return this.aTreeData;
	}
	function setTreeData(vaData) {
		this.aTreeData = vaData;
	}
	
	// Returns a page object or null if not existing.
	function getPage(sPageID) {
		var vObjPage;
		if (sPageID != null && sPageID.length > 0) {
			for (var i=0; i<this.aTreeData.length; i++) {
				if (this.aTreeData[i].ID == sPageID) {
					vObjPage = this.aTreeData[i];
					break;
				}
			}
		}
		return vObjPage;
	}
	
	// Returns the page link array: [FilePath, FrameID]
	function getPageLink(sPageID) {
		var vObj = this.getPage(sPageID);
		if (vObj == null) {
			return new Array();
		} else {
			// To do: Check if the FilePath is an empty string, it should return next page's link.
			return new Array(vObj.FilePath, vObj.FrameID);
		}
	}
	
	// Returns an array of direct children objects.
	function getChildren(sPageID) {
		var aChildren = new Array();
		for (var i=0; i<this.aTreeData.length; i++) {
			if (this.aTreeData[i].Parent == sPageID) {
				aChildren[this.aTreeData[i].SiblingPosition-1] = this.aTreeData[i];
			}
		}
		return aChildren;
	}
	
	//  Returns TRUE if the page belongs to the section or is the section page itself, otherwises returns FALSE. 
	function doesBelongToSection(vsPageID, vsSectID) {
		if (vsPageID == vsSectID) {
			return true;
		} else {
			var vObjPage = this.getPage(vsPageID);
			if (vObjPage == null) {
				return false;
			} else {
				if (vObjPage.Parent == "") {
					return false;
				} else {
					if (vObjPage.Parent == vsSectID) {
						return true;
					} else {
						return this.doesBelongToSection(vObjPage.Parent, vsSectID)
					}
				}
			}
		}
	}
	
	// Returns a page ID or "" if not existing.
	function getPageIDFromLink(sFilePath) {
		var vsPageID = "";
		for (var i=0; i<this.aTreeData.length; i++) {
			if (this.aTreeData[i].FilePath == sFilePath) {
				vsPageID = this.aTreeData[i].ID;
				break;
			}
		}
		return vsPageID;
	}
	
	// Returns true if one or more sub pages are visited.
	function isSectionVisited(vsSectionID) {
		if (vsSectionID == null) return false;
		if (vsSectionID == "") return false;
		var objPage = this.getPage(vsSectionID);
		if (objPage == null) return false;
		if (objPage.isVisited()) {
			return true;
		} else {
			var arrChildren = this.getChildren(vsSectionID);
			if (arrChildren.length <= 0) {
				return false;
			} else {
				for (var i=0; i<arrChildren.length; i++) {
					if (this.isSectionVisited(arrChildren[i].ID)) {
						return true;
					}
				}
				return false;
			}
		}
	}
	
	// Returns true if all sub pages are visited.
	function isSectionCompleted(vsSectionID) {
		if (vsSectionID == null) return false;
		if (vsSectionID == "") return false;
		var objPage = this.getPage(vsSectionID);
		if (objPage == null) return false;
		if (objPage.isVisited()) {
			var arrChildren = this.getChildren(vsSectionID);
			if (arrChildren.length <= 0) {
				return true;
			} else {
				for (var i=0; i<arrChildren.length; i++) {
					if (!this.isSectionCompleted(arrChildren[i].ID)) {
						return false;
					}
				}
				return true;
			}
		} else {
			return false;
		}
	}
	
	// Returns true if ALL pages are visited.
	function areAllPagesVisited() {
		for (var i=0; i<this.aTreeData.length; i++) {
			if (!this.aTreeData[i].isVisited()) {
				return false;
			}
		}
		return true;
	}
	
	function getSectionStatus(vsSectionID) {
		if (this.isSectionVisited(vsSectionID)) {
			if (this.isSectionCompleted(vsSectionID)) {
				return "Completed";
			} else {
				return "Incomplete";
			}
		} else {
			return "Not Attempted";
		}
	}
	
	function setSectionStatus(vsSectionID, bStatus) {
		var objPage = this.getPage(vsSectionID);
		if (objPage != null) {
			var bComplete = (bStatus == true);
			objPage.VisitedStatus = bComplete;
			var arrChildren = this.getChildren(vsSectionID);
			for (var i=0; i<arrChildren.length; i++) {
				this.setSectionStatus(arrChildren[i].ID, bComplete);
			}
		}
	}
	
	function getAllPagesString() {
		var aAllPages = new Array();
		for (var i = 0; i < this.aTreeData.length; i++) {
			aAllPages.push(this.aTreeData[i].ID);
		}
		return aAllPages.join(sItemDelimiter);
	}

	function getVisitedPagesString() {
		var vaPages = new Array();
		for (var i=0; i<this.aTreeData.length; i++) {
			if (this.aTreeData[i].isVisited()) {
				vaPages.push(this.aTreeData[i].ID);
			}
		}
		return vaPages.join(sItemDelimiter);
	}
	
	function setPagesVisited(vsVisited) {
		var arrVisited = vsVisited.split(sItemDelimiter), iPos;
		for (var i=0; i<this.aTreeData.length; i++) {
			if (arrVisited.length > 0) {
				iPos = indexOfArray(this.aTreeData[i].ID, arrVisited, false);
				if (iPos != -1) {
					this.aTreeData[i].VisitedStatus = true;
					//alert(arrVisited);
					arrVisited.splice(iPos, 1);
				}
			} else {
				break;
			}
		}
	}

	// Returns a float, between 0 and 1 inclusive, representing page structure completion.
	function getCompletionRate() {
		var vaPages = new Array();
		for (var i=0; i<this.aTreeData.length; i++) {
			if (this.aTreeData[i].isVisited()) {
				vaPages.push(this.aTreeData[i].ID);
			}
		}
		var fPercentage;
		if (this.aTreeData.length > 0) {
			fPercentage = vaPages.length / this.aTreeData.length;
		} else {
			fPercentage = 0; 
		}
		return fPercentage;
	}

	function toString() {
		var arr = new Array();
		for (var i = 0; i < this.aTreeData.length; i++) {
			arr.push(this.aTreeData[i].toString());
		}
		return arr.join(sDelimiter);
	}

	//  Returns the previous page object within the whole structure or null.
	//    Case 1: If the previous sibling page doesn't have sub pages, the previous page will be the previous sibling page.
	//    Case 2: If the previous sibling page has sub pages, the previous page will be the last subpage of last level of previous sibling page section.
	//    Case 3: If the specified page is the first page in siblings, the previous page will be the parent page.
	function getPreviousPage(sPageID) {
		var vObj = this.getPage(sPageID);
		if (vObj == null) {
			alert("Page '" + sPageID + "' does not exist!");
			return;
		} else {
			if (vObj.Parent == null || vObj.Parent.length == 0) {	// Page does not have parent. It might be a root page.
				return;
			} else {
				var vaSiblingPages = this.getChildren(vObj.Parent);
				if (vaSiblingPages.length == 0) {
					alert("Page '" + sPageID + "' is not positioned properly in the Tree Structure!");
					return;
				} else {
					var oSiblingPages = new ArrayList(vaSiblingPages);
					var iPos = oSiblingPages.IndexOf(vObj, true, "ID");
					delete oSiblingPages;
					if (iPos == -1) {
						alert("Page '" + sPageID + "' is not positioned properly in the Tree Structure!");
						return;
					} else {
					  
						if (iPos == 0) {					// Case 3
							var oParent = this.getPage(vObj.Parent);
							if (oParent.isVirtual()) {		// Virtual page
								return this.getPreviousPage(oParent.ID);
							} else {
								return oParent;
							}
						} else {
							var vaSubPages = this.getChildren(vaSiblingPages[iPos-1].ID);
							if (vaSubPages.length == 0) {	// Case 1
								return vaSiblingPages[iPos-1];
							} else {						// Case 2
								return this.getSectionLastPage(vaSiblingPages[iPos-1].ID);
							}
						}
					  
					}
				}
			}
		}
	}

	//  Returns the last subpage object at the bottom level of a specified page section or null.
	function getSectionLastPage(sPageID) {
		var vObj = this.getPage(sPageID);
		if (vObj == null) {
			alert("Page '" + sPageID + "' does not exist!");
			return;
		} else {
			var vaSubPages = this.getChildren(sPageID);
			if (vaSubPages.length == 0) {
				return vObj;
			} else {
				return this.getSectionLastPage(vaSubPages[vaSubPages.length-1].ID);
			}
		}
	}
	
	//  Returns the next page object within the whole structure or null.
	//    Case 1: If the specified page has sub pages, the next page will be the first child page.
	//    Case 2: If the specified page doesn't have sub pages, the next page will be retrieved by function 'getNextSectionFirstPage'.
	function getNextPage(sPageID) {
		var vObj = this.getPage(sPageID);
		if (vObj == null) {
			alert("Page '" + sPageID + "' does not exist!");
			return;
		} else {
			var vaSubPages = this.getChildren(sPageID);
			if (vaSubPages.length == 0) {		// Case 2
				var voNextSect = this.getNextSectionFirstPage(sPageID);
				if (voNextSect.isVirtual()) {			// Virtual page
					return this.getNextPage(voNextSect.ID);
				} else {
					return voNextSect;
				}
			} else {                     		// Case 1
				if (vaSubPages[0].isVirtual()) {		// Virtual page
					return this.getNextPage(vaSubPages[0].ID);
				} else {
					return vaSubPages[0];
				}
			}
		}  
	}

	//  Returns the first page object at the first level of next section of a specified page section or null.
	//  It starts searching from the next sibling section, and traces up until a new section is found.
	//    Case 1: If the specified page is not the last page in siblings, the result page will be the next sibling page.
	//    Case 2: If the specified page is the last page in siblings, the result page will be the first page at the first level of next section.
	function getNextSectionFirstPage(sPageID) {
		var vObj = this.getPage(sPageID);
		if (vObj == null) {
			alert("Page '" + sPageID + "' does not exist!");
			return;
		} else {
			if (vObj.Parent == null || vObj.Parent.length == 0) {	// This might be a root page or the recursive script reaches the last page of the tree.
				return;
			} else {
				var vaSiblingPages = this.getChildren(vObj.Parent);
				if (vaSiblingPages.length == 0) {
					alert("Page '" + sPageID + "' is not positioned properly in the Tree Structure!");
					return;
				} else {
					var oSiblingPages = new ArrayList(vaSiblingPages);
					var iPos = oSiblingPages.IndexOf(vObj, true, "ID");
					delete oSiblingPages;
					if (iPos == -1) {
						alert("Page '" + sPageID + "' is not positioned properly in the Tree Structure!");
						return;
					} else {
						if (iPos == (vaSiblingPages.length-1)) {		// Case 2
							return this.getNextSectionFirstPage(vObj.Parent);
						} else {										// Case 1
							return vaSiblingPages[iPos+1];
						}    
					}
				}
			}
		}
	}
	
	function _UnitTestError() {
		var aPagesData = new Array(
			"00|||00.asp||Home|||sitemap_ico_",
			"01|00|1|01.asp||Introduction|||sitemap_ico_",
			"01_01|01|1|01_01.asp||Chairman's Welcome|||sitemap_ico_",
			"01_02|01|2|01_02.asp||01_02 Title|||sitemap_ico_",
			"01_03|01|3|01_03.asp||01_03 Title|||sitemap_ico_",
			"01_03#1|01_03|1|01_03#1.asp||01_03#1 Title|||sitemap_ico_",
			"01_03#3|01_03|3|01_03#3.asp||01_03#3 Title|||sitemap_ico_",
			"01_03#2|01_03|2|01_03#2.asp||01_03#2 Title|||sitemap_ico_",
			"01_04|01|4|||01_04 Title|1||sitemap_ico_",
			"01_04#1|01_04|1|01_04.asp||01_04#1 Title|1||sitemap_ico_",
			"01_04#2|01_04|2|01_04#2.asp||01_04#2 Title|0||sitemap_ico_",
			"02|00|2|02.asp||02 Introduction|||sitemap_ico_",
			"02_01|02|1|02_01.asp||02_01 Title|||sitemap_ico_",
			"02_02|02|2|02_02.asp||02_02 Title|||sitemap_ico_"
			);
		var sXMLData = "<module title=\"Security\" ID=\"0300-00000\" path=\"M03/M03_01/lesson_01/\" theme=\"M03/theme.swf\" filename=\"M03_00_00_000.swf\" menu=\"true\" pageType=\"ModIntro\"><topic title=\"Introduction\" path=\"M03/M03_01/lesson_01/\" theme=\"M03_01/theme.swf\" filename=\"M03_01_00_000.swf\" filename2=\"M03_01_00_010.swf\" menu=\"true\" pageType=\"TopicIntro\" lessons=\"false\" /><topic title=\"Preventing Security Incidents\" ID=\"0301-00000\" path=\"M03/M03_01/lesson_01/\" theme=\"M03_01/theme.swf\" filename=\"M03_01_00_000.swf\" filename2=\"M03_01_00_010.swf\" menu=\"true\" pageType=\"TopicIntro\" lessons=\"true\"><lesson title=\"Security Responsibilities\" path=\"M03/M03_01/lesson_01/\"><page ID=\"0301-01000\" title=\"page 1\" filename=\"M03_01_01_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0301-01010\" title=\"page 2\" filename=\"M03_01_01_010.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0301-01020\" title=\"page 3\" filename=\"M03_01_01_020.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-116\" /><page ID=\"0301-01030\" title=\"page 4\" filename=\"M03_01_01_030.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0301-01040\" title=\"page 2\" filename=\"M03_01_01_040.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0301-01045\" title=\"page 3\" filename=\"M03_01_01_045.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-116\" /><page ID=\"0301-01050\" title=\"page 3\" filename=\"M03_01_01_050.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0301-01060\" title=\"page 4\" filename=\"M03_01_01_060.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Security Equipment\" path=\"M03/M03_01/lesson_02/\"><page ID=\"0301-02000\" title=\"page 1\" filename=\"M03_01_02_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0301-02010\" title=\"page 1\" filename=\"M03_01_02_010.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0301-02020\" title=\"page 1\" filename=\"M03_01_02_020.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Preventing Robberies\" path=\"M03/M03_01/lesson_03/\"><page ID=\"0301-03000\" title=\"page 1\" filename=\"M03_01_03_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0301-03010\" title=\"page 1\" filename=\"M03_01_03_010.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0301-03020\" title=\"page 2\" filename=\"M03_01_03_020.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0301-03030\" title=\"page 1\" filename=\"M03_01_03_030.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Preventing Drive-Offs\" path=\"M03/M03_01/lesson_04/\"><page ID=\"0301-04000\" title=\"page 1\" filename=\"M03_01_04_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0301-04010\" title=\"page 1\" filename=\"M03_01_04_010.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0301-04020\" title=\"page 1\" filename=\"M03_01_04_020.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0301-04040\" title=\"page 1\" filename=\"M03_01_04_040.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0301-04030\" title=\"page 1\" filename=\"M03_01_04_030.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0301-04050\" title=\"page 1\" filename=\"M03_01_04_050.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Preventing Shoplifting\" path=\"M03/M03_01/lesson_05/\"><page ID=\"0301-05000\" title=\"page 1\" filename=\"M03_01_05_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0301-05010\" title=\"page 2\" filename=\"M03_01_05_010.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0301-05020\" title=\"page 3\" filename=\"M03_01_05_020.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0301-05050\" title=\"page 4\" filename=\"M03_01_05_050.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0301-05060\" title=\"page 5\" filename=\"M03_01_05_060.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0301-05070\" title=\"page 6\" filename=\"M03_01_05_070.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0301-05080\" title=\"page 7\" filename=\"M03_01_05_080.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Summary\" path=\"M03/M03_01/lesson_06/\"><page ID=\"0301-06000\" title=\"page 1\" filename=\"M03_01_06_000.swf\" menu=\"true\" pageType=\"topicSummary\" /></lesson><lesson title=\"Knowledge Check\" path=\"M03/M03_01/lesson_07/\"><page ID=\"0301-07000\" title=\"page 1\" filename=\"KC_intro.swf\" menu=\"true\" pageType=\"KC_intro\" /><page ID=\"0301-07010\" title=\"page 1\" filename=\"M03_01_07_010.xml\" menu=\"false\" pageType=\"MMC\" /><page ID=\"0301-07020\" title=\"page 1\" filename=\"M03_01_07_020.xml\" menu=\"false\" pageType=\"TF\" /><page ID=\"0301-07030\" title=\"page 1\" filename=\"M03_01_07_030.xml\" menu=\"false\" pageType=\"MMC\" /><page ID=\"0301-07040\" title=\"page 1\" filename=\"M03_01_07_040.xml\" menu=\"false\" pageType=\"MMC\" /><page ID=\"0301-07050\" title=\"page 1\" filename=\"M03_01_07_050.swf\" menu=\"false\" pageType=\"KC_custom\" /><page ID=\"0301-07060\" title=\"page 1\" filename=\"M03_01_07_060.xml\" menu=\"false\" pageType=\"TF\" /><page ID=\"0301-07070\" title=\"page 1\" filename=\"M03_01_07_070.xml\" menu=\"false\" pageType=\"TF\" /><page ID=\"0301-07080\" title=\"page 1\" filename=\"M03_01_07_080.xml\" menu=\"false\" pageType=\"MMC\" /><page ID=\"0301-07090\" title=\"page 1\" filename=\"M03_01_07_090.xml\" menu=\"false\" pageType=\"MMC\" /><page ID=\"0301-07100\" title=\"page 1\" filename=\"M03_01_07_100.xml\" menu=\"false\" pageType=\"TF\" /><page ID=\"0301-07110\" title=\"page 1\" filename=\"KC_Outro.swf\" menu=\"true\" pageType=\"KC_outrob\" /></lesson></topic><topic title=\"Handling Security Incidents\" ID=\"0302-00000\" path=\"M03/M03_02/lesson_01/\" theme=\"M03_01/theme.swf\" filename=\"M03_02_00_000.swf\" filename2=\"M03_02_00_010.swf\" menu=\"true\" pageType=\"TopicIntro\" lessons=\"true\"><lesson title=\"Robber Identification Form\" path=\"M03/M03_02/lesson_01/\"><page ID=\"0302-01000\" title=\"page 1\" filename=\"M03_02_01_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0302-01010\" title=\"page 1\" filename=\"M03_02_01_010.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0302-01020\" title=\"page 1\" filename=\"M03_02_01_020.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0302-01030\" title=\"page 2\" filename=\"M03_02_01_030.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Handling Robberies\" path=\"M03/M03_02/lesson_02/\"><page ID=\"0302-02000\" title=\"page 1\" filename=\"M03_02_02_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0302-02010\" title=\"page 2\" filename=\"M03_02_02_010.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0302-02015\" title=\"page 2\" filename=\"M03_02_02_015.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-206\" /><page ID=\"0302-02020\" title=\"page 2\" filename=\"M03_02_02_020.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0302-02030\" title=\"page 2\" filename=\"M03_02_02_030.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0302-02040\" title=\"page 2\" filename=\"M03_02_02_040.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0302-02050\" title=\"page 2\" filename=\"M03_02_02_050.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Handling Drive-Offs\" path=\"M03/M03_02/lesson_03/\"><page ID=\"0302-03000\" title=\"page 1\" filename=\"M03_02_03_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0302-03010\" title=\"page 1\" filename=\"M03_02_03_010.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-209\" /><page ID=\"0302-03020\" title=\"page 2\" filename=\"M03_02_03_020.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0302-03030\" title=\"page 2\" filename=\"M03_02_03_030.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Handling No Means of Payment\" path=\"M03/M03_02/lesson_04/\"><page ID=\"0302-04000\" title=\"page 1\" filename=\"M03_02_04_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0302-04010\" title=\"page 1\" filename=\"M03_02_04_010.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0302-04020\" title=\"page 1\" filename=\"M03_02_04_020.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0302-04030\" title=\"page 1\" filename=\"M03_02_04_030.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Handling Shoplifting\" path=\"M03/M03_02/lesson_05/\"><page ID=\"0302-05000\" title=\"page 1\" filename=\"M03_02_05_000.swf\" menu=\"true\" pageType=\"presentation\" /><page ID=\"0302-05010\" title=\"page 1\" filename=\"M03_02_05_010.swf\" menu=\"true\" pageType=\"sidebar\" xOffset=\"-209\" /><page ID=\"0302-05020\" title=\"page 1\" filename=\"M03_02_05_020.swf\" menu=\"false\" pageType=\"sidebar\" xOffset=\"-66\" /><page ID=\"0302-05030\" title=\"page 1\" filename=\"M03_02_05_030.swf\" menu=\"true\" pageType=\"LessonSummary\" /></lesson><lesson title=\"Summary\" path=\"M03/M03_02/lesson_07/\"><page ID=\"0302-07000\" title=\"page 1\" filename=\"M03_02_07_000.swf\" menu=\"true\" pageType=\"topicSummary\" /></lesson><lesson title=\"Knowledge Check\" path=\"M03/M03_02/lesson_07/\"><page ID=\"0302-08000\" title=\"page 1\" filename=\"KC_intro.swf\" menu=\"true\" pageType=\"KC_intro\" /><page ID=\"0302-08010\" title=\"page 1\" filename=\"M03_02_07_010.swf\" menu=\"false\" pageType=\"KC_custom\" /><page ID=\"0302-08020\" title=\"page 1\" filename=\"M03_02_07_020.xml\" menu=\"false\" pageType=\"MMC\" /><page ID=\"0302-08030\" title=\"page 1\" filename=\"M03_02_07_030.xml\" menu=\"false\" pageType=\"TF\" /><page ID=\"0302-08040\" title=\"page 1\" filename=\"M03_02_07_040.xml\" menu=\"false\" pageType=\"MMC\" /><page ID=\"0302-08050\" title=\"page 1\" filename=\"M03_02_07_050.swf\" menu=\"false\" pageType=\"KC_custom\" /><page ID=\"0302-08060\" title=\"page 1\" filename=\"M03_02_07_060.xml\" menu=\"false\" pageType=\"MMC\" /><page ID=\"0302-08070\" title=\"page 1\" filename=\"M03_02_07_070.xml\" menu=\"false\" pageType=\"TF\" /><page ID=\"0000-00000\" title=\"page 1\" filename=\"KC_Outro.swf\" menu=\"true\" pageType=\"KC_outro\" /></lesson></topic><topic title=\"Summary\" ID=\"0303-00000\" path=\"M03/M03_03/lesson_01/\" filename=\"M03_03_00_000.swf\" menu=\"true\" pageType=\"ModOutro\" lessons=\"true\"><lesson title=\"Review\" path=\"M03/M03_03/lesson_01/\"><page ID=\"0303-01000\" title=\"page 1\" filename=\"M03_03_01_000.swf\" menu=\"true\" pageType=\"reviewIntro\" /><page ID=\"0303-01010\" title=\"page 1\" filename=\"M03_03_01_010.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01020\" title=\"page 2\" filename=\"M03_03_01_020.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01030\" title=\"page 3\" filename=\"M03_03_01_030.swf\" menu=\"true\" pageType=\"review\" xOffset=\"--116\" /><page ID=\"0303-01040\" title=\"page 4\" filename=\"M03_03_01_040.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01050\" title=\"page 4\" filename=\"M03_03_01_050.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01060\" title=\"page 1\" filename=\"M03_03_01_060.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01070\" title=\"page 2\" filename=\"M03_03_01_070.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01080\" title=\"page 3\" filename=\"M03_03_01_080.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01090\" title=\"page 4\" filename=\"M03_03_01_090.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01100\" title=\"page 4\" filename=\"M03_03_01_100.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01110\" title=\"page 1\" filename=\"M03_03_01_110.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01120\" title=\"page 1\" filename=\"M03_03_01_120.swf\" menu=\"true\" pageType=\"review\" xOffset=\"-116\" /><page ID=\"0303-01130\" title=\"page 1\" filename=\"M03_03_01_130.swf\" menu=\"true\" pageType=\"reviewIntro\" /></lesson><lesson title=\"Quiz\" path=\"M03/M03_03/lesson_02/\"><page ID=\"0303-01000\" title=\"page 1\" filename=\"M03_03_02_000.swf\" menu=\"true\" pageType=\"quizIntro\" autoadvance=\"true\" /><page ID=\"0303-02000\" title=\"page 1\" filename=\"M03_quiz.xml\" menu=\"false\" pageType=\"quiz\" xOffset=\"-114\" /></lesson></topic></module>";
		//var oXML = 
		var obj = new jdPageStruct(aPagesData);
		
		var aOrigPage;
		for (var i=0; i<obj.getTreeData().length; i++) {
			aOrigPage = aPagesData[i].split("|");
			if (obj.getTreeData()[i].ID != aOrigPage[0]) { alert('Page.ID init error'); break; }
			if (obj.getTreeData()[i].Parent != aOrigPage[1]) { alert('Page.Parent init error'); break; };
			if (obj.getTreeData()[i].SiblingPosition != aOrigPage[2]) { alert('Page.SiblingPosition init error'); break; };
			if (obj.getTreeData()[i].FilePath != aOrigPage[3]) { alert('Page.FilePath init error'); break; };
			if (obj.getTreeData()[i].FrameID != aOrigPage[4]) { alert('Page.FrameID init error'); break; };
			if (obj.getTreeData()[i].Title != aOrigPage[5]) { alert('Page.Title init error'); break; };
		}

		if (obj.getPage("01_02").Title != "01_02 Title") return "error 1.1";
		
		if (obj.getPageLink("091_02").length != 0) return "error 2.1";
		if (obj.getPageLink("01_02")[0] != "01_02.asp" || obj.getPageLink("01_02")[1] != "") return "error 2.2";
		
		var aChildren = obj.getChildren("01_03");
		var aChildrenIDs = new Array();
		for (var j=0; j<aChildren.length; j++) {
			aChildrenIDs.push(aChildren[j].ID);
		}
		if (aChildrenIDs.join("|") != "01_03#1|01_03#2|01_03#3") return "error 3.1";
		
		if (obj.doesBelongToSection("01_04#2", "01") != true) return "error 4.1";
		
		if (obj.getPageIDFromLink("01_03#2.asp") != "01_03#2") return "error 5.1";
		
		if (obj.isSectionVisited("01_03") != false) return "error 6.1";
		if (obj.isSectionVisited("01_04") != true) return "error 6.2";
		
		if (obj.isSectionCompleted("01_04#1") != true) return "error 7.1";
		
		if (obj.areAllPagesVisited() != false) return "error 8.1";
		
		if (obj.getVisitedPagesString() != "01_04|01_04#1") return "error 9.1";
		
		if (obj.getPage("01_01").isVisited() != false) return "error 10.1";
		obj.setPagesVisited("00|01_01|01_02");
		if (obj.getPage("01_01").isVisited() != true) return "error 10.2";
		obj.getPage("00").VisitedStatus = false;
		obj.getPage("01_01").VisitedStatus = false;
		obj.getPage("01_02").VisitedStatus = false;
		if (obj.getPage("01_01").isVisited() != false) return "error 10.3";
		
		var obj2 = new jdPageStruct();
		obj2.init(obj.toString());
		if (obj2.getTreeData().length != obj.getTreeData().length) return "error 11.1";
		if (obj2.getTreeData()[5].isVisited() != obj.getTreeData()[5].isVisited()) return "error 11.2";

		if (Math.round(obj.getCompletionRate()*100)/100 != 0.14) return "error 17.1";
		
		if (obj.getSectionLastPage("01").ID != "01_04#2") return "error 12.1";
		if (obj.getSectionLastPage("01_03#3").ID != "01_03#3") return "error 12.2";

		if (obj.getPreviousPage("02").ID != "01_04#2") return "error 13.1";
		if (obj.getPreviousPage("01_04#2").ID != "01_04#1") return "error 13.2";
		if (obj.getPreviousPage("01_04#1").ID != "01_03#3") return "error 13.3";
		
		if (obj.getNextSectionFirstPage("02") != null) return "error 14.1";
		if (obj.getNextSectionFirstPage("01_03#2").ID != "01_03#3") return "error 14.2";
		if (obj.getNextSectionFirstPage("01_04#2").ID != "02") return "error 14.3";
		
		if (obj.getNextPage("02").ID != "02_01") return "error 15.1";
		if (obj.getNextPage("01_03#2").ID != "01_03#3") return "error 15.2";
		if (obj.getNextPage("01_04#2").ID != "02") return "error 15.3";
		if (obj.getNextPage("01_03#3").ID != "01_04#1") return "error 15.4";
		
		if (obj.getSectionStatus("02") != "Not Attempted") return "error 16.1";
		obj.setSectionStatus("02", true);
		if (obj.getSectionStatus("02") != "Completed") return "error 16.2";
		obj.setSectionStatus("02", false);
		if (obj.getSectionStatus("02") != "Not Attempted") return "error 16.3";
		
		return false;
	}

}
;
