/*
 * Copyright (c) 1995-2011 by 4system Polska Sp. z o.o.
 * All Rights Reserved. v4
 */
var PAGETYPE_UNKNOWN = "Unknown";
var PAGETYPE_INFORMATION = "Information";
var PAGETYPE_EXERCISE = "Exercise";
var PAGETYPE_HIDDEN = "Hidden";
var PAGETYPE_POLL = "Poll";
var PAGESTATUS_NOT_ATTEMPTED = "N";
var PAGESTATUS_INCOMPLETE = "I";
var PAGESTATUS_COMPLETED = "C";
var PAGESTATUS_PASSED = "P";
var PAGESTATUS_FAILED = "F";
var KEY_SEP = "¦";
var CHAR_A_CODE = 97;
var GLOBAL_MAX_POINTS = -1;
function getIdentiefier09az(index)
{
	if (index > 9) return String.fromCharCode(87 + index);
	else return index;
};
UELODDCalculator = function()
{
	var namesList = new Array();
};
UELODDCalculator.prototype.setNamesList = function(s)
{
	this.namesList = new Array();
	if (s.indexOf("||") > -1) var list = s.split("||");
	else var list = s.split(":");
	for (var i = 0; i < list.length; i++)
	{
		var items = list[i].split("|");
		for (var j = 0; j < items.length; j++) 
		{
			var ex = false;
			for (var k = 0; k < this.namesList.length; k++)
			{
				if (this.namesList[k] == items[j])
				{
					ex = true;
					break;
				}
			}
			if (!ex) 
			{
				this.namesList[this.namesList.length] = items[j];
			}
		}
	}
};
UELODDCalculator.prototype.getNameCode = function(name)
{
	for (var i = 0; i < this.namesList.length; i++)
	{
		if (this.namesList[i] == name)
		{
			return String.fromCharCode(CHAR_A_CODE + i);
		}
	}
	return "";
};
UELODDCalculator.prototype.transform = function(ss, s, all_possible)
{
	if (all_possible && all_possible != "") this.setNamesList(all_possible);
	else this.setNamesList(ss);
	var r = "{";
	s += "";
	if (s.length != 0)
	{
		if (s.indexOf("||") > -1) var sr = s.split("||");
		else var sr = s.split(":");
		for (var i = 0; i < sr.length; i++)
		{
			if (r.length > 1) r += ",";
			r += String.fromCharCode(CHAR_A_CODE + i) + ".";
			r += this.getNameCode(sr[i]);
		}
	}
	r += "}";
	return r;
};
UELODDCalculator.prototype.transformToPermutation = function(ss, s, all_possible)
{
	if (all_possible && all_possible != "") this.setNamesList(all_possible);
	else this.setNamesList(ss);
	var g = new Array();
	if (s.indexOf("||") > -1) var list = s.split("||");
	else var list = s.split(":");
	for (var i = 0; i < list.length; i++)
	{
		g[i] = new Array();
		var items = list[i].split("|");
		if (i == 0) {
			for (var k = 0; k < items.length; k++) 
			{
				g[i][g[i].length] = {"index":items[k],"parent":-1};
			}
		} else {
			for (var j = 0; j < g[i - 1].length; j++)
			{
				for (var k = 0; k < items.length; k++) 
				{
					g[i][g[i].length] = {"index":items[k],"parent":j};
				}
			}
		}
	}
	var res = "";
	for (var i = 0; i < g[g.length - 1].length; i++)
	{
		var p = g.length - 1;
		var mod = "";
		if (res.length > 0) res += ";"
		res += "{";
		var item = g[g.length - 1][i];
		mod += String.fromCharCode(CHAR_A_CODE + p) + "." + this.getNameCode(item["index"]);
		p--;
		var parent = item["parent"];
		for (var j = g.length - 2; j >= 0; j--)
		{
			mod = String.fromCharCode(CHAR_A_CODE + p) + "." + this.getNameCode(g[j][parent]["index"]) + "," + mod;
			parent = g[j][parent]["parent"]
			p--;
		}
		res += mod + "}";
	}
	return (res);
};
/*
  *
  *
  */
UELOInteractions = function()
{
	this.gix = 0;
	this.id = "";
	this.elementId = "";
	this.correctResponses = "";
	this.studentResponse = "";
	this.all_possible = "";
	this.answerValuesString = "";
	this.correctResponsesAsText = "";
	this.studentResponseAsText = "";
	this.time = "";
	this.timestamp = null;
	this.type = "";
	this.weighting = "";
	this.status = PAGESTATUS_NOT_ATTEMPTED;
	this.result = "";
	this.maxScore = 0;
	this.score = 0;
	this.question = "";
	this.latency = null;
	this.tryNumber = 0;
	this.maxTryNumber = 0;
	this.solveVersion = 0;	
    this.versions = new Array();
};
UELOInteractions.prototype.AddCorrectResponses = function(pattern)
{
	var p = this.FindCorrectResponses(pattern);
	if (p == null)
	{
		p = this.correctResponses[this.correctResponses.length] = pattern; 
	}
	return p;
};
UELOInteractions.prototype.FindCorrectResponses = function(pattern)
{
	for (var i = 0; i < this.correctResponses.length; i++)
	{
		if (this.correctResponses[i] == pattern)
		{
			return this.correctResponses[i];
		}
	}
	return null;
};
UELOInteractions.prototype.setValue = function(name, value)
{
	// wyjatki do poprawinie i ujednolicenia
	if (name == "answers") name = "studentResponse";
	if (name == "group") name = "id";
	
	if (typeof(this[name]) == "undefined") return;
	
	if (name == "status"){
		if(value=='P'){
			this['result']=true;
			this['score']=this.maxScore;
		}
		else this['result']=false;
		
	}
	
	if (typeof(this[name]) == "number" || typeof(this[name]) == "string" || typeof(this[name]) == "boolean"){
		this[name] = value;
	}
};
UELOInteractions.prototype.getValue = function(name)
{
	return (typeof(this[name] != "undefined")) ? this[name] : null;
}
UELOInteractions.prototype.setResult = function(value, userScore)
{
	if(value==true){
		this.result=true;
		this.status='P';
		if (userScore){
			this.score=userScore;			
		}else{
			this.score=1;
		};		
	} else {
		this.result=false;
		this.status='F';
		if (userScore){
			this.score=userScore;			
		}else{
			this.score=0;
		};		
	};	
};
UELOInteractions.prototype.addVersion = function(vIndex, vText)
{
	var v = new UELOInterVersion();    	
    v.versionIndex = vIndex;
    v.versionText = vText;
	this.versions[this.versions.length] = v;
	return v;
};
UELOInteractions.prototype.getVersionQuestion = function(vIndex)
{
	for (var k in this.versions)
	{
		if (this.versions[k].versionIndex == vIndex)
		{
			return this.versions[k].versionText;
		}
	}
	return this.question;
};
UELOYellowCard = function()
{
	this.id = "";
	this.cardType = "";
	this.date = "";
	this.author = "";
	this.left = "";
	this.top = "";
	this.title = "";
	this.note = "";
	this.buttonAdd = "";
	this.showUserName = false;
	this.pageName = '';
	this.pageGI = -1;	
	this.personGraphic = "";
	this.clockGraphic = "";
	this.isMaximalize = false;
};
UELOYellowCard.prototype.setValue = function(name, value)
{
	// wyjatki do poprawinie i ujednolicenia
	if (name == "cardId") name = "id";
	if (typeof(this[name]) == "undefined") return;
	if (typeof(this[name]) == "number" || typeof(this[name]) == "string" || typeof(this[name]) == "boolean") {
		if (name == "isMaximalize") this[name] = (value == "true");
		else this[name] = value;
	}
};
/*
  *
  *
  */
UELOPage = function()
{
	this.pageId = "";
	this.scoId = "";
	this.type = -1;
	this.access = true;
	this.pageType = PAGETYPE_UNKNOWN;
	this.status = PAGESTATUS_NOT_ATTEMPTED;
	this.title = "";
	this.chapterName = "";
	this.versionTitle = "";
	this.versionChapterName = "";	
	this.globalIndex = -1;
	this.pageVisited = 0;
	//this.blockRestorePage = false; //pg2-qr -removed, 'cause below there is a duplicate
	this.correctResponses = new Array();
	this.interactions = new Array();
	this.yellowCards = new Array();	
	this.visible = 1;	
	this.marked = false;
	this.attempted = false;
	this.userAnswer = "";
	this.userMarkers = "";
	this.sessionTime = 0;
    this.href = "";
    this.parent = 1;
    this.ms = 0;
    this.score = 0;
    this.status = PAGESTATUS_NOT_ATTEMPTED;
    this.realParent = 1;
    this.iss = -1;
    this.haveParent = false;
    this.versions = new Array();//new UELOVersion();
    this.sessionTime = 0;
	this.blockRestorePage = false;	
	this.isExamPage = false;	
	this.passed = false;	
	this.isQuizPageToReset = false; //pg2-bsh_test
	this.visitedCount = 0;
	this.isBookmark = false;
	
	this.previouslyVisible = true; //pg2-qr_test -previously available page (exercise or information one)
	this.previousStatus = '';
};
UELOPage.prototype.setPageTitle = function(vIndex)
{
	this.versionTitle = this.getVersionText(vIndex, "title", this.title);
	this.versionChapterName = this.getVersionText(vIndex, "chapterName", this.chapterName);	
}
UELOPage.prototype.FillYellowCards = function(params)
{
	if (typeof(params) != "undefined" && params != "") {
		var paramsArr = params.split(",");
		
		for (var i=0; i<paramsArr.length; i++) {
			if (paramsArr[i] != "") {
				var itemAttr = paramsArr[i].split(";");
				
				this.AddYellowCard("systemCard" + i/*unescape(itemAttr[0])*/, unescape(itemAttr[1]),
					unescape(itemAttr[2]), unescape(itemAttr[3]),
					unescape(itemAttr[4]), unescape(itemAttr[5]),
					unescape(itemAttr[6]), unescape(itemAttr[7]),
					'' , '', '' , '', '' , '', '' , '', '', 
					'___.yellowCard.author.gif', '___.yellowCard.time.gif' , '','', '', '', '', 'false', this.title, this.globalIndex
					);
			}
		}
	}
};
UELOPage.prototype.AddYellowCard = function(id, date, cardType, left, top, author, title, note, src, trashOver, trashOut, miniOver, miniOut, hideOver, hideOut, minimalizedMyCard, myDot, personGraphic, clockGraphic, defaultMinimalize, showMouseOver, isMaximalize, hourLang, buttonAdd, showUserName, pageName, pageGI)
{
	var yellowCard = this.FindYellowCard(id);
	if (yellowCard == null && id != "") {
		yellowCard = this.yellowCards[this.yellowCards.length] = new UELOYellowCard();
		yellowCard.id = id;
		yellowCard.date = (date && date != "") ? date : formatTime("datetime");
		yellowCard.cardType = cardType;
		yellowCard.left = left;
		yellowCard.top = top;
		yellowCard.author = author;
		yellowCard.title = title;
		yellowCard.note = escape(note);
		yellowCard.hourLang = hourLang;
		yellowCard.buttonAdd = buttonAdd;
		yellowCard.showUserName = showUserName;
		yellowCard.pageName = pageName;
		yellowCard.pageGI = pageGI;
		if (src) yellowCard.src = src;
		if (trashOver) yellowCard.trashOver = trashOver;
		if (trashOut) yellowCard.trashOut = trashOut;
		if (miniOver) yellowCard.miniOver = miniOver;
		if (miniOut) yellowCard.miniOut = miniOut;
		if (hideOver) yellowCard.hideOver = hideOver;
		if (hideOut) yellowCard.hideOut = hideOut;
		if (minimalizedMyCard) yellowCard.minimalizedMyCard = minimalizedMyCard;
		if (myDot) yellowCard.authorDot = myDot;
		if (personGraphic) yellowCard.personGraphic = personGraphic;
		if (clockGraphic) yellowCard.clockGraphic = clockGraphic;
		if (defaultMinimalize) yellowCard.defaultMinimalize = defaultMinimalize;
		if (showMouseOver) yellowCard.showMouseOver = showMouseOver;
		if (isMaximalize) yellowCard.isMaximalize = isMaximalize;
		else yellowCard.isMaximalize = false;
	};
	return yellowCard;
};
UELOPage.prototype.updateYellowCard = function(id,date,author,left,top,title,note,src,miniBckg,trashOver,trashOut,miniOver,miniOut,hideOver,hideOut,myDot,personGraphic,clockGraphic,defaultMinimalize,showMouseOver,isMaximalize)
{
	var yellowCard = this.FindYellowCard(id);
	//if (yellowCard && yellowCard.cardType == "private") {
	if (yellowCard) {
		yellowCard.date = date;
		yellowCard.author = author;
		yellowCard.left = left;
		yellowCard.top = top;
		yellowCard.title = title;
		yellowCard.note = escape(note);
		yellowCard.src = src;
		yellowCard.minimalizedMyCard = miniBckg;
		yellowCard.trashOver = trashOver;
		yellowCard.trashOut = trashOut
		yellowCard.miniOver = miniOver;
		yellowCard.miniOut = miniOut;
		yellowCard.hideOver = hideOver;
		yellowCard.hideOut = hideOut;
		yellowCard.authorDot = myDot;
		yellowCard.personGraphic = personGraphic;
		yellowCard.clockGraphic = clockGraphic;
		yellowCard.defaultMinimalize = defaultMinimalize;
		yellowCard.showMouseOver = showMouseOver;
		yellowCard.isMaximalize = isMaximalize;
		return true;
	};
	return false;
};
UELOPage.prototype.DeleteYellowCard = function(id)
{	
	for (var i = 0; i < this.yellowCards.length; i++) {
		var yellowCard = this.yellowCards[i];
		if (yellowCard && yellowCard.id == id) {
			this.yellowCards[i] = null;
			return true;
		};
	};
	return false;
};
UELOPage.prototype.FindYellowCard = function(id)
{
	for (var i = 0; i < this.yellowCards.length; i++) {
		var yellowCard = this.yellowCards[i];
		if (yellowCard && yellowCard.id == id) {
			return yellowCard;
		}
	}
	return null;
};
UELOPage.prototype.setValue = function(name, value)
{
	// wyjatki do poprawinie i ujednolicenia
	if (typeof(this[name]) == "undefined") return;	
	
	if (typeof(this[name]) == "number" || typeof(this[name]) == "string" || typeof(this[name]) == "boolean")
	{		
		this[name] = unquotedString(value);
	}
};
UELOPage.prototype.AddInteraction = function(elementId, question, correctResponses, maxScore, tryNumber, maxTryNumber, type, answerValuesString, all_possible, elementType, reportData)
{
	/*
	if (elementType.indexOf('Light',0) > 0){
		elementType=elementType.substring(0,elementType.indexOf('Light',0));
	}
	*/
	var interId = this.FormatInteractionId(elementId, this.globalIndex);
	var inter = this.FindInteraction(interId);
	if (inter == null)
	{
		var inter = this.interactions[this.interactions.length] = new UELOInteractions();
		inter.gix = this.interactions.length;
		inter.id = interId;
		inter.elementType = elementType;
		inter.elementId = elementId;
		inter.question = question || "";
		inter.maxScore = maxScore || "";
		inter.maxTryNumber = maxTryNumber || "";
		inter.correctResponses = correctResponses || "";
		inter.type = type || "";
		inter.all_possible = all_possible || "";
		inter.answerValuesString = answerValuesString || "";
		inter.reportData = reportData || "";
		return inter;
	} else {
		return inter;
	}
};
UELOPage.prototype.FindInteraction = function(interId)
{
	for (var i = 0; i < this.interactions.length; i++)
	{
		var inter = this.interactions[i];
		if (inter.id == interId)
		{
			return inter;
		}
	}
	return null;
}
UELOPage.prototype.FormatInteractionId = function(elementId, pageGlobalIndex)
{
	return elementId + "_" + pageGlobalIndex;
}
UELOPage.prototype.addVersion = function(vIndex, vType, vText){
	var v = new UELOPageVersion();    	
    v.versionIndex = vIndex;
    v.versionText = vText;
	v.versionType = vType;
	this.versions[this.versions.length] = v;
	return v;
}
UELOPage.prototype.getVersionText = function(vIndex, vType, defaultText)
{
	for (var k in this.versions) {
		if (this.versions[k].versionIndex == vIndex && this.versions[k].versionType == vType) {
			return this.versions[k].versionText;
		}
	}	
	return defaultText;
}
UELOPage.prototype.existsVersionPage = function(vIndex, vType)
{
	for (var k in this.versions) {
		if (k.versionIndex == vIndex && k.versionType == vType) {
			return true;
		}
	}
	return false;
};
UELOInterVersion = function(){
    this.versionIndex = 0;
    this.versionText = "";
}
UELOPageVersion = function(){
    this.versionIndex = 0;
	this.versionType = "";
    this.versionText = "";
}
UELOPage.prototype.getRawScore = function()
{
	if(this.pageType==PAGETYPE_HIDDEN) return "";
	if(this.pageType!=PAGETYPE_EXERCISE) return "";
	var res=0;
	for (var j = 0; j < this.interactions.length; j++)
	{
		var inter = this.interactions[j];
		res += parseInt(inter.score);
	}
	return res;
}
UELOPage.prototype.getRawScoreMax = function()
{
	if(this.pageType==PAGETYPE_HIDDEN) return "";
	if(this.pageType!=PAGETYPE_EXERCISE) return "";
	var res=0;
	for (var j = 0; j < this.interactions.length; j++)
	{
		var inter = this.interactions[j];
		res += parseInt(inter.maxScore);
	}
	return res;
}
UELOPage.prototype.getRawPageTry = function()
{
	if (this.pageType == PAGETYPE_EXERCISE) {
		for (var j = 0; j < this.interactions.length; j++) {
			var inter = this.interactions[j];
			if (inter.tryNumber > 0) return inter.tryNumber;
		}
	}
	return 0;
};
UELOPage.prototype.getCMIScore = function()
{	
	var score = this.getRawScore();
	var max = this.getRawScoreMax();
	if (score == "" || max == "") return "";
	return ((score*100)/max).toFixed(0);
}
UELOPage.prototype.resetPageInteractions = function() //pg2-bsh
{
	this.status = PAGESTATUS_NOT_ATTEMPTED;
	this.passed = false;
	this.solved = false;
	this.score = 0; //pg2-qr
	for (var i = 0; i < this.interactions.length; i++) {
		var inter = this.interactions[i];			
		inter.studentResponse = "";
		inter.studentResponseAsText = "";
		inter.time = "";
		inter.timestamp = null;
		inter.status = PAGESTATUS_NOT_ATTEMPTED;
		inter.result = "";
		inter.score = 0;
		inter.tryNumber = 0;
	}
}
/*
  *
  *
  */
UELO = function()
{
	this.pages = new Array();
	this.notepad = new Array();
	this.keySep = KEY_SEP;	
	this.scoId = "";
	this.courseName = "";
	this.courseDescription = "";	
	this.username = "";
	this.password = "";
	this.organisation = "";
	this.server = "";
	this.percentCompleted = "";
	this.pagesCount = 0;
	this.exercisePagesCount = 0;
	this.pagesVisited = 0;
	this.pointsMax = 100;
	this.points = 0;
	this.passThreshold = 100;
	this.beginTime = new Date();
	this.endTime = new Date();
	this.sessionTime = 0;
	this.userVars = "";
	this.lastVisitedPage = 0;
	this.saveUelo = 0;
	this.showUserAnswers = true;
	this.initialized = false;
	this.sco_gix = -1;
    this.sco_uelo = null;	
	this.sendDataInterval = 0;
	this.sendResultsToServerTime = 0;	
	this.courseOryginalStatus = "";
	this.courseOryginalScore = 0;
	this.writeValuesList = new Array("organisation", "username", "password", "server", "percentCompleted", "pagesVisited", "pointsMax", "points", "passThreshold",  "beginTime", "endTime", "courseName", "courseDescription", "keySep", "userVars", "lastVisitedPage", "score", "marked", "attempted");
    this.index = 0;
    this.rootPage = null;
	this.examParentGix = -1;
	this.firstOffsetPages = 0;
	this.lastOffsetPages = 0;
	this.countShowPages = 0;	
	this.isCourseMixed = false;  	
	this.timerDataSender = null;  	
	this.timerPostponeSender = null;
	
	this.previousMixedStructure = ""; //pg2-qr_test -previously visible pages structure
	this.pageInAssessmentCheckAnswerInSession = false; //pg2-qr
};

UELO.prototype.RunTimerDataSender = function()
{
	this.UpdateTimerDataSender();
}

UELO.prototype.UpdateTimerDataSender = function()
{
	if (config.sendDataToServerOnEachPage) {
		this.StopTimerDataSender();
		this.timerDataSender = window.setInterval('uelo.TimerDataSend()', (60000 * 5));
	}
}
UELO.prototype.StopTimerDataSender = function()
{
	if (this.timerDataSender != null) {
		window.clearInterval(this.timerDataSender);
	}
}
UELO.prototype.TimerDataSend = function()
{
	this.sendSubDataToServer();
}
UELO.prototype.AddPage = function()
{
	var p = new UELOPage();
	this.pages[this.pages.length] = p;
	this.pagesCount++;
	return p;
};
UELO.prototype.setRootPage = function()
{
    this.rootPage = new UELOPage();
    return this.rootPage;
}
UELO.prototype.LoadFromForm = function(textAreaName)
{
};
//String parent.UELO.getHeaderString(String Name) - daje text z naglowka 
UELO.prototype.GetHeaderString = function(name)
{
	for (var k in this)
	{
		var type = typeof(this[k]);
		if (type == "number" || type == "string" || type == "boolean" || type == "object")
		{
			return this[k];
		}
	}
	return null;
};
UELO.prototype.setHeaderString = function(name, value)
{
	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	// wyjatki do poprawinie i ujednolicenia
	if (name == "Server_for_check_Answers") name = "server";
	
	var f = new RegExp("^" + name + "$", "gi");
	for (var k in this)
	{
		if (k.match(f))
		{
			for (var j = 0; j < this.writeValuesList.length; j++)
			{
				if (this.writeValuesList[j].toLowerCase() == k.toLowerCase())
				{
					if (typeof(this[k]) == "number" || typeof(this[k]) == "string" || typeof(this[k]) == "boolean")
					{
						this[k] = value;
						return;
					}
					if (typeof(this[k]) == "object" && (k == "beginTime" || k == "endTime")) 
					{
						this[k] = this.stringToDate(value);
						return;
					}
				}
			}
		}
	}
};
//String parent.UELO.getDataStringByID(int PageId;String ColumnName) - daje text z danych linia szukajac po PageId
UELO.prototype.GetDataStringByID = function(pageId, name)
{
};
//String parent.UELO.getDataStringByIdx(int RowIdx;String ColumnName) - daje text z danych linia RowIdx
UELO.prototype.GetDataStringByIdx = function(rowIdx, columnName)
{
};
//String parent.UELO.getDataStringByName(String PageName;String ColumnName) - daje text z danych linia szukajac po PageId
UELO.prototype.GetDataStringByName = function(pageName, columnName)
{
};
//int parent.UELO.getDataRowCount() - daje ilosc linii
UELO.prototype.GetDataRowCount = function()
{
}
//String parent.UELO.setDataStringByID(int PageID;String ColumnName,String value)
UELO.prototype.SetDataStringByID = function(pageID, columnName, value)
{
};
UELO.prototype.setPageTitle = function(gix, vIndex)
{
	var page = this.FindPage(gix);
	if (page)
	{
		page.setPageTitle(vIndex);
	}
}
UELO.prototype.setBookmark = function(gix, value)
{
	var page = this.FindPage(gix);
	if (page) {
		page.isBookmark = (value == true);
	}
}
UELO.prototype.GetPageStudentAnswer = function(gix, examMode)
{
	var result = "";
	var sep = "";
	var page = this.FindPage(gix);
	if (page) { 
		if (page.pageType == PAGETYPE_EXERCISE) {
			for (var j = 0; j < page.interactions.length; j++) {
				var inter = page.interactions[j];
				var studentResponse = inter.studentResponse;
				//if (examMode && //pg2- it's 'undefined', so for baskets with many elements it wouldn't be executed...ever
				if (inter.id.indexOf("DDBasket") > -1) {
					studentResponse = studentResponse.replace(/,/g, "|");
				}
				result += sep + studentResponse;
				sep = "~";
			}
		} else if (page.userAnswer != "") {
			result += page.userAnswer;
		}
	}
	return result;
};
UELO.prototype.getPageTryNumber = function(gix)
{
	var result = -1;
	var page = this.FindPage(gix);
	if (page) {
		if (page.pageType == PAGETYPE_EXERCISE) {
			for (var j = 0; j < page.interactions.length; j++) {
				var inter = page.interactions[j];
				/*
				var tryRemain = inter.maxTryNumber - inter.tryNumber;
				if (tryRemain>result) result = tryRemain;
				*/
				//return result = inter.tryNumber; //pg2-removed
				if (inter.tryNumber > result) result = inter.tryNumber;  //pg2-dg -check for max tryNumber (ex.component MarkSentence has no 'real' inter and tryNumber is const)
			}
		}
	}
	return result; 
};
UELO.prototype.getExerciseTryMaxNumberTitle = function(gix, value)
{
	var result = "";
	var sep = '\n';
	var page = null;
	for (var i = 0; i < this.pages.length; i++) {
		page = this.pages[i];
		if (page.visible == 1 && page.interactions.length < 1) continue;
		result += sep;
		result += page.title+" : ";
		result += page.interactions[0].tryNumber + "/";
		result += page.interactions[0].maxTryNumber + " ";
	}	
	return result;
};

UELO.prototype.getExerciseTryNumber = function(gix, value) //pg2-qr -modyfied
{
	var res = "";
	var p = null;
	for (var i = 0; i < this.pages.length; i++) {
		p = this.pages[i];
		//if (p.visible == 0) continue; //pg2-removed, in case of drawing pages, it could happen, that in next drawing, page's try count wasn't saved - so always check it
		try {
			if (res != '') res += ',';
			if ((p.blockRestorePage || p.interactions.length > 0) && p.pageType == PAGETYPE_EXERCISE) {
				res += p.interactions[0].tryNumber + ''; //intToLetter(p.interactions[0].tryNumber); //pg2-qr -replaced, tryNumber could be value up to 99
			}else{
				res += "0";
			}
		} catch(e) {}; //pg2-sometimes there was exceptions within this block
	}	
	return res;
};

UELO.prototype.SetPageStudentAnswer = function(gix, value) //pg2-qr -modyfied
{
	if (typeof(value) == "undefined" || value == null) return;
	var p = this.FindPage(gix);
	if (p) {
		if (p.blockRestorePage) return;	
		if (p.pageType == PAGETYPE_EXERCISE) {
			var valueStr = value + ""; //pg2- if number will be passed, an exception will be invoked
			var valueArr = valueStr.split("~"); //pg2
			for (var j = 0; j < p.interactions.length; j++) {
				var inter = p.interactions[j];
				inter.studentResponse = (typeof(valueArr[j]) != "undefined") ? valueArr[j] : "";
			}
		} else p.userAnswer = value;
	}
};

UELO.prototype.GetPageMarkers = function(gix)
{
	var result = null;
	var page = this.FindPage(gix);
	if (page) {
		result = page.userMarkers;
	}
	return result;
};
UELO.prototype.SetPageMarkers = function(gix, value)
{
	if (typeof(value) == "undefined" || value == null) return;
	var page = this.FindPage(gix);
	if (page) {
		page.userMarkers = value;
	}
};
UELO.prototype.pageAttempted = function(gix)
{
	var result = false;
	var page = this.FindPage(gix);
	if (page) {
		page.attempted = true;
		result = true;
	}
	return result;
};
UELO.prototype.pageNotAttempted = function(gix)
{
	var result = false;
	var page = this.FindPage(gix);
	if (page) {
		page.attempted = false;
		result = true;
	}
	return result;
};
UELO.prototype.getPageAttempt = function(gix)
{
	var page = this.FindPage(gix);
	if (page) {
		return  page.attempted;
	}
	return false
};
UELO.prototype.markPage = function(gix)
{
	var result = false;
	var page = this.FindPage(gix);
	if (page) {
		page.marked = true;
		result = true;
	}
	return result;
};
UELO.prototype.unmarkPage = function(gix)
{
	var result = false;
	var page = this.FindPage(gix);
	if (page) {
		page.marked = false;
		result = true;
	}
	return result;
};
UELO.prototype.updateUELOFromSDMultiple = function(status, userans)
{
	if (this.sco_gix != -1) {
		this.setPageStatus(this.sco_gix, status);
		this.SetPageStudentAnswer(this.sco_gix, userans);
	}
};

UELO.prototype.updateUELOFromSD = function(statusString, userAnswers, tryNumberStr, interStatus, scoringList) //pg2-qr -modyfied
{
	var sep = "";
	if (statusString.indexOf(",") > -1) sep = ",";
	
	var arr = statusString.split(sep);
	var tryNumberArr = [];
	if (typeof(tryNumberStr) != 'undefined') 
	{
		tryNumberArr = tryNumberStr.split(","); //pg2-qr -replaced "" with "," -remove letters, use max 2-digit numbers
	}
	var structPage = null;
	for (var i = 0; i < arr.length; i++) {
		structPage = struct.findItemGixByArrIndex(i);
		if (typeof(tryNumberArr[i]) != 'undefined'){
			//this.setPageStatusFromSD(structPage, arr[i], letterToInt(tryNumberArr[i])); //pg2-qr -replaced with below one (remove letters, it could be a 2-digit number, and letters range isn't that wide)
			this.setPageStatusFromSD(structPage, arr[i], parseInt(tryNumberArr[i])); //pg2-qr -new
		}else{
			this.setPageStatusFromSD(structPage, arr[i], 0);
		}
	}
	
	if (typeof(userAnswers) != "undefined") {
		var dataArr = userAnswers.split(";");
		for (var i = 0; i < dataArr.length; i++) {
			var dItem = dataArr[i].split("=");
			if (dItem[0].indexOf("_ua") > -1) {
				var gix = dItem[0].replace("_ua", "");
				this.SetPageStudentAnswer(gix, unescape(dItem[1]));
			}
		}
	}
	
	if (typeof(interStatus) != "undefined") {
		this.setInteractionsStatus(interStatus);
	}
	
	if (typeof(scoringList) != "undefined") {
		
	}
};

UELO.prototype.getLastVisitedPage = function()
{
	if (this.lastVisitedPage != 0) return this.lastVisitedPage
	var lastPage = null;
	for (var i = 0; i < this.pages.length; i++) {
		if(this.pages[i].status == 'I'){
			this.pages[i].globalIndex;
		}else if(this.pages[i].status == PAGESTATUS_NOT_ATTEMPTED){
			return lastPage;
		}
		lastPage = this.pages[i].globalIndex;
	}
	return lastPage;
};
UELO.prototype.setLastVisitedPage = function(pageNo)
{
	this.lastVisitedPage = pageNo;
};
UELO.prototype.getPageIndexInStruct = function(pageGlobalIndex)
{
	for (var i = 0; i < this.pages.length; i++) {
		if(this.pages[i].globalIndex == pageGlobalIndex) return i;
	}
}
UELO.prototype.getPageAccess = function(gix)
{
	var p = this.FindPage(gix);
	return (p) ? p.access : true;
}
UELO.prototype.setPageAccess = function(gix, b)
{
	var p = this.FindPage(gix);
	if (p) {
		p.access = b;
	}
}
UELO.prototype.getPageType = function(pageGlobalIndex)
{
	var p = this.FindPage(pageGlobalIndex);
	if (p) {
		return p.pageType;
	}
}
UELO.prototype.showUELOPageInteractions = function(pageGlobalIndex, displayValues)
{
	var result = "";
	var ueloPage = this.FindPage(pageGlobalIndex);
	if (ueloPage) {
		for (var i = 0; i < ueloPage.interactions.length; i++) 
		{
			var inter = ueloPage.interactions[i];
			result += '\n';
			for (var j = 0; j < displayValues.length; j++) 
			{
				result += '\n';
				result += displayValues[j]+" : " + inter[displayValues[j]];
			}
		}
	}
	return result;
}
UELO.prototype.getPagesArrWithStatus = function(sep)
{
	var resultArr = new Array();
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		resultArr.push([page.globalIndex, page.title, page.status]);
	}
	return resultArr;
}
UELO.prototype.getPagesStatus = function(sep)
{
	var result = "";	
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		result += sep + page.status;
	}
	return result;
}
UELO.prototype.getPageStatus = function(pageGlobalIndex)
{
	var p = this.FindPage(pageGlobalIndex);
	if (p) {
		return p.status;
	}
}
UELO.prototype.setPageStatusFromSD = function(pageGlobalIndex, newPageStatus, tryNumber)
{
	var p = this.FindPage(pageGlobalIndex);
	if (p) {
		if (p.blockRestorePage) return;	
		if (typeof(newPageStatus) == "undefined") newPageStatus = PAGESTATUS_NOT_ATTEMPTED; //pg2
		p.status = newPageStatus;
		if ((p.status != PAGESTATUS_NOT_ATTEMPTED) && (p.status != 'I') && (p.status != 'not attempted') && (p.status != 'incomplete')) p.pageVisited = 1; //pg2
		if (p.status == 'P') p.passed = true;
		
		for (var i = 0; i < p.interactions.length; i++) {
			var inter = p.interactions[i];
			inter.tryNumber = tryNumber;
			if (inter.status == PAGESTATUS_NOT_ATTEMPTED) inter.status = newPageStatus;
			if (newPageStatus == 'P'){
				inter.score = inter.maxScore;
				inter.result=true;
			}
			if (newPageStatus == 'F'){
				inter.score = 0;
				inter.result=false;
			}
		}
	}
}
UELO.prototype.setPageStatus = function(pageGlobalIndex, newPageStatus)
{
	var p = this.FindPage(pageGlobalIndex);
	if (p) {
		if (typeof(newPageStatus) == "undefined") newPageStatus = PAGESTATUS_NOT_ATTEMPTED; //pg2-ewspa, in exe page at startup is visited, 'cause nps is undefined
		p.status = newPageStatus;
		if ((p.status != PAGESTATUS_NOT_ATTEMPTED) && (p.status != 'I') && (p.status != 'not attempted') && (p.status != 'incomplete')) p.pageVisited = 1; //pg2-multiSCO
		for (var i = 0; i < p.interactions.length; i++) {
			var inter = p.interactions[i];
			if (inter.status == PAGESTATUS_NOT_ATTEMPTED) inter.status = newPageStatus;
		}
	}
}
UELO.prototype.setPageScore = function(gix, score)
{
	var p = this.FindPage(gix);
	if (p) {
		if (isNaN(score)) return
		p.score = score;
	}
}
UELO.prototype.setPagePassed = function(pageGlobalIndex, passed)
{
	var p = this.FindPage(pageGlobalIndex);
	if(p){
		p.passed = passed;
	}
}
UELO.prototype.getPagePassed = function(pageGlobalIndex)
{
	var p = this.FindPage(pageGlobalIndex);
	if(p){
		return p.passed;
	}else{
		return false;
	}
}
UELO.prototype.getPageVisited = function(pageGlobalIndex)
{
	var p = this.FindPage(pageGlobalIndex);
	if(p){
		return p.pageVisited;
	}
}
UELO.prototype.setPageVisited = function(pageGlobalIndex)
{
	var p = this.FindPage(pageGlobalIndex);
	if(p){
		this.setLastVisitedPage(pageGlobalIndex);
		p.pageVisited = 1;
	}
	this.setPercentCompleted();
}
UELO.prototype.setPercentCompleted = function()
{
	var allPages=this.getPagesCount(null);
	var visitedPages=this.getPagesVisitedCount('VISITED');
	var pagesC=''+((visitedPages*100)/allPages);
	if(pagesC.indexOf('.')>0) pagesC=pagesC.substr(0,pagesC.indexOf('.')+3);
	this.percentCompleted = pagesC;	
}
UELO.prototype.getPagesCount = function(pageType)
{
	var exCnt = 0;
	var infCnt = 0;
	var fullCnt = 0;
	var visCnt = 0;
	
	for (var i = 0; i < this.pages.length; i++) {		
		if(this.pages[i].pageType==PAGETYPE_HIDDEN) continue;
		if (this.pages[i].pageType == PAGETYPE_EXERCISE) exCnt++;
		else infCnt++;
		fullCnt++;
	}
	
	if(!pageType) return fullCnt; 
	if (pageType=PAGETYPE_EXERCISE) return exCnt;
	else return infCnt;
}
UELO.prototype.getPointsMax = function()
{
	if(GLOBAL_MAX_POINTS > 0) return GLOBAL_MAX_POINTS;
	var retScore=0;
	for (var i = 0; i < this.pages.length; i++)
	{		
		var page = this.pages[i];
		if(page.pageType==PAGETYPE_HIDDEN) continue;
		if(page.pageType==PAGETYPE_EXERCISE){
			for (var j = 0; j < page.interactions.length; j++)
			{
				var inter = page.interactions[j];
				retScore += parseInt(inter.maxScore);
			}
		}
	}
	return retScore;
}
UELO.prototype.getPagesCompletedAndPassedCount = function()
{
	var visPassCnt = 0;
	var p = null;
	
	for (var i = 0; i < this.pages.length; i++) {		
		p = this.pages[i]; 
		if (p.pageType == PAGETYPE_HIDDEN) continue;
		if ((p.pageType == PAGETYPE_INFORMATION) && (p.status == 'C')){
			visPassCnt++;
		}else if ((p.pageType == PAGETYPE_EXERCISE) && (p.status == 'P')){
			visPassCnt++;
		};
	}
	return visPassCnt;
}
UELO.prototype.getPagesVisitedCount = function()
{
	var visCnt = 0;
	
	for (var i = 0; i < this.pages.length; i++) {		
		if(this.pages[i].pageType==PAGETYPE_HIDDEN) continue;
		if (this.pages[i].pageVisited == 1) visCnt++;
	}
	return visCnt;
}
UELO.prototype.getCourseScore = function()
{
	var retScore=0;
	for (var i = 0; i < this.pages.length; i++)
	{		
		var page = this.pages[i];
		if(page.pageType==PAGETYPE_HIDDEN) continue;
		if(page.pageType==PAGETYPE_EXERCISE){
			for (var j = 0; j < page.interactions.length; j++)
			{
				var inter = page.interactions[j];
				if(inter.status=="P") retScore += parseInt(inter.score);
			}
		}
	}
	return retScore;
}
UELO.prototype.getPercentCourseScore = function()
{	
	return parseInt((this.getCourseScore()*100) / this.getPointsMax());
}
UELO.prototype.getCourseStatus = function()
{
	if(this.getPagesCount()!=this.getPagesVisitedCount()) return 1;
	else return 0;
}
UELO.prototype.FindPage = function(pageGlobalIndex)
{
	for (var i = 0; i < this.pages.length; i++) {		
		if (this.pages[i].globalIndex == pageGlobalIndex) {
			return this.pages[i]
		}		
	}
	return null;
}
UELO.prototype.AddInteractionToPage = function(pageGlobalIndex, elementId)
{
	var iterPage = this.FindPage(pageGlobalIndex);
	if(iterPage == null) return null;
	return iterPage.AddInteraction(elementId);
}
UELO.prototype.findInteraction = function(pageGlobalIndex, elementId)
{
	var iterPage = this.FindPage(pageGlobalIndex);
	if(iterPage == null) return null;	
	return iterPage.FindInteraction(elementId);
}
//String parent.UELO.setDataStringByID(int PageID;String ColumnName,String value)
UELO.prototype.GetStudentAnswer = function(pageGlobalIndex, elementId)
{
	var iterPage=this.FindPage(pageGlobalIndex);
	if(iterPage==null) return null;
	var interId = iterPage.FormatInteractionId(elementId, iterPage.globalIndex);
	var iter=iterPage.FindInteraction(interId);
	if(iter==null) return null;
	return iter.studentResponse;
}
UELO.prototype.getInteractionSolveVersion = function(pageGlobalIndex, elementId)
{
	var iterPage=this.FindPage(pageGlobalIndex);
	if(iterPage==null) return null;
	var interId = iterPage.FormatInteractionId(elementId, iterPage.globalIndex);
	var iter=iterPage.FindInteraction(interId);
	if(iter==null) return null;
	return iter.solveVersion;
}
UELO.prototype.setUELOData = function()
{
	this.endTime = new Date();
	this.sessionTime = this.getActivitySessionTime();
	//this.sessionTime = this.calculateTimeToString(this.beginTime, new Date());	
}
UELO.prototype.toPollWBTSString = function()
{
    var r = "";
    r += "[UniversalElearningDataObjectHeader]\n";
    r += "Organisation=" + this.organisation + "\n";
    r += "Username=" + this.username + "\n";
    r += "Password=" + this.password + "\n";
    r += "ServerForCheckAnswers=" + this.server + "\n";
    r += "PercentCompleted=" + this.percentCompleted + "\n";
    r += "PagesCount=" + this.getPagesCount(null) + "\n";
    r += "ExercisePagesCount=" + this.getPagesCount(PAGETYPE_EXERCISE) + "\n";
    r += "PagesVisited=" + this.getPagesVisitedCount() + "\n";
    r += "PointsMax=" + this.getPointsMax() + "\n";
    r += "Points=" + this.points + "\n";
    r += "PassThreshold=" + this.passThreshold + "\n";
    r += "BeginTime=" + this.dateTimeToString(this.beginTime) + "\n";
    r += "EndTime=" + this.dateTimeToString(this.endTime) + "\n";
    r += "SessionTime=" + this.getActivitySessionTime() + "\n";
//	r += "SessionTime=" + this.calculateTimeToString(this.beginTime, this.endTime) + "\n";
    r += "KeySep=" + this.keySep + "\n";
    r += "userVars=" + this.getUserVars() + "\n";
    r += "lastVisitedPage=" + this.getLastVisitedPage() + "\n";
    r += "\n";
    r += "[UniversalElearningDataObjectDataFormat]" + "\n";
    r += "page_identifier" + this.keySep + "globalPageIndex"+ this.keySep + "group"+ this.keySep + "answers"+ this.keySep + "maxScore" + this.keySep + "score" + this.keySep + "tryNumber" + this.keySep + "maxTryNumber" + this.keySep + "status" + this.keySep + "pageType" + this.keySep + "correctResponsesAsText" + this.keySep + "studentResponseAsText" + "\n";
    r += "\n";
    r += "[UniversalElearningDataObjectData]" + "\n";
    
    for (var i = 0; i < this.pages.length; i++)
    {
        var page = this.pages[i];
        if(page.pageType==PAGETYPE_HIDDEN) continue;
        if(page.pageType==PAGETYPE_POLL){
            for (var j = 0; j < page.interactions.length; j++)
            {
                var inter = page.interactions[j];
                r += page.pageId + this.keySep + page.globalIndex + this.keySep + inter.id + this.keySep + inter.studentResponse + this.keySep + inter.maxScore + this.keySep + inter.score + this.keySep + inter.tryNumber + this.keySep + inter.maxTryNumber + this.keySep + inter.status + this.keySep + "P" + this.keySep + inter.correctResponsesAsText + this.keySep + inter.studentResponseAsText + "\n";
            }
        }
    }
    return r;
}
UELO.prototype.toWBTSString = function()
{
	var r = "";
	r += "[UniversalElearningDataObjectHeader]\n";
	r += "Organisation=" + this.organisation + "\n";
	r += "Username=" + this.username + "\n";
	r += "Password=" + this.password + "\n";
	r += "ServerForCheckAnswers=" + this.server + "\n";
	r += "PercentCompleted=" + this.percentCompleted + "\n";
	r += "PagesCount=" + this.getPagesCount(null) + "\n";
	r += "ExercisePagesCount=" + this.getPagesCount(PAGETYPE_EXERCISE) + "\n";
	r += "PagesVisited=" + this.getPagesVisitedCount() + "\n";
	r += "PointsMax=" + this.getPointsMax() + "\n";
	r += "Points=" + this.points + "\n";
	r += "PassThreshold=" + this.passThreshold + "\n";
	r += "BeginTime=" + this.dateTimeToString(this.beginTime) + "\n";
	r += "EndTime=" + this.dateTimeToString(this.endTime) + "\n";
    r += "SessionTime=" + this.getActivitySessionTime() + "\n";
//	r += "SessionTime=" + this.calculateTimeToString(this.beginTime, this.endTime) + "\n";
	r += "KeySep=" + this.keySep + "\n";
	r += "userVars=" + this.getUserVars() + "\n";
	r += "lastVisitedPage=" + this.getLastVisitedPage() + "\n";	
	r += "\n";
	r += "[UniversalElearningDataObjectDataFormat]" + "\n";
	r += "sco_identifier" + this.keySep + "page_identifier" + this.keySep + "globalPageIndex"+ this.keySep + "chapterName" + this.keySep + "group" + this.keySep + "question" + this.keySep + "answers"+ this.keySep + "maxScore" + this.keySep + "score" + this.keySep + "tryNumber" + this.keySep + "maxTryNumber" + this.keySep + "status" + this.keySep + "pageType" + this.keySep + "correctResponsesAsText" + this.keySep + "studentResponseAsText" + this.keySep + "marked" + this.keySep + "attempted" + "\n";	
	r += "\n";
	r += "[UniversalElearningDataObjectData]" + "\n";
	
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		if(page.pageType==PAGETYPE_HIDDEN) continue;
		if(page.pageType==PAGETYPE_EXERCISE){
			for (var j = 0; j < page.interactions.length; j++)
			{
				var inter = page.interactions[j];
				r += uelo.scoId + this.keySep + page.pageId + this.keySep + page.globalIndex + this.keySep + quotedString(page.chapterName) + this.keySep + inter.id + this.keySep + inter.question + this.keySep + inter.studentResponse + this.keySep + inter.maxScore  + this.keySep + inter.score + this.keySep + inter.tryNumber + this.keySep + inter.maxTryNumber + this.keySep + inter.status + this.keySep + "E" + this.keySep + inter.correctResponsesAsText + this.keySep + inter.studentResponseAsText + this.keySep + page.marked + this.keySep + page.attempted + "\n";
			}
		}else if(page.pageType==PAGETYPE_POLL){
			for (var j = 0; j < page.interactions.length; j++)
			{
				var inter = page.interactions[j];
				r += uelo.scoId + this.keySep + page.pageId + this.keySep + page.globalIndex + this.keySep + quotedString(page.chapterName) + this.keySep + inter.id + this.keySep + inter.question + this.keySep + inter.studentResponse + this.keySep + inter.maxScore  + this.keySep + inter.score + this.keySep + inter.tryNumber + this.keySep + inter.maxTryNumber + this.keySep + inter.status + this.keySep + "P" + this.keySep + inter.correctResponsesAsText + this.keySep + inter.studentResponseAsText + this.keySep + page.marked + this.keySep + page.attempted + "\n";
			}
		}else{
			//var pStatus="N";
			r += uelo.scoId + this.keySep + page.pageId + this.keySep + page.globalIndex + this.keySep + quotedString(page.chapterName) + this.keySep + this.keySep + this.keySep + this.keySep+ "1" + this.keySep + "0" + this.keySep + "0" + this.keySep + "0" + this.keySep + page.status + this.keySep + "I" + this.keySep + "" + this.keySep + "" + this.keySep + page.marked + this.keySep + page.attempted + "\n";
		}
			//page.add
	}
	r += "\n" + this.getYellowCardsToWBTSString();
	r += "\n" + this.getNotepadToWBTSString();
	r += "\n" + this.getMarkersToWBTSString();
	return r;
}
UELO.prototype.toFullString = function()
{
	var r = "";
	r += "[UniversalElearningDataObjectHeader]\n";
	r += "ScoId=" + this.scoId + "\n";
	r += "CourseName=" + this.courseName + "\n";
	r += "CourseDescription=" + this.courseDescription + "\n";
	r += "Organisation=" + this.organisation + "\n";
	r += "Username=" + this.username + "\n";
	r += "Password=" + this.password + "\n";
	r += "ServerForCheckAnswers=" + this.server + "\n";
	r += "PercentCompleted=" + this.percentCompleted + "\n";
	r += "PagesCount=" + this.getPagesCount(null) + "\n";
	r += "ExercisePagesCount=" + this.getPagesCount(PAGETYPE_EXERCISE) + "\n";
	r += "PagesVisited=" + this.getPagesVisitedCount() + "\n";
	r += "PointsMax=" + this.getPointsMax() + "\n";
	r += "Points=" + this.points + "\n";
	r += "PassThreshold=" + this.passThreshold + "\n";
	r += "BeginTime=" + this.dateTimeToString(this.beginTime) + "\n";
	r += "EndTime=" + this.dateTimeToString(this.endTime) + "\n";
    r += "SessionTime=" + this.getActivitySessionTime() + "\n";
//	r += "SessionTime=" + this.calculateTimeToString(this.beginTime, this.endTime) + "\n";
	r += "KeySep=" + this.keySep + "\n";
	r += "userVars=" + this.getUserVars() + "\n";
	r += "lastVisitedPage=" + this.getLastVisitedPage() + "\n";	
	r += "\n";
	r += "[UniversalElearningDataObjectDataFormat]" + "\n";
	r += "sco_identifier" + this.keySep + "page_identifier" + this.keySep + "globalPageIndex" + this.keySep + "group" + this.keySep + "question" + this.keySep + "answers" + this.keySep + "maxScore" + this.keySep + "score" + this.keySep + "status" + this.keySep + "pageType" + this.keySep + "correctResponsesAsText" + this.keySep + "studentResponseAsText"+ this.keySep + "marked" + this.keySep + "attempted" + "\n";
	r += "\n";
	r += "[UniversalElearningDataObjectData]" + "\n";
	
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		r += "\n";
		r += "[UniversalElearningDataObjectDataPage]" + "\n";
		r += page.pageId + this.keySep + page.scoId+ this.keySep + page.type+ this.keySep + page.pageType+ this.keySep + page.status+ this.keySep + page.title+ this.keySep + page.globalIndex+ this.keySep + page.marked+ + this.keySep + page.attempted + "\n";
		for (var j = 0; j < page.interactions.length; j++)
		{
			var inter = page.interactions[j];
			r += "    [UniversalElearningDataObjectDataPageInteraction]" + "\n";
			r += "    "+inter.id + this.keySep + inter.correctResponses + this.keySep + inter.studentResponse + this.keySep + inter.time + this.keySep + inter.type + this.keySep + inter.weighting + this.keySep + inter.status + this.keySep + inter.result + this.keySep + inter.maxScore + this.keySep + inter.score + this.keySep + inter.question + this.keySep + inter.latency + this.keySep + inter.correctResponsesAsText + this.keySep + inter.studentResponseAsText + "\n";
		}
	}
	
	return r;
};

// To jest metoda ktora tlumaczy z formatu UELO do normy HACP
// generalnie CUDA na KIJU ;) tam sie dzieja
var _CORRECT_RESPONSES = 1;
var _STUDENT_RESPONSE = 2;
var _EXAM_STUDENT_RESPONSE = 3;

UELO.prototype.formatResponseToHACPFormat = function(mode, inter)
{
	var s = "";
	if (mode == _CORRECT_RESPONSES)
	{
		s = inter.correctResponses;
	}
	else if (mode == _STUDENT_RESPONSE)
	{
		s = inter.studentResponse;
	}
	else
	{
		return null;
	}
	
	var type = inter.type.toLowerCase();
	if (typeof(s) == "string" && type == "choice")
	{
		var r = s;
		if (s.indexOf("||") > -1) var arr = s.split("||");
		else var arr = s.split(":");
		if (arr.length > 1)
		{
			var r = "{";
			for (var i = 0; i < arr.length; i++)
			{
				if (arr[i] == "1")
				{
					if (r.length > 1) r += ",";
					r += String.fromCharCode(97 + i);
				}
			}
			r += "}";
		}
		return r;
	} 
	else if (type == "numeric")
	{
		// sa takie przypadki ze komponent przedstawia sie jako "numeric"
		// a dane dostaracza takie jak "choice" - aw
		if (typeof(s) == "string")
		{
			var arr = new Array();
			if (s.indexOf("||") > -1) var arr = s.split("||");
			else if (s.indexOf(":") > -1) var arr = s.split(":");
			if (arr.length > 0)
			{
				var r = "";
				for (var i = 0; i < arr.length; i++)
				{
					if (arr[i] == "1")
					{
						return "" + i;
					}
				}
			}
			return s;
		}
		return s.toString();
	}
	else if (type == "fill-in")
	{
		s = s.replace(/\|\|/gi, "; ");
		return s;
	}
	else if (type == "matching")
	{
		var calc = new UELODDCalculator();
		var res = "";
		if (mode == _CORRECT_RESPONSES)
		{
			res = calc.transformToPermutation(inter.correctResponses, inter.correctResponses, inter.all_possible);
		}
		else if (mode == _STUDENT_RESPONSE)
		{
			res = calc.transform(inter.correctResponses, inter.studentResponse, inter.all_possible);
		}
		return res;
	}
	return s;
};

UELO.prototype.toHACPInteractionsString = function(course_id, student_id, lesson_id)
{
	var r = "";
	var d = new Date();
	r += '"course_id","student_id","lesson_id","date","time","interaction_id","objective_id","type_interaction","correct_response","student_response","result","weighting","latency"\n';
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		for (var j = 0; j < page.interactions.length; j++)
		{
			var inter = page.interactions[j];
			r += '"' + course_id + '"'; //course_id
			r += ',"'+ student_id +'"'; //student_id
			r += ',"0"'; //lesson_id
			r += ',"'+this.dateToString(d, "/")+'"'; // date
			r += ',"'+this.timeToString(d)+'"'; // time
			r += ',"p_' + i + '_e_' + j + '"'; // interaction_id  -> r += ',"'+inter.id+'"'; // interaction_id
			r += ',""'; // objective_id
			r += ',"'+inter.type+'"'; // type_interaction
			r += ',"'+this.formatResponseToHACPFormat(_CORRECT_RESPONSES, inter)+'"'; // correct_response
			r += ',"'+this.formatResponseToHACPFormat(_STUDENT_RESPONSE, inter)+'"'; // student_response
			r += ',"'+((inter.result == true)?"c":"w")+'"'; // result
			r += ',"1.0"'; // weighting
			r += ',"'+((inter.latency == null)?"00:00:00":inter.latency)+'"'; // latency
			r += '\n';
		}
	}
	return r;
}

UELO.prototype.formatResponseToSCORM12Format = function(mode, inter)
{
	var s = "";
	if (mode == _CORRECT_RESPONSES)
	{
		s = inter.correctResponses;
	}
	else if (mode == _STUDENT_RESPONSE)
	{
		s = inter.studentResponse;
	}
	else
	{
		return null;
	}
	
	var type = inter.type.toLowerCase();
	
	if (typeof(s) == "string" && type == "choice")
	{
		var isGroup = false;
		if (s.indexOf("||") > -1) var arr = s.split("||");
		else if (s.indexOf(":") > -1) {
			isGroup = true;
			var arr = s.split(":");
		} else return s;
		//zakres do 18, w przeciwnym wypadku uzyc performance
		var r = "";
		if (arr.length > 18) {
			this.changelistner = "type,performance";
			for (var i = 0; i < arr.length; i++) {
				r += arr[i];
			}
		} else {
			for (var i = 0; i < arr.length; i++) {
				if (r != "") r += ",";
				//r += i + "_" + arr[i];
				if (arr[i] == 0) r += getIdentiefier09az(i);
				else r += getIdentiefier09az(i + 18);
			}
			r = ((isGroup && r.indexOf(",") > -1) ? "{" + r + "}" : r);
		}
		return r;
	}else if (type == "numeric"){
		// sa takie przypadki ze komponent przedstawia sie jako "numeric"
		// a dane dostaracza takie jak "choice" - aw
		if (inter.id.indexOf("DDBasket") > -1) {
			if (mode == _CORRECT_RESPONSES) {
				return "1";
			} else {
				return (inter.result) ? "1" : "0";
			}
		}
		
		var res = s;
		if (typeof(s) == "string") {
			var arr = new Array();
			if (s.indexOf("||") > -1) var arr = s.split("||");
			else if (s.indexOf(":") > -1) var arr = s.split(":");
			if (arr.length > 0) {
				var r = "";
				for (var i = 0; i < arr.length; i++) {
					if (arr[i] == "1") {
						res = "" + i;
						break;
					}
				}
			}
		}
		return res;
	}
	else if (type == "fill-in")
	{
		s = s.replace(/\|\|/gi, ",");
		return s;
	}
	else if (type == "matching")
	{
		if (inter.id.indexOf("DDBasket") > -1) {
			var calc = new UELODDCalculator();
			var res = "";
			var icr = inter.correctResponses.replace(/,/gi, ":");
			if (icr.indexOf(":") == -1) icr = icr.replace(/\|/gi, ":");
			var isr = inter.studentResponse.replace(/,/gi, ":");
			if (mode == _CORRECT_RESPONSES)
			{
				res = calc.transformToPermutation(icr, icr, inter.all_possible);
			}
			else if (mode == _STUDENT_RESPONSE)
			{
				res = calc.transform(icr, isr, inter.all_possible);
			}
			return res;
		} else {
			if (typeof(s) == "string") {
				var isGroup = false;
				if (s.indexOf("||") > -1) var arr = s.split("||");
				else {
					isGroup = true;
					var arr = s.split(":");
				}
				var r = "";
				for (var i = 0; i < arr.length; i++) {
					if (r != "") r += ",";
					//r += inter.elementId + "." + arr[i];
					r += getIdentiefier09az(inter.gix) + "." + getIdentiefier09az(arr[i]);
				}
				if (r == "") {
					//r = inter.elementId + "." + s;
					r += getIdentiefier09az(inter.gix) + "." + getIdentiefier09az(s);
				}
				r = ((isGroup && r.indexOf(",") > -1) ? "{" + r + "}" : r);
				return r;
			} else if (typeof(s) == "number") {
				//return inter.elementId + "." + s;
				return getIdentiefier09az(inter.gix) + "." + getIdentiefier09az(s);
			}
		}
	}
	return s;
};

UELO.prototype.getSCORM12Interactions = function()
{
	var result = {};
	var counter = 0;
	
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		for (var j = 0; j < page.interactions.length; j++)
		{
			var inter = page.interactions[j];
			
			if (inter.latency == null || inter.latency == ""
				|| inter.timestamp == null || inter.timestamp == "") continue;
			
			var interId = "p_" + page.globalIndex + "_e_" + j;
			
			result[interId] = {};
			result[interId]["id"] = interId;
			result[interId]["number"] = counter;
			result[interId]["time"] = formatTime("time", inter.timestamp);
			result[interId]["type"] = inter.type;
			result[interId]["question"] = inter.question;
			result[interId]["elementId"] = inter.elementId;
			result[interId]["pageGlobalIndex"] = page.globalIndex;
			
			var latencyArr = ((inter.latency) ? inter.latency : "00:00:00").split(":");
			var date = formatTime("time", new Date(this.beginTime.getFullYear(), this.beginTime.getMonth(),
				this.beginTime.getDate(), latencyArr[0], latencyArr[1], latencyArr[2]));
			
			result[interId]["latency"] = date;
			result[interId]["result"] = (inter.correctResponses == "") ? "neutral" : ((inter.result == true) ? "correct" : "wrong");
			result[interId]["weighting"] = (inter.weighting && inter.weighting != "") ? inter.weighting : "1.0"; //inter.weighting
			
			this.changelistner = "";
			
			result[interId]["student_response"] = this.formatResponseToSCORM12Format(_STUDENT_RESPONSE, inter);
			result[interId]["correct_responses"] = new Array();
			result[interId]["correct_responses"][0] = this.formatResponseToSCORM12Format(_CORRECT_RESPONSES, inter);
			
			if (this.changelistner != "") {
				var arr = this.changelistner.split(",");
				if (arr[0] == "type") {
					result[interId]["type"] = arr[1];
				}
			}
			counter++;
		}
	}
	
	return result;
};

UELO.prototype.getPollInteractions = function()
{
	var result = {};
	var counter = 0;
	
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		for (var j = 0; j < page.interactions.length; j++)
		{
			var inter = page.interactions[j];
			
			if (inter.latency == null || inter.latency == ""
				|| inter.timestamp == null || inter.timestamp == "") continue;
			
			var interId = "p_" + page.globalIndex + "_e_" + j;
			
			result[interId] = {};
			result[interId]["id"] = interId;
			result[interId]["number"] = counter;
			result[interId]["time"] = formatTime("time", inter.timestamp);
			result[interId]["type"] = inter.type;
			result[interId]["question"] = inter.question;
			result[interId]["elementId"] = inter.elementId;
			result[interId]["pageGlobalIndex"] = page.globalIndex;
			
			var latencyArr = ((inter.latency) ? inter.latency : "00:00:00").split(":");
			var date = formatTime("time", new Date(this.beginTime.getFullYear(), this.beginTime.getMonth(),
				this.beginTime.getDate(), latencyArr[0], latencyArr[1], latencyArr[2]));
			
			result[interId]["latency"] = date;
			result[interId]["result"] = (inter.correctResponses == "") ? "neutral" : ((inter.result == true) ? "correct" : "wrong");
			result[interId]["weighting"] = (inter.weighting && inter.weighting != "") ? inter.weighting : "1.0"; //inter.weighting
			
			this.changelistner = "";
			
			result[interId]["student_response"] = inter.studentResponseAsText.toString().replace(/\|\|/g, ",");
			
			if (this.changelistner != "") {
				var arr = this.changelistner.split(",");
				if (arr[0] == "type") {
					result[interId]["type"] = arr[1];
				}
			}
			counter++;
		}
	}
	
	return result;
};

UELO.prototype.interactionsCount = function()
{
	var result = 0;
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		for (var j = 0; j < page.interactions.length; j++)
		{
			var inter = page.interactions[j];
			
			if (inter.latency == null || inter.latency == ""
				|| inter.timestamp == null || inter.timestamp == "") continue;
			
			result++;
		}
	}
	return result;
};

UELO.prototype.interactionsExists = function()
{
	var result = false;
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		if (page.interactions.length > 0) {
			result = true;
			break;
		}
	}
	return result;
};

UELO.prototype.formatResponseToSCORM13Format = function(mode, inter)
{
//jezeli exam to wysylamy core i stud po numeric
//zablokowac w exam struct
	var s = "";
	if (mode == _CORRECT_RESPONSES) {
		s = inter.correctResponsesAsText;
	} else
	if (mode == _STUDENT_RESPONSE) {
		s = inter.studentResponseAsText;
	} else
	if (mode == _EXAM_STUDENT_RESPONSE) {
		return inter.studentResponse;
	} else {
		return null;
	}
	s = s.toString().replace(/%20/gi, "_");
	//s = unescape(s); //pg2-removed, look below
	var type = inter.type.toLowerCase();
	if (type != "choice" && type != "fill-in") { //pg2
		s = unescape(s);
	}
	if (type == "choice") {
		var sTmp = s.replace(new RegExp(' ', "g"), '[,]'); //pg2-some components returns separated with spaces ' ' -then take it as first way, otherwise, start
		if (sTmp.indexOf('[,]') > -1) {
			sTmp = unescape(sTmp); //*
			sTmp = sTmp.replace(new RegExp(':', "g"), '-'); //pg2- ":" is not allowed
			return sTmp;
		} else
		if (s.indexOf("||") > -1) {
			var arr = s.split("||");
		} else
		if (s.indexOf(":") > -1) {
			var arr = s.split(":");
		} else
		if (s.indexOf("|") > -1) {
			var arr = s.split("|");
		} 
		else {
			//s = s.replace(new RegExp(' ', "g"), '[,]'); //pg2-instead of spaces, should be "[,]" -line required 'cause the block below will be skipped //pg2-removed- now it begins this block
			s = unescape(s);
			s = s.replace(new RegExp(':', "g"), '-');
			return s;
		}
		var r = "";
		for (var i = 0; i < arr.length; i++) {
			if (r != "") r += "[,]";
			r += unescape(arr[i]).replace(new RegExp(':', "g"), '-'); //pg2-instead of 'arr[i]'
		}
		return r;
	} else
	if (type == "fill-in") {
		s = s.replace(new RegExp('%3A', 'g'), '-'); //pg2-first we must replace escaped ":" with "-", 'cause in this string there are additional (not encoded) ":" as separators
		s = unescape(s);
		if (s.indexOf("||") > -1) {
			s = s.replace(/\|\|/gi, "[,]");
		} else
		if (s.indexOf(":") > -1) {
			s = s.replace(/:/gi, "[,]");
		} else
		if (s.indexOf("|") > -1) {
			s = s.replace(/\|/gi, "[,]");
		}
		return s;
	} else
	if (type == "matching") {
		if (s.indexOf("||") > -1) var arr = s.split("||");
		else if (s.indexOf(":") > -1) var arr = s.split(":");
		else var arr = new Array(s);
		var r = "";
		for (var k in arr) {
			if (r != "") r += "[,]";
			if (arr[k] != "") { //pg2-if user's answer was empty...
				r += inter.elementId + "[.]" + arr[k];
			}
		}
		return r;
	}
	return s;
};

UELO.prototype.getWBTExamInteractions = function()
{
	var result = {};
	var counter = 0;
	
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		for (var j = 0; j < page.interactions.length; j++)
		{
			var inter = page.interactions[j];
			
			if (inter.latency == null || inter.latency == ""
				|| inter.timestamp == null || inter.timestamp == "") continue;
			
			var interId = "p_" + page.globalIndex + "_e_" + j;
			var learnerResponse = this.formatResponseToSCORM13Format(_EXAM_STUDENT_RESPONSE, inter);
			
			result[interId] = {};
			result[interId]["id"] = interId;
			result[interId]["number"] = counter;
			result[interId]["timestamp"] = formatTime("timestamp", inter.timestamp);
			result[interId]["type"] = inter.type;
			result[interId]["description"] = inter.question;
			
			var latencyArr = ((inter.latency) ? inter.latency : "00:00:00").split(":");
			var date = formatTime("timeinterval", new Date(this.beginTime.getFullYear(), this.beginTime.getMonth(),
				this.beginTime.getDate(), latencyArr[0], latencyArr[1], latencyArr[2]));
			result[interId]["latency"] = date;
			result[interId]["learner_response"] = learnerResponse;
			
			counter++;
		}
	}
	
	return result;
};

UELO.prototype.getSCORM13Interactions = function()
{
	var result = {};
	var counter = 0;
	
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		for (var j = 0; j < page.interactions.length; j++)
		{
			var inter = page.interactions[j];
			
			if (inter.latency == null || inter.latency == ""
				|| inter.timestamp == null || inter.timestamp == "") continue;
			
			var interId = "p_" + page.globalIndex + "_e_" + j;
			var learnerResponse = this.formatResponseToSCORM13Format(_STUDENT_RESPONSE, inter);
			var correctResponses = this.formatResponseToSCORM13Format(_CORRECT_RESPONSES, inter);
			
			result[interId] = {};
			result[interId]["id"] = interId;
			result[interId]["number"] = counter;
			result[interId]["timestamp"] = formatTime("timestamp", inter.timestamp);
			result[interId]["type"] = inter.type;
			result[interId]["description"] = inter.question;
			
			var latencyArr = ((inter.latency) ? inter.latency : "00:00:00").split(":");
			var date = formatTime("timeinterval", new Date(this.beginTime.getFullYear(), this.beginTime.getMonth(),
				this.beginTime.getDate(), latencyArr[0], latencyArr[1], latencyArr[2]));
			
			result[interId]["latency"] = date;
			result[interId]["result"] = (inter.result == true) ? "correct" : "incorrect";;
			result[interId]["weighting"] = (inter.weighting && inter.weighting != "") ? inter.weighting : "1.0"; //inter.weighting
			result[interId]["learner_response"] = learnerResponse;
			
			result[interId]["correct_responses"] = new Array();
			result[interId]["correct_responses"][0] = correctResponses;
			counter++;
		}
	}
	
	return result;
};

UELO.prototype.resetInteractions = function() {
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		for (var j = 0; j < page.interactions.length; j++)
		{
			var inter = page.interactions[j];
			inter.latency = null;
			inter.timestamp = null;
		}
	}	
}

UELO.prototype.getInteractions = function(platform)
{
	switch (platform) {
		case "SCORM12": 
			return this.getSCORM12Interactions();
			break;
		case "SCORM13": 
			return this.getSCORM13Interactions();
			break;
		case "WBTEXAM": 
			return this.getWBTExamInteractions();
			break;
		case "POLL": 
			return this.getPollInteractions();
			break;
	}
}

UELO.prototype.getActivitySessionTime = function()
{
	//tools.js
	return calculateTimeIntToString(player.activityTime);
}

UELO.prototype.calculateTimeToString = function(dateStart, dateEnd)
{
	//tools.js
	return calculateTimeToString(dateStart, dateEnd);
};

UELO.prototype.timeToString = function(date)
{
	//tools.js
	return formatTime("time", date);
};

UELO.prototype.dateToString = function(date, separator)
{
	//tools.js
	return formatTime("date", date, separator);
};

UELO.prototype.dateTimeToString = function(date)
{
	//tools.js
	return formatTime("datetime", date, "-");
};

UELO.prototype.stringToDate = function(s)
{
	//tools.js
	return stringToDate(s);
};

UELO.prototype.toString = function()
{
	return "";//this.toFullString();
};

UELO.prototype.__parseFindGroup = function(a, name)
{
	var key = new RegExp("^\\[" + name + "\\]$", "i");
	for (var i = 0; i < a.length; i++)
	{
		if (a[i].match(key)) 
		{
			return i;
		}
	}
	return null;
};

UELO.prototype.loadFromString = function(s)
{
	s = s.replace(new RegExp("\r", "g"), "");
	var lines = s.split("\n");
	//header
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectHeader");
	if (index == null) 
	{
		return;
	}
	
	var i = index;
	while (i++ < lines.length - 1)
	{
		var p = lines[i].indexOf("=");
		if (p > 0)
		{
			var key = lines[i].slice(0, p);
			var value = lines[i].slice(p + 1);
			this.setHeaderString(key, value);
		} else {
			break;
		}
	}
	
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectDataFormat");
	if (index == null) 
	{
		return;
	}
	
	var keyMatrix = lines[index + 1].split(this.keySep);
	var gpi = -1; // globalPageIndex
	var eii = -1;  // elementIdIndex
	var dataPageType = -1; // pageType
	var dataPageId = -1; // pageId
	for (var j = 0; j < keyMatrix.length; j++)
	{
		if (keyMatrix[j].match(new RegExp("^globalPageIndex$", "gi")))
		{
			gpi = j;
		}
		if (keyMatrix[j].match(new RegExp("^group$", "gi")))
		{
			eii = j;
		}
		if (keyMatrix[j].match(new RegExp("^pageType$", "gi")))
		{
			dataPageType = j;
		}
		if (keyMatrix[j].match(new RegExp("^page_identifier$", "gi")))
		{
			dataPageId = j;
		}
	}
	if (gpi == -1 || eii == -1)
	{
		return;
	}
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectData");
	if (index == null) 
	{
		return;
	}
	var i = index;	
	while (i++ < lines.length - 1)
	{
		var data = lines[i].split(this.keySep);
		if (data.length == keyMatrix.length)
		{
			var o = this.findInteraction(data[gpi], data[eii]);
			var ueloPage = this.FindPage(data[gpi]);
			if(!o){ 
				//var ueloPage = this.FindPage(data[gpi]);				
				if (!ueloPage) { 
					ueloPage= this.AddPage();
					ueloPage.type = 0;
					if(data[dataPageType].indexOf('E')>=0){
						ueloPage.pageType = PAGETYPE_EXERCISE;
					}else if(data[dataPageType].indexOf('P')>=0){
						ueloPage.pageType = PAGETYPE_POLL;
					}else{
						ueloPage.pageType = PAGETYPE_INFORMATION;
					}
					ueloPage.pageId = data[dataPageId];
					ueloPage.globalIndex = data[gpi];	
					if((ueloPage.pageType == PAGETYPE_EXERCISE) || (ueloPage.pageType == PAGETYPE_POLL)){
						o = ueloPage.interactions[ueloPage.interactions.length] = new UELOInteractions();
					} else {
						//
					}
				}
				if(ueloPage){
					//o = ueloPage.interactions[ueloPage.interactions.length] = new UELOInteractions();
				}
			} else {
				//alert('Wrong data!!!: '+data);
			}
			
			if (ueloPage) {
				for (var j = 0; j < keyMatrix.length; j++){
					if (j != gpi && j != eii && j != dataPageType){
						ueloPage.setValue(keyMatrix[j], data[j]);
					}
				}			
			}
			
			if (o){
				for (var j = 0; j < keyMatrix.length; j++){
					if (j != gpi){
						o.setValue(keyMatrix[j], data[j]);
					}
				}
			}
		}
	}
	this.loadYellowCardsFromString(s);
	this.loadNotepadFromString(s);
	this.loadMarkersToWBTSString(s);
}

UELO.prototype.getChapters = function(){
	var chapters = new Array();
	var chapterPageName = "";
	for (var i = 0; i < this.pages.length; i++) {
		var p = this.pages[i];
		if (chapterPageName != p.chapterName){
			if (this.courseName != p.chapterName){
					chapters[chapters.length] = p.chapterName;
			}
			chapterPageName = p.chapterName;
		}
	}
	return chapters;
}

UELO.prototype.getPagesInChapter = function(chName){
	var chapterPages = new Array();
	for (var i = 0; i < this.pages.length; i++) {
		var p = this.pages[i];
		if (p.chapterName == chName){
			if (this.courseName != p.chapterName){
					chapterPages[chapterPages.length] = p.globalIndex;
			}
		}
	}
	return chapterPages;
}

UELO.prototype.getUserVars = function(){
	return this.userVars;
}

UELO.prototype.setUserVars = function(uVars){
	this.userVars = uVars;
}

UELO.prototype.clearInteractions = function()
{
	this.username = "";
	this.password = "";
	this.organisation = "";
	this.server = "";
	this.percentCompleted = "";
	this.pagesVisited = 0;
	this.points = 0;
	this.beginTime = new Date();
	this.endTime = new Date();
	this.sessionTime = 0;
	this.userVars = "";
	this.lastVisitedPage = 0;
	
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		page.status = PAGESTATUS_NOT_ATTEMPTED;
		page.pageVisited = 0;
		page.userAnswer = "";
		for (var j = 0; j < page.interactions.length; j++)
		{
			var inter = page.interactions[j];
			inter.studentResponse = "";
			inter.studentResponseAsText = "";
			inter.time = "";
			inter.timestamp = null;
			inter.status = PAGESTATUS_NOT_ATTEMPTED;
			inter.result = "";
			inter.score = 0;
			inter.latency = null;
			inter.tryNumber=0;
		}
	}
};

UELO.prototype.getDate = function()
{
	return new Date();
};

UELO.prototype.getYellowCardsToWBTSString = function()
{
	var r = "";
	r += "[UniversalElearningDataObjectYellowCardsHeader]\n";
	r += "[UniversalElearningDataObjectYellowCardsDataFormat]\n";
	r += "globalPageIndex" + this.keySep + "cardId"+ this.keySep + "date" + this.keySep + "cardType" + this.keySep + "left" + this.keySep + "top" + this.keySep + "author" + this.keySep + "title" + this.keySep + "note" + this.keySep + "isMaximalize" + this.keySep + "personGraphic" + this.keySep + "clockGraphic" + this.keySep + "buttonAdd" + this.keySep + "showUserName" +this.keySep + "pageName" +this.keySep + "pageGI" + 	"\n";
	r += "[UniversalElearningDataObjectYellowCardsData]\n";
	var yellowCardAppear = false;
	
	for (var i = 0; i < this.pages.length; i++)
	{
		var page = this.pages[i];
		if (page.yellowCards.length>0) {
			yellowCardAppear = true;
			for (var j = 0; j < page.yellowCards.length; j++) {
				var yellowCard = page.yellowCards[j];
				if (yellowCard && yellowCard.id.indexOf('__yc__') > -1) {				
					r += page.globalIndex + this.keySep;
					r += yellowCard.id + this.keySep;
					r += yellowCard.date + this.keySep;
					r += yellowCard.cardType + this.keySep;
					r += yellowCard.left + this.keySep;
					r += yellowCard.top + this.keySep;				
					r += yellowCard.author + this.keySep;
					r += yellowCard.title + this.keySep;
					r += yellowCard.note + this.keySep;					
					r += yellowCard.isMaximalize + this.keySep;
					r += yellowCard.personGraphic + this.keySep;
					r += yellowCard.clockGraphic + this.keySep;
					r += yellowCard.buttonAdd + this.keySep;
					r += yellowCard.showUserName + this.keySep;
					r += yellowCard.pageName + this.keySep;
					r += yellowCard.pageGI;			
					r += "\n";
				};
			};
		};
	};
	if (yellowCardAppear)
	{
		return r;
	}else
	{	
		return "";
	}
};

UELO.prototype.loadYellowCardsFromString = function(s)
{
	//s = s.replace(new RegExp("\r", "g"), "");
	var lines = s.split("\n");
	//header
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectYellowCardsHeader");
	if (index == null) 
	{
		return;
	}
	//add a header functionality here if needed
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectYellowCardsDataFormat");
	if (index == null) 
	{
		return;
	}
	//add a data format functionality here if needed	
	var keyMatrix = lines[index + 1].split(this.keySep);
	var gpi = -1; // globalPageIndex
	var eii = -1;  // elementIdIndex
	for (var j = 0; j < keyMatrix.length; j++)
	{
		if (keyMatrix[j].match(new RegExp("^globalPageIndex$", "gi")))
		{
			gpi = j;
		}
		if (keyMatrix[j].match(new RegExp("^cardId$", "gi")))
		{
			eii = j;
		}		
	}
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectYellowCardsData");
	if (index == null) 
	{
		return;
	}
	var i = index;	
	while (i++ < lines.length - 1)
	{
		var data = lines[i].split(this.keySep);
		if (data.length == keyMatrix.length)
		{
			var ueloPage = this.FindPage(data[gpi]);
			if (ueloPage){
				var yellowCard = ueloPage.yellowCards[ueloPage.yellowCards.length] = new UELOYellowCard();
				for (var j = 0; j < keyMatrix.length; j++){
					yellowCard.setValue(keyMatrix[j], data[j]);
				}
			}
		}
	}
};

UELO.prototype.getMarkersToWBTSString = function(s)
{
	var r = "";
	r += "[UniversalElearningDataObjectMarkersHeader]\n";
	r += "[UniversalElearningDataObjectMarkersDataFormat]\n";
	r += "globalPageIndex" + this.keySep + "values\n";
	r += "[UniversalElearningDataObjectMarkersData]\n";
	var markersAppear = false;
	
	for (var i=0; i<this.pages.length; i++)
	{
		var page = this.pages[i];
		if (page.userMarkers != "") {
			markersAppear = true;
			r += page.globalIndex + this.keySep;
			r += page.userMarkers;
			r += "\n";
		};
	};
	if (markersAppear)
	{
		return r;
	}else{
		return "";
	}
};

UELO.prototype.loadMarkersToWBTSString = function(s)
{
	var lines = s.split("\n");
	//header
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectMarkersHeader");
	if (index == null) 
	{
		return;
	}
	//add a header functionality here if needed
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectMarkersDataFormat");
	if (index == null) 
	{
		return;
	}
	//add a data format functionality here if needed	
	var keyMatrix = lines[index + 1].split(this.keySep);
	var gpi = -1; // globalPageIndex
	var eii = -1;  // elementIdIndex
	for (var j = 0; j < keyMatrix.length; j++)
	{
		if (keyMatrix[j].match(new RegExp("^globalPageIndex$", "gi")))
		{
			gpi = j;
		}
		if (keyMatrix[j].match(new RegExp("^values$", "gi")))
		{
			eii = j;
		}		
	}
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectMarkersData");
	if (index == null) 
	{
		return;
	}
	var i = index;	
	while (i++ < lines.length - 1)
	{
		var data = lines[i].split(this.keySep);
		if (data.length == keyMatrix.length)
		{
			var page = this.FindPage(data[gpi]);
			if (page) {
				page.userMarkers = data[eii];
			}
		}
	}
};

UELONotepad = function()
{
	this.id = "";
	this.note = "";
};

UELO.prototype.fillNotepad = function(params)
{
	if (typeof(params) != "undefined" && params != "") {
		var paramsArr = params.split(",");
		
		for (var i=0; i<paramsArr.length; i++) {
			if (paramsArr[i] != "") {
				var itemAttr = paramsArr[i].split(";");				
				this.AddNotepad("__np__" + i, unescape(itemAttr[1]));
			}
		}
	}
};

UELO.prototype.addNotepad = function(id, note)
{
	var npd = this.findNotepad(id);
	if (npd == null && id != "") {
		npd = this.notepad[this.notepad.length] = new UELONotepad();
		npd.id = id;
		npd.note = escape(note);
	};
	return npd;
};

UELO.prototype.updateNotepad = function(id,note)
{
	var npd = this.findNotepad(id);
	if (npd) {
		npd.note = escape(note);
		return true;
	};
	return false;
};

UELO.prototype.deleteNotepad = function(id)
{	
	for (var i = 0; i < this.notepad.length; i++) {
		var npd = this.notepad[i];
		if (npd && npd.id == id) {
			this.notepad[i] = null;
			return true;
		};
	};
	return false;
};

UELO.prototype.findNotepad = function(id)
{	
	for (var i = 0; i < this.notepad.length; i++) {
		var npd = this.notepad[i];
		if (npd && npd.id == id) {
			return npd;
		};
	};
	return null;
};

UELO.prototype.getNotepadToWBTSString = function()
{
	var r = "";
	r += "[UniversalElearningDataObjectNotepadHeader]\n";
	r += "[UniversalElearningDataObjectNotepadDataFormat]\n";
	r += "notepadId"+ this.keySep + "note" + "\n";
	r += "[UniversalElearningDataObjectNotepadData]\n";
	var noteAppear = false;
	
	if (this.notepad.length>0) {
		noteAppear = true;
		for (var j = 0; j < this.notepad.length; j++) {
			var npd = this.notepad[j];			
			r += npd.id + this.keySep;
			r += npd.note;
			r += "\n";
		}
	}
	if (noteAppear)
	{
		return r;
	}else{
		return "";
	}
};

UELO.prototype.loadNotepadFromString = function(s)
{
	//s = s.replace(new RegExp("\r", "g"), "");
	var lines = s.split("\n");
	//header
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectNotepadHeader");
	if (index == null) 
	{
		return;
	}
	//add a header functionality here if needed
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectNotepadDataFormat");
	if (index == null) 
	{
		return;
	}
	//add a data format functionality here if needed	
	var keyMatrix = lines[index + 1].split(this.keySep);
	var gpi = -1; // globalPageIndex
	var eii = -1;  // elementIdIndex
	for (var j = 0; j < keyMatrix.length; j++)
	{
		if (keyMatrix[j].match(new RegExp("^globalPageIndex$", "gi")))
		{
			gpi = j;
		}
		if (keyMatrix[j].match(new RegExp("^notepadId$", "gi")))
		{
			eii = j;
		}		
	}
	var index = this.__parseFindGroup(lines, "UniversalElearningDataObjectNotepadData");
	if (index == null) 
	{
		return;
	}
	var i = index;	
	while (i++ < lines.length - 1)
	{
		var data = lines[i].split(this.keySep);
		if (data.length == keyMatrix.length)
		{
			var npd = this.notepad[this.notepad.length] = new UELONotepad();
			for (var j = 0; j < keyMatrix.length; j++){
				npd.setValue(keyMatrix[j], data[j]);
			}
		}
	}
}

UELONotepad.prototype.setValue = function(name, value)
{
	// wyjatki do poprawienie i ujednolicenia
	if (name == "notepadId") name = "id";
	if (typeof(this[name]) == "undefined") return;
	if (typeof(this[name]) == "number" || typeof(this[name]) == "string" || typeof(this[name]) == "boolean") {		
		this[name] = value;
	}
};

UELO.prototype.getSendDataTimeInterval = function()
{	
	if (typeof(top.serverSendDataInterval) != 'undefined'){
			this.sendDataInterval = top.serverSendDataInterval;
	}	
	var date = new Date();
	var time = date.getTime();
	this.sendResultsToServerTime = time + (this.sendDataInterval*60*1000);
};

UELO.prototype.postponeSendSubDataToServer = function()
{
	if (typeof(SendDataToServer) != "undefined") {
		if (this.timerPostponeSender != null) window.clearTimeout(this.timerPostponeSender);
		this.timerPostponeSender = window.setTimeout('uelo.timerPostponeSender = null; SendDataToServer();', 1);	
	}
}

UELO.prototype.sendSubDataToServer = function()
{
	this.UpdateTimerDataSender();
	if (!config.sendDataToServerOnEachPage) {
		//AW:Nie wiem po co to, jak bt co pytac MK
		if(this.sendDataInterval < 1) return;
	}
	var date = new Date();
	var time = date.getTime();	
	if(config.sendDataToServerOnEachPage || time>this.sendResultsToServerTime){
		this.postponeSendSubDataToServer();
		this.sendResultsToServerTime = time + (this.sendDataInterval*60*1000);
	};
};

UELO.prototype.sendInteractions = function()
{
	var interactions = this.getInteractions("SCORM12");
	for (var k in interactions) {
		var item = interactions[k];
		
		lms.LMSSetValue("cmi.interactions." + item["number"] + ".id", item["id"]);
		lms.LMSSetValue("cmi.interactions." + item["number"] + ".time", item["time"]);
		lms.LMSSetValue("cmi.interactions." + item["number"] + ".type", item["type"]);
		lms.LMSSetValue("cmi.interactions." + item["number"] + ".latency", item["latency"]);
		lms.LMSSetValue("cmi.interactions." + item["number"] + ".result", item["result"]);
		lms.LMSSetValue("cmi.interactions." + item["number"] + ".weighting", item["weighting"]);
		lms.LMSSetValue("cmi.interactions." + item["number"] + ".student_response", item["student_response"]);
		lms.LMSSetValue("wbts.interactions." + item["number"] + ".question", item["question"]);
		
		var correctResponses = item["correct_responses"];
		for (var j = 0; j < correctResponses.length; j++) {
			lms.LMSSetValue("cmi.interactions." + item["number"] + ".correct_responses."
				+ j + ".pattern", correctResponses[j]);
		}
	}
};

UELO.prototype.resetInteractionsforPage = function(pageGlobalIndex)
{
	var p = this.FindPage(pageGlobalIndex);
	if (p) {
		p.resetPageInteractions();
	}
}

UELO.prototype.setScoringList = function(t) //pg2-qr -reorganized
{
	for (var i in this.pages) {
		var p = this.pages[i];
		var s = t.substr(i * 2, 2);
		if (s == "MA") p.score = 100; else
		if (parseInt(s) != NaN) p.score = parseInt(s);
		else p.score = 0;
	}
	return s;
}

UELO.prototype.getScoringList = function() //pg2-qr -reorganized
{
	var s = "";
	for (var i in this.pages) {
		var p = this.pages[i];
		if (isNaN(p.score)) s += "00"; else
		if (p.score >= 0 && p.score <= 99) s += pad(p.score.toString(), 2); else
		if (p.score >= 100) s += "MA";
		else { s += "00"}
	}
	return s;
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
UELO.prototype.getPreviousMixedStructure = function() //pg2-qr_new
{
	if (typeof(struct) == 'undefined' || typeof(player) == 'undefined') return '';
	
	var res = "";
	//pg2-qr -previous course pages list visibility
	var examWasSolved = player.checkExamWasSolved(); //check if user has at least visited any page from drawed pool
	var reallyMixed = this.wasReallyMixed();
	if ((struct.isCourseMixed && examWasSolved && reallyMixed) ||
	    (struct.isCourseMixed && !examWasSolved && this.previousMixedStructure == '' && reallyMixed)) 
	{
		try {
			for (var i in this.pages) {
				var p = this.pages[i];
				var positive = (p.visible && p.iss);
				res += (positive?'1':'0') + p.status; //pg2-added status
			}
			res = '|MIX:' + res;
		} catch(e) {
			res = '';
		};
	} else
	if (this.previousMixedStructure != '') res = '|MIX:' + this.previousMixedStructure;
	else res = '';
	
	return res;
}

UELO.prototype.resetAllPagesInPool = function(loadedPageGIX) //pg2-qr -new, perform this at first visit on page within a pool, if during current session none of these was visited
{
	for (var i in this.pages) {
		var p = this.pages[i];
		if (!p) continue; //pg2-qr_current
		if ((p.visible && p.iss) && (p.isQuizPageToReset || p.blockRestorePage)) {
			if (p.pageType == PAGETYPE_EXERCISE) p.resetPageInteractions(); else p.status = PAGESTATUS_NOT_ATTEMPTED;
		}
	}
	this.setPageStatus(loadedPageGIX, PAGESTATUS_INCOMPLETE);
}

UELO.prototype.setPreviousMixedStructure = function(t) //pg2-qr -new
{
	//pg2-qr -TODO
	this.previousMixedStructure = t;
	//if (struct.isCourseMixed == false) return;
	if (this.previousMixedStructure != '') struct.isCourseMixed = true;
	
	var res = '';
	if (this.previousMixedStructure == '') {
		try {
			for (var i in this.pages) {
				var p = this.pages[i];
				var positive = (p.visible && p.iss);
				res += (positive?'1':'0') + p.status; //pg2-added status
			}
			//res = '|MIX:' + res;
		} catch(e) {
			res = '';
		};
		this.previousMixedStructure = res;
	}
	if (this.previousMixedStructure == '') return;
	
	for (var i in this.pages) {
		var p = this.pages[i];
		if (p) { //0N,1F,1P
			try {
				var prevVisibilityStr = this.previousMixedStructure.substr(i*2, 1);
				var prevStatusStr = this.previousMixedStructure.substr((i*2)+1, 1);
				if (prevVisibilityStr == '0') p.previouslyVisible = false; else p.previouslyVisible = true;
				p.previousStatus = prevStatusStr;
			} catch(e) {};
		}
	}
}

UELO.prototype.wasCourseReallyMixedAndPagesInAssessment = function() //pg2-qr
{
	var reallyMixed = false;
	var inAssessment = false;
	if (struct.isCourseMixed) { //should be mixed
		for (var i in this.pages) {
			var p = this.pages[i];
			if (p && p.visible && p.isExamPage && p.isAssessment) { // && p.status != PAGESTATUS_NOT_ATTEMPTED) {
				reallyMixed = true;
				inAssessment = true;
				break; //not neccessary go through all pages, some pages sets could overlap over each other (part in quiz could be inAssessment, ans some part- not)
			} else
			if (p && p.visible && p.isExamPage && !p.isAssessment) { // && p.status != PAGESTATUS_NOT_ATTEMPTED) {
				reallyMixed = true;
				inAssessment = false;
				break; //
			}
		}
	}
	
	return [reallyMixed, inAssessment];
}

UELO.prototype.wasReallyMixed = function() //pg2-qr
{
	var res = false;
	for (var i in this.pages) {
		var p = this.pages[i];
		if (p && p.isExamPage) {
			res = true;
			break;
		}
	}
	return res;
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
UELO.prototype.setVisitedCountList = function(t)
{
	for (var i in this.pages) {
		var p = this.pages[i];
		var s = t.substr(i * 3, 3);
		var c = parseInt(s, 16);
		p.visitedCount = c;
	}
}
UELO.prototype.getVisitedCountList = function()
{
	var s = "";
	for (var i in this.pages) {
		var p = this.pages[i];
		var c = p.visitedCount.toString(16);
		c = pad(c, 3);
		if (c.length == 3) {
			s += c;
		} else {
			s += "???"
		}
	}
	return s;
}
UELO.prototype.setBookmarkList = function(t)
{
	for (var i in this.pages) {
		var p = this.pages[i];
		var s = t.substr(i * 1, 1);
		p.isBookmark = (s == "B");
	}
}
UELO.prototype.getBookmarkList = function()
{
	var s = "";
	for (var i in this.pages) {
		var p = this.pages[i];
		if (p.isBookmark) {
			s += "B";
		} else {
			s += "_"
		}
	}
	return s;
}
UELO.prototype.setInteractionsStatus = function(s)
{
	var sindex = 0;
	for (var ip in this.pages) {
		var p = this.pages[ip];
		for (var i in p.interactions) {
			var inter = p.interactions[i];			
			inter.status = s.charAt(sindex++);
			switch (inter.status) {
				case "P":
					inter.result = true;
					break;
				case "F":
					inter.result = false;
					break;
				default:
					inter.result = "";
			}
		}
	}
}
UELO.prototype.getInteractionsStatus = function()
{
	var s = "";
	for (var ip in this.pages) {
		var p = this.pages[ip];
		for (var i in p.interactions) {
			var inter = p.interactions[i];			
			s += inter.status;
		}
	}
	return s;
}
UELO.prototype.getSimpleSessionTime = function()
{
	var now = new Date();
	return this.calculateTimeToString(this.beginTime, now);
}
var uelo = new UELO();
