function Player()
{
	this.STATUS_NOT_ATTEMPTED = "not attempted";
	this.STATUS_INCOMPLETE = "incomplete";
	this.STATUS_COMPLETED = "completed";
	this.STATUS_PASSED = "passed";
	this.STATUS_FAILED = "failed";
	
	this.gix = 0;
	this.lessonLocation = 0;
	this.framesToLoad = 0;
	this.baseurl = location.href.split("?");
	this.naviPathToRoot = this.baseurl[0].substring(0, this.baseurl[0].lastIndexOf('/')) + '/';
	this.sid = this.createSID();
	
	this.isLightVersion = false;
	this.courseVersion = "";
	
	if (this.naviPathToRoot == "") this.naviPathToRoot = location.href.substring(0, location.href.lastIndexOf('\\')) + '/';
	
	this.setupURIParams();
}

Player.prototype.setupURIParams = function()
{
	var v = getURIParam("wbteLightVersion");
	if (v == "true" || v == "1")
	{
		this.isLightVersion = true;
	}
	var v = getURIParam("wbteVersion");
	if (v != "")
	{
		this.courseVersion = v;
	}
}

Player.prototype.setLightVersion = function(b)
{
	this.isLightVersion = (b == true);
	this.gotoPage(this.gix);
}

Player.prototype.getLightVersion = function()
{
	return this.isLightVersion;
}


Player.prototype.inArray = function(value, searchArray)
{
	for (var i = 0; i < searchArray.length; i++) {
		if (value == searchArray[i]) return true;
	}
	return false;
}

Player.prototype.getLessonStatus = function()
{
	for (var i = 0; i < struct.length(); i++) {
		if (struct.item(i)["visible"] == "1") 
			if (struct.item(i)["status"] == "I" || struct.item(i)["status"] == "N") return this.STATUS_INCOMPLETE;
	}
	return this.STATUS_COMPLETED;
}

Player.prototype.getItemStatus = function(index)
{
	if (index == null || index == "undefined") index = this.gix;
	var itemStatus = struct.findItem(index)["status"];
	switch (itemStatus) {
		case "N": return this.STATUS_NOT_ATTEMPTED; break;
		case "I": return this.STATUS_INCOMPLETE; break;
		case "C": return this.STATUS_COMPLETED; break;
		case "P": return this.STATUS_PASSED; break;
		case "F": return this.STATUS_FAILED; break;
	}
}

Player.prototype.checkPageStatus = function(index, status, checkChildren)
{
	if (index == null || index == "undefined") index = this.gix;
	var item = struct.findItem(index);
	var result = this.inArray(this.getItemStatus(item["gix"]), status.split(","));
	if (checkChildren) {
		for (var i=0; i < struct.length(); i++) {
			var childItem = struct.item(i);
			if (childItem["parent"] == item["index"]) {
				if (this.hasChildren(childItem["gix"])) {
					result = result + this.checkPageStatus(childItem["gix"], status, checkChildren);
				} else {
					result = result + this.inArray(this.getItemStatus(childItem["gix"]), status.split(","));
				}
			}
		}
	}
	return result;
}

Player.prototype.hasChildren = function(index)
{
	if (index == null || index == "undefined") index = this.gix;
	var item = struct.findItem(index);
	for (var i = 0; i < struct.length(); i++) {
		var childItem = struct.item(i);
		if (childItem["parent"] == item["index"]) return true;
	}
	return false;
}

Player.prototype.loadContent = function(gix)
{
	this.gix = gix;
	this.lessonLocation = gix;
	var item = struct.findItem(gix);
	if (item) {
		var link = this.naviPathToRoot + item["href"];
		if (item["type"] == "0")
		{
			link += '_page';
			if (this.isLightVersion)
			{
				link += '.light';
			}
			link += '.html';
		}
		this.loadContentFrameset(link);
		this.setNaviHtml("_page_no_navi", struct.getVisibleItemsIndex(this.gix) 
			+ " / " + struct.getVisibleItemsCount());
	}
}

Player.prototype.findFirstPage = function(status)
{
	if (status != null && status != "undefined") {
		for (var i=0; i < struct.length(); i++) {
			var item = struct.item(i);
			var res = this.inArray(this.getItemStatus(item["gix"]), status.split(","));
			if (item["href"] != "" && res) return item["gix"];
		}
	}
	for (var i = 0; i < struct.length(); i++) {
		var item = struct.item(i);
		if (item["href"] != "") return item["gix"];
	}
	return null;
}

Player.prototype.findParent = function(index)
{
	if (index == null || index == "undefined") index = this.gix;
	var currentItem = struct.findItem(index);
	
	for (var i=0; i < struct.length(); i++) {
		var item = struct.item(i);
		if (item["href"] != "" && item["index"] == currentItem["parent"]) return item["gix"];
	}
	return null;
}

Player.prototype.gotoPage = function(g)
{
	/// ograniczenie czasowe
	/// trzeba gdzies wpisac w kodzie
	/// np : player.expire = new Date(2005, 7, 18);
	if (typeof(this.expire) != "undefined" && typeof(this.expire.getTime) == "function") {
		var now = new Date();
		if (now.getTime() > this.expire.getTime())
		{
			this.loadContentFrameset(this.naviPathToRoot + "pages/html/expire.html");
			return;
		}
	}

	var item = struct.findItem(g);
	if (item == null) {
		item = struct.findItem(player.findFirstPage());
	}	
	if (item) {
		if (item["href"] != "") {
			this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
			return;
		}
	}
}

Player.prototype.nextPage = function(passInvisible, status) 
{
	if (passInvisible == null || passInvisible == "undefined") passInvisible = false;
	
	var i = this.gix;
	var item = null;
	
	if (status != null && status != "undefined") {
		while (item = struct.getNextItem(i)) {
			var res = this.inArray(this.getItemStatus(item["gix"]), status.split(","));
			if (item["href"] != "" && (!passInvisible && item["visible"] == "1") && res) {
				this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
				return;
			}
			i = item["gix"];
		}
	} else {
		while (item = struct.getNextItem(i)) {
			if (item["href"] != "" && (!passInvisible && item["visible"] == "1")) {
				this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
				return;
			}
			i = item["gix"];
		}
	}
	this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + this.gix);
}

Player.prototype.previousPage = function(passInvisible, status)
{
	if (passInvisible == null || passInvisible == "undefined") passInvisible = false;
	
	var i = this.gix;
	var item = null;
	
	if (status != null && status != "undefined") {
		while (item = struct.getPreviousItem(i)) {
			var res = this.inArray(this.getItemStatus(item["gix"]), status.split(","));
			if (item["href"] != "" && (!passInvisible && item["visible"] == "1") && res) {
				this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
				return;
			}
			i = item["gix"];
		}
	} else {
		while (item = struct.getPreviousItem(i)) {
			if (item["href"] != "" && (!passInvisible && item["visible"] == "1")) {
				this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
				return;
			}
			i = item["gix"];
		}
	}
	this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + this.gix);
}

Player.prototype.reload = function()
{
	var item = struct.findItem(this.gix);
	if (item["href"] != "") {
		this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
		return;
	}
}

Player.prototype.further = function(passInvisible) 
{
	var content_frame = this.findFrame("content");
	
	if (content_frame && content_frame.page) content_frame.page.further();
	else this.nextPage();
}

Player.prototype.backwards = function(passInvisible)
{
	this.previousPage(passInvisible);
}

Player.prototype.findFrame = function(name, frame)
{
	if (name == "content") {
		if (frames.course_frame.content != null) return frames.course_frame.content;
	}
	if (name == "tree") {
		if (frames.course_frame.tree != null) return frames.course_frame.tree;
	}
	if (name == "navigation") {
		if (frames.course_frame.navigation != null) return frames.course_frame.navigation;
	}
	
	if (typeof(frame) == "undefined") {
		frame = frames;
	}
	for (var i = 0; i < frame.length; i++) {
		if (frame[i].name == name) {
			return frame[i];
		} else {
			var result = this.findFrame(name, frame[i]);
			if (result) return(result);
		}
	}
	return(null);
}

Player.prototype.loadContentFrameset = function(href) 
{
	var content_frame = this.findFrame("content");
	var tree_frame = this.findFrame("tree");

	//if (content_frame && content_frame.location.href != href) {
	if (content_frame) {
		content_frame.location.href = href;
		var item = struct.findItem(this.gix);
		if (tree_frame && item && item["visible"] == "1") {
			tree_frame.selectedNode(this.gix);
		}
	}
}

Player.prototype.getTotalScore = function()
{
	var maxScore = 0;
	var totalScore = 0;
	for (var i = 0; i < struct.length(); i++) {
		var item = struct.item(i);
		var pageMS = parseInt(item["ms"]);
		if (!isNaN(pageMS)) {
			maxScore += 100;
			if (item["status"] == "P") {
				totalScore += 100;
			}
		}
	}
	var res = Math.ceil(((100 / maxScore) * totalScore));
	return res;
}

Player.prototype.setNaviHtml = function(obj_name, value)
{
	var navigation = this.findFrame("navigation");
	if (navigation != undefined) {
		var obj = navigation.document.getElementById(obj_name);
		if (obj != undefined) obj.innerText = value;
	}
}

Player.prototype.contentDestroy = function()
{
	var f = findFrame("content");
	if (f && f.pageDestroy) {
		f.pageDestroy();
	}
}

Player.prototype.createSID = function ()
{
	var d = new Date();
	return d.getTime();
}

Player.prototype.resetPagesStatus = function ()
{
	for (var i = 0; i < struct.length(); i++) {
		struct.item(i)["status"] = "N";
	}
}

Player.prototype.getPagesCountInChapter = function(root) {
	var result = 0;
	for (var i = 0; i < struct.length(); i++) {
		var item = struct.item(i);
		if (parseInt(item["parent"]) == parseInt(root["index"])) result++;
	}
	return result;
}

Player.prototype.getPageNoInChapter = function(root, item) {
	var result = 0;
	for (var i = 0; i < struct.length(); i++) {
		var item_s = struct.item(i);
		if (parseInt(item_s["parent"]) == parseInt(root["index"])) {
			result++;
			if (item_s["gix"] == item["gix"]) return result;
		}
	}
	return result;
}

Player.prototype.nextPageInChapter = function(passInvisible, status)
{
	if (passInvisible == null || passInvisible == "undefined") passInvisible = false;

	var i = this.gix;
	var root = struct.findItem(this.gix);
	var item = null;
	
	if (status != null && status != "undefined") {
		if (this.hasChildren()) {
			while (item = struct.getNextItem(i)) {
				var res = this.inArray(this.getItemStatus(item["gix"]), status.split(","));
				if (item["href"] != "" 
						&& (!passInvisible && item["visible"] == "1")
						&& item["parent"] == root["index"]
						&& res) {
					this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
					return;
				}
				i = item["gix"];
			}
		}
	} else {
		if (this.hasChildren()) {
			while (item = struct.getNextItem(i)) {
				if (item["href"] != "" && (!passInvisible && item["visible"] == "1")
						&& item["parent"] == root["index"]) {
					this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
					return;
				}
				i = item["gix"];
			}
		}
	}
	
	var idx = this.findParent(this.gix);
	if (idx != null) {
		this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + idx);
	} else {
		idx = this.findFirstPage();
		if (idx != null) {
			this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + idx);
		}
	}
}

Player.prototype.previousPageInChapter = function(passInvisible, statuses)
{
	if (passInvisible == null || passInvisible == "undefined") passInvisible = false;

	var i = this.gix;
	var root = struct.findItem(this.gix);
	var item = null;
	
	if (status != null && status != "undefined") {
		if (this.hasChildren()) {
			while (item = struct.getPreviousItem(i)) {
				var res = this.inArray(this.getItemStatus(item["gix"]), status.split(","));
				if (item["href"] != "" 
						&& (!passInvisible && item["visible"] == "1")
						&& item["parent"] == root["index"]
						&& res) {
					this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
					return;
				}
				i = item["gix"];
			}
		}
	} else {
		if (this.hasChildren()) {
			while (item = struct.getPreviousItem(i)) {
				if (item["href"] != "" && (!passInvisible && item["visible"] == "1")
						&& item["parent"] == root["index"]) {
					this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + item["gix"]);
					return;
				}
				i = item["gix"];
			}
		}
	}
	
	var idx = this.findParent(this.gix);
	if (idx != null) {
		this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + idx);
	} else {
		idx = this.findFirstPage();
		if (idx != null) {
			this.loadContentFrameset(this.naviPathToRoot + "navi/html/loadcontent.html?gix=" + idx);
		}
	}
}

Player.prototype.setTitle = function(item, frameName, objName) {
	if (!item) item = struct.findItem(this.gix);
	var header = this.findFrame(frameName);
	
	if (header && item) {
		var obj = header.document.getElementById(objName);
		if (obj != undefined) obj.innerText = item["title"];
	}
}

Player.prototype.setNumber = function(item, format, frameName, objName) {
	var clear = false;
	var header = this.findFrame(frameName);
	if (!item) {
		item = struct.findItem(this.gix);
	}
	var item_parent = struct.findItemByParent(parseInt(item["parent"]));
	if (!item_parent || parseInt(item["parent"]) == 1) {
		clear = true;
		format = "";
	} else {
		var count = this.getPagesCountInChapter(item_parent);
		var page_no = this.getPageNoInChapter(item_parent, item);
		format = format.replace("%1", page_no);
		format = format.replace("%2", count - 1);
	}
	
	if (header && item) {
		var obj = header.document.getElementById(objName);
		if (obj != undefined) obj.innerText = format;
	}
}

player = new Player();
