/*
	ICUS_SCORM_API_Serialization_Plugin

	10/29/2003 - Created by Timothée Groleau
	(c) 2003 - ICUS Pte Ltd

	Add serialization functionality to the SCORMAPI class transparently

	Requires the ICUS_SCORM_API.js
*/


SCORMAPI_wSerializationPlugin = SCORMAPI;

// redefine class constructor
SCORMAPI = function(data_definition, strict) {
	// execute original constructor
	this.$temp = SCORMAPI_wSerializationPlugin;
	this.$temp(data_definition, strict);
	delete this.$temp;
	
	// add new parameter
	this.$serializationLog = "";
}

// get previous class prototype
o = SCORMAPI.prototype = SCORMAPI_wSerializationPlugin.prototype;



/* =============================================
	SCORM API serialization methods
============================================= */

o.serialize = function() {
	var data = "";
	this.$serializationLog = "";
	for (var i in this.$data) {
		if (this.$data[i] == null) continue;
		data += this.digSerialize("", i, this.$data[i]);
	}
	return data;
}

o.digSerialize = function(currentPath, name, value) {
	if (typeof(value) == "object") {
		var s = '';
		for (var i in value) {
			s += this.digSerialize(currentPath + name + ".", i, value[i]);
		}
		return s;
	} else {
		return currentPath + name + ":" + escape(value.toString()) + "\r\n";
	}
}

o.getLineDelimiter = function(sFullText) {

	var iIdx1 = sFullText.indexOf("\r\n");
	var iIdx2 = sFullText.indexOf("\n\r");

	if (iIdx1 == -1) {
		if (iIdx2 != -1) return "\n\r";
	} else {
		if (iIdx2 == -1) return "\r\n";
		return (iIdx1 < iIdx2 ? "\r\n" : "\n\r");
	}

	iIdx1 = sFullText.indexOf("\r");
	iIdx2 = sFullText.indexOf("\n");

	if (iIdx1 == -1) {
		if (iIdx2 != -1) return "\n";
	} else {
		if (iIdx2 == -1) return "\r";
		return (iIdx1 < iIdx2 ? "\r" : "\n");
	}

	// no delimiter found, it's a one line string then, return default delimiter
	return "\r\n";
}

o.deserialize = function(sData) {
	var sLog = "";
	var aLines = sData.split(this.getLineDelimiter(sData));
	sData = "";
	var iLineIdx;
	for (iLineIdx = 0; iLineIdx < aLines.length; iLineIdx++) {
		var aPair = aLines[iLineIdx].split(":");
		if (aPair.length != 2) {
			sLog += "WARNING: Line " + (iLineIdx+1) + ": [" + aLines[iLineIdx] + "] -> Not a valid line, skipped\n";
			continue;
		}
		this.LMSSetValue(aPair[0], unescape(aPair[1]), true);
		sLog += "Line " + (iLineIdx+1) + ": [" + aPair[0] + "] -> " + this.LMSGetErrorString(this.LMSGetLastError()) + "\n";
	}
	this.$serializationLog = sLog;
}

o.getSerializationLog = function() {
	return this.$serializationLog;
}



/* =============================================
	Clean up used references
============================================= */

delete o;

