var g_postProcType	= 0;
var g_nameSeparator	= "\021";	// <name>=<value>
var g_pairSeparator	= "\022";	// <name-value>&<name-value>
var g_valueSeparator= "\023";	// <value1>,<value2>...

//+++++ Object to prepare submit data for elements
function PrepareSubmitInit() {
}

//+++++
SimpleSubmit.prototype.Init = PrepareSubmitInit;
SimpleSubmit.prototype.Format;

function SimpleSubmit(fmtFunc) {
	this.Format = fmtFunc;
}

//+++++
PrepareSubmitByteArray.prototype.Init	= PrepareSubmitInit;
PrepareSubmitByteArray.prototype.Format = ByteArray_Format;
PrepareSubmitByteArray.prototype.fmtFunc;
PrepareSubmitByteArray.prototype.separator;

function PrepareSubmitByteArray(fmtFunc, separator) {
	this.fmtFunc = fmtFunc;
	this.separator = separator;
}

function ByteArray_Format(value) {
	return this.fmtFunc(value, this.separator);
}

//+++++
function DHMS_Format(value, element) {
	var dataForm = document.forms["theDataForm"];
	var fmtVal = "";
	var szVal = "";
	var postFix = "";
	var buddyCtrl = new Array();

	if (element)
		postFix = "_" +  element.name;

	buddyCtrl[0] = dataForm.elements["DHMS_hour" + postFix];
	buddyCtrl[1] = dataForm.elements["DHMS_min" + postFix];
	buddyCtrl[2] = dataForm.elements["DHMS_sec" + postFix];

	// Format <date>@<time>
	// date = DD/MM/YY, time = HH:MM:SS
	
	// Day
	if (value.length == 1)	// note: MM & YY are fixed at 00
		fmtVal += "0" + value + "/00/00" + "@";	// pad with zeroes
	else
		fmtVal += value + "/00/00" + "@";
	
	// Hour
	szVal = GetHTMLElementValue(buddyCtrl[0]);
	if (szVal.length == 1)
		fmtVal += "0" + szVal;	// pad with zeroes
	else
		fmtVal += szVal;
	
	// min
	szVal = GetHTMLElementValue(buddyCtrl[1]);
	if (szVal.length == 1)
		fmtVal += ":0" + szVal;	// pad with zeroes
	else
		fmtVal += ":" + szVal;

	// Sec (optional)
	if (buddyCtrl[2]) {
		szVal = GetHTMLElementValue(buddyCtrl[2]);
		if (szVal.length == 1)
			fmtVal += ":0" + szVal;	// pad with zeroes
		else
			fmtVal += ":" + szVal;
	}

	return fmtVal;
}

//+++++
function HexToTelPort(value) {
	var i=0;
	var j=0;
	var k=0;

	switch (value.length)
	{
	case(0):
		break;
	case(1):
		j = parseInt(value.charAt(0));
		break;
	default:
		i = HexToDec(value.charAt(0));
		j = parseInt(value.charAt(1));
		break;
	}
	
	k = (i*10) + j
	return k;
}

//+++++
function ExtToTelPort(value) {
	var i;

	i = TelList_FindByNumber(value);
	if (i >= 0)
		return g_telList[i].port + 1;

	return 0;
}

//+++++
PrepareSubmitDate.prototype.Init	= PrepareSubmitInit;
PrepareSubmitDate.prototype.Format = Date_Format;
PrepareSubmitDate.prototype.fmtFunc;
PrepareSubmitDate.prototype.dateFormat;
PrepareSubmitDate.prototype.seperator;

function PrepareSubmitDate(fmtFunc, dateFormat, seperator) {
	this.fmtFunc = fmtFunc;
	this.dateFormat = dateFormat;
	this.seperator = seperator;
}

function Date_Format(value) {
	return this.fmtFunc(value, this.dateFormat, this.seperator);
}

//+++++
function FormatDate(value, dateFormat, seperator) {
	var part = value.split(seperator);
	var result = new Array();

	result[0] = "00";
	result[1] = "00";
	result[2] = "00";

	// We always submit as dd/mm/yy
	switch(dateFormat)
	{
	case "DD/MM/YY":
		result[0] = part[0];
		result[1] = part[1];
		result[2] = part[2];
		break;
	case "DD/MM":
		result[0] = part[0];
		result[1] = part[1];
		break;
	case "MM/YY":
		result[1] = part[0];
		result[2] = part[1];
		break;

	case "YY/MM/DD":
		result[0] = part[2];
		result[1] = part[1];
		result[2] = part[0];
		break;
	case "MM/DD":
		result[0] = part[1];
		result[1] = part[0];
		break;
	case "YY/MM":
		result[1] = part[1];
		result[2] = part[0];
		break;
	}

	return result[0] + "/" + result[1] + "/" + result[2];
}

//+++++
PrepareSubmitDateTime.prototype.Init	= PrepareSubmitInit;
PrepareSubmitDateTime.prototype.Format  = DateTime_Format;
PrepareSubmitDateTime.prototype.dateFmtFunc;
PrepareSubmitDateTime.prototype.dateFormat;
PrepareSubmitDateTime.prototype.dateFieldSeperator;
PrepareSubmitDateTime.prototype.dateTimeSep;

function PrepareSubmitDateTime(dateFmtFunc, dateFormat, dateFieldSeperator, dateTimeSep) {
	this.dateFmtFunc = dateFmtFunc;
	this.dateFormat = dateFormat;
	this.dateFieldSeperator = dateFieldSeperator;
	this.dateTimeSep = dateTimeSep;
}

function DateTime_Format(value) {
    var partValue = value.split(this.dateTimeSep);    //partValue[0]=date, partValue[1]=time
    var result = "";
    
	// Format <date>@<time>
	// date = DD/MM/YY, time = HH:MM:SS    
	result =  this.dateFmtFunc(partValue[0], this.dateFormat, this.dateFieldSeperator);
	result += "@";
	result += partValue[1];
	return result;
}

function IntWithHash_Format(value) {
	if (value == "#")
		return HexToDec("FFFF");

	return value;
}

var g_prepareSubmitList = new Array();
g_prepareSubmitList["BinaryToDec"]		= new SimpleSubmit(BinaryToDec);
g_prepareSubmitList["HexToDec"]			= new SimpleSubmit(HexToDec);
g_prepareSubmitList["ByteArrayHex"]		= new PrepareSubmitByteArray(ConvertByteArrayHex, ".");
g_prepareSubmitList["ByteArrayDec"]		= new PrepareSubmitByteArray(ConvertByteArray, "/");
g_prepareSubmitList["NibbleArrayDec"]	= new PrepareSubmitByteArray(ConvertNibbleArray, ".");
g_prepareSubmitList["DHMS"]				= new SimpleSubmit(DHMS_Format);
g_prepareSubmitList["HexToTelPort"]		= new SimpleSubmit(HexToTelPort);
g_prepareSubmitList["ExtToTelPort"]		= new SimpleSubmit(ExtToTelPort);
g_prepareSubmitList["DD/MM/YY"]			= new PrepareSubmitDate(FormatDate, "DD/MM/YY", "/");
g_prepareSubmitList["DD/MM"]			= new PrepareSubmitDate(FormatDate, "DD/MM", "/");
g_prepareSubmitList["MM/YY"]			= new PrepareSubmitDate(FormatDate, "MM/YY", "/");
g_prepareSubmitList["YY/MM/DD"]			= new PrepareSubmitDate(FormatDate, "YY/MM/DD", "/");
g_prepareSubmitList["MM/DD"]			= new PrepareSubmitDate(FormatDate, "MM/DD", "/");
g_prepareSubmitList["YY/MM"]			= new PrepareSubmitDate(FormatDate, "YY/MM", "/");
g_prepareSubmitList["IntWith#"]			= new SimpleSubmit(IntWithHash_Format);
g_prepareSubmitList["dateTime DD/MM/YY"]= new PrepareSubmitDateTime(FormatDate, "DD/MM/YY", "/", " ");
g_prepareSubmitList["dateTime DD/MM"]	= new PrepareSubmitDateTime(FormatDate, "DD/MM", "/", " ");
g_prepareSubmitList["dateTime MM/YY"]	= new PrepareSubmitDateTime(FormatDate, "MM/YY", "/", " ");
g_prepareSubmitList["dateTime YY/MM/DD"]= new PrepareSubmitDateTime(FormatDate, "YY/MM/DD", "/", " ");
g_prepareSubmitList["dateTime MM/DD"]	= new PrepareSubmitDateTime(FormatDate, "MM/DD", "/", " ");
g_prepareSubmitList["dateTime YY/MM"]	= new PrepareSubmitDateTime(FormatDate, "YY/MM", "/", " ");

//----- Helper func
function FmtPos(pos1, pos2, pos3) {
	var str = pos1 + "," + pos2 + "," + pos3;
	return str;
}

function FmtPosRange(pos1Pair, pos2Pair, pos3Pair) {
	var str = FmtPos(pos1Pair.a, pos2Pair.a, pos3Pair.a) + ":";
	str += FmtPos(pos1Pair.b, pos2Pair.b, pos3Pair.b);
	return str;
}

function FmtFromToList(fmVal, toVal, valSep, rangeSep) {
	var fmKPos = new Array(3);	// index=whichKey
	var toKPos = new Array(3);
	var bFmPos = new Array(3);
	var str = "";

	fmKPos[0] = ParsePairArray(fmVal[0], valSep, rangeSep);
	fmKPos[1] = ParsePairArray(fmVal[1], valSep, rangeSep);
	fmKPos[2] = ParsePairArray(fmVal[2], valSep, rangeSep);

	toKPos[0] = ParsePairArray(toVal[0], valSep, rangeSep);
	toKPos[1] = ParsePairArray(toVal[1], valSep, rangeSep);
	toKPos[2] = ParsePairArray(toVal[2], valSep, rangeSep);

	// note which is empty list
	bFmPos[0] = toKPos[0].length;
	bFmPos[1] = toKPos[1].length;
	bFmPos[2] = toKPos[2].length;

	for (var i=0; i < fmKPos[0].length; i++) {
	for (var j=0; j < fmKPos[1].length; j++) {
	for (var k=0; k < fmKPos[2].length; k++) {
		str += "FROM:" + FmtPosRange(fmKPos[0][i], fmKPos[1][j], fmKPos[2][k]) + g_pairSeparator;

		// for any toKeyPos which is empty, we use the current fromKeyPos
		if (bFmPos[0]==0) toKPos[0][0]=fmKPos[0][i];
		if (bFmPos[1]==0) toKPos[1][0]=fmKPos[1][j];
		if (bFmPos[2]==0) toKPos[2][0]=fmKPos[2][k];

		for (var x=0; x < toKPos[0].length; x++) {
		for (var y=0; y < toKPos[1].length; y++) {
		for (var z=0; z < toKPos[2].length; z++) {
			str += "TO:" + FmtPosRange(toKPos[0][x], toKPos[1][y], toKPos[2][z]) + g_pairSeparator;
		}}}
	}}}
	str = TrimStr(str, g_pairSeparator);
	return str;
}
