/* ssCF.JS	this contains all common functions to be used by javascript */

// choosingAtleastOne(){
// dateTimeStringToObj(dtString , format){
// extractFunArg(func_str){
// getData(objName){
// getObject(objName){
// getOData(objName){
// getLoc(objName){
// getLocByNetName(objName){
// getNameWithoutRow(objName){
// getRow(objName){
// getSrcElement(eventObj){
// isBlank(str)
// isDuplicated(objName, dispName, dataType, format){
// isInteger(inputStr)
// objToDateString(dateObj, format){
// objToTimeString(dateObj, format){
// roundDeci(floatValue, deciPlace){
// rtrim(trim_str)
// selectAll(objName){
// setArData(objName, valToSet){
// setData(objName, valToSet){
// showMessages(m_code_str, dispName, param_str)
// trim - left and right trim of leading and trailing spaces
// (by miu on 21-06-01) - replace_space(str,substr,withstr)
// (by miu on 21-06-01) - show_menu(n)
// (by miu on 21-06-01) - hide_menu(n)
///////

function BrowserCheck() {
	var b = navigator.appName;
	if (b=="Netscape") {
		this.b = "ns";
	}
	else if (b=="Microsoft Internet Explorer") {
		this.b = "ie";
	}
	else {
		this.b = b;
	}
	this.version = navigator.appVersion;
	this.v = parseInt(this.version);
	this.ns = (this.b=="ns" && this.v>=4);
	this.ns4 = (this.b=="ns" && this.v==4);
	this.ns5 = (this.b=="ns" && this.v==5);
// Modified by Miu on 2001/07/20 for correct checking this.ns6
//	this.ns6 = (this.b=="ns" && this.v==6)
	this.ns6 = (this.b=="ns" && this.v==5);
//
	this.ie = (this.b=="ie" && this.v>=4);
	this.ie4 = (this.version.indexOf('MSIE 4')>0);
	this.ie5 = (this.version.indexOf('MSIE 5')>0);
	this.min = (this.ns||this.ie);
}

browser = new BrowserCheck();

function calcTotal_C(objName){
	var loc_ar = getLocByNetName(objName);
	if(loc_ar == null){
		alert("System Error occurred, object name does not exist <function calTotal(objName)>");
		return false;
	}
	var formIdx = loc_ar[0];
	var colIdx = loc_ar[1];
	var total = 0;
	for (var r_idx = 1; r_idx < sObj.DatAr[formIdx].length; r_idx ++){
		total += Number(sObj.DatAr[formIdx][r_idx][colIdx]);
	}
	return total;
}
///////
function choosingAtleastOne(objName){
	var count = 0;
	var loc_ar = getLocByNetName(objName);
	var formIdx = loc_ar[0];
	var colIdx = loc_ar[1];

	if (loc_ar == null){
		alert("System Error occurred, object name passed internally is invalid \nat common function 'choosingAtleastOne(objName)'.");
		return null;
	}
	for (var row_idx = 1; row_idx < sObj.DatAr[formIdx].length; row_idx++){
		if (sObj.DatAr[formIdx][row_idx][colIdx].toLowerCase() == "y"){
			count ++;
			break;
		}
	}
	//check nothing chosen
	if (count == 0){
		showMessages("A010005","","");
		return null;
	}

	return "";
}
/////////////////////////////////
function dateTimeStringToObj(dtString , format){
	var year = 0;
	 var month = 0;
	 var day = 0;
	 var hour = 0;
	 var minute = 0;
	 var second = 0;
	var rnt_date_str = "";
	var date_str = "";
	var time_str = "";
	var dateFm = "";
	var timeFm = "";
	var now;

	format = format.toUpperCase();
	dtString = trim(dtString);
	var pos1 =	format.indexOf(" ");
	var pos = dtString.indexOf(" ");
	if (pos1 > -1){
		if (pos > -1 ){
			if (format.lastIndexOf("Y", pos1) > -1 || format.lastIndexOf("D", pos1) > -1){
				dateFm = format.substring(0, pos1);
				date_str = dtString.substring(0, pos);
				date_str = genDateStr(date_str, dateFm);

				timeFm = format.substring(pos1, format.length);
				time_str = dtString.substring(pos, dtString.length);
				time_str = genTimeStr(time_str, timeFm);
			 }
			 else if (format.lastIndexOf("H", pos1) > -1 || format.lastIndexOf("S", pos1) > -1) {
				timeFm = format.substring(0, pos1);
				time_str = dtString.substring(0, pos);
				time_str = genTimeStr(time_str, timeFm);

				dateFm = format.substring(pos1, format.length);
				date_str = dtString.substring(pos, dtString.length);
				date_str = genDateStr(date_str, dateFm);
			 }
		}
	}
	else{
		if (format.indexOf("Y") > -1	|| format.indexOf("D") > -1 ){
			dateFm = format;
			date_str = dtString;
			date_str = genDateStr(date_str, dateFm);
		 }
		 else if (format.indexOf("H") > -1 || format.indexOf("S") > -1) {
			timeFm = format;
			time_str = dtString;
			time_str = genTimeStr(time_str, timeFm);
		 }
	}

	year = Number(date_str.substring(0, 4));
	month = Number(date_str.substring(4, 6));
	day = Number(date_str.substring(6, 8));
	hour = Number(time_str.substring(0, 2));
	minute = Number(time_str.substring(2, 4));
	second = Number(time_str.substring(4, 6));

	return	(new Date(year, month - 1, day,  hour, minute, second, 0));

}
/////////////////////////////////
function extractFunArg(func_str){
	rntAr = new Array();
	var pos1 = func_str.indexOf("(");
	var pos2 =	func_str.indexOf(")");
	if (pos1 > -1 && pos2 > -1){
		arg_str = func_str.substring(pos1 + 1, pos2);
		var func_name = func_str.substring(0, pos1); // = function name
		rntAr = arg_str.split(",");
		for (var i = 0; i < rntAr.length; i ++){
			pos1 = rntAr[i].indexOf("'"); // single
			if (pos1 > -1){
				pos2 = rntAr[i].indexOf("'", pos1+ 1);
				rntAr[i] = rntAr[i].substring(pos1 + 1, pos2);
			}
			else {
				pos1 = rntAr[i].indexOf('"');
				if (pos1 > -1) { // double
					pos2 = rntAr[i].indexOf('"', pos1 + 1);
					rntAr[i] = rntAr[i].substring(pos1 + 1, pos2);
				}
				else {
					rntAr[i] = Number(rntAr[i]);
				}
			}
		}
		for (var i = rntAr.length; i > 0; i --){
			rntAr[i] = rntAr[i - 1];
		}
		rntAr[0] = trim(func_name);
		return rntAr;
	}
}
///////
function getKeyCode(eventObj){
	var key = "";
	eventObj = transEventObj(eventObj);

	if (sObj.isIE){key = eventObj.keyCode;}
	else if (sObj.isNAV) {key = eventObj.which;}
	return key;
}

///////
/*** Get data from data Arrays (sObj.DatAr).		***/
/*** Arguments: objName = name of obj ***/
function getData(objName){
	locAr = new Array();
	locAr = getLoc(objName);
	if (locAr == null){return null;}
	return	sObj.DatAr[locAr[0]][locAr[1]][locAr[2]];
}
/////////
function getObject(objName){
	if (typeof objName == "object"){return objName;}
	locAr = new Array();
	locAr = getLoc(objName);
	if (locAr == null){
		alert("System Error occurred, object name '" + objName + "' not found.");
		return null;
	}
	return (document.forms[locAr[4]].elements[objName]);
}
/////////
/*** Get original data from data Arrays (sObj.ODatAr) ***/
/*** Arguments: objName = name of obj ***/
function getOData(objName){
	locAr = new Array();
	locAr = getLoc(objName);
	if (locAr == null){return null;}
	return	sObj.OriDatAr[locAr[0]][locAr[1]][locAr[2]];
}

/////////
/*** look for the location in data string array.(sObj.DatAr)			***/
/*** Arguments: objName = name of obj 	***/
/*** Return a Array with 3 items : 1=  form key,	2 =  row no,	3 = col no	***/
function getLoc(objName){
	var p_idx = 0;
	RetAr = new Array();
	var Apos = objName.lastIndexOf("__");
	var oName = objName.substring(0, Apos);
	var RowNo = objName.substring(Apos + 2, objName.length);
	for ( p_idx = 0; p_idx < sObj.ObjPropAr.length; p_idx ++){
		if (sObj.ObjPropAr[p_idx][0].toUpperCase() == oName.toUpperCase()){
			RetAr[0] = sObj.ObjPropAr[p_idx][1];	 // = form key
			RetAr[1]= RowNo;			 // =  row no
			RetAr[2] = sObj.ObjPropAr[p_idx][3];	 // = col no
			RetAr[3] = p_idx; 	 // = row key at ObjPropAr
			RetAr[4] = sObj.ObjPropAr[p_idx][4];	 // = form name
			break;
		}
		if (p_idx == sObj.ObjPropAr.length - 1){ RetAr = null;}
	}
	return RetAr;
}
/////////
function getLocByNetName(objName){
	var p_idx = 0;
	RetAr = new Array();
	var oName = objName;
	for ( p_idx = 0; p_idx < sObj.ObjPropAr.length; p_idx ++){
		if (sObj.ObjPropAr[p_idx][0].toUpperCase() == oName.toUpperCase()){
			RetAr[0] = sObj.ObjPropAr[p_idx][1];	 // = form key
			RetAr[1] = sObj.ObjPropAr[p_idx][3];	 // = col no
			RetAr[2] = p_idx; 	 // = row key at ObjPropAr
			RetAr[3] = sObj.ObjPropAr[p_idx][4];	 // = form name
			break;
		}
		if (p_idx == sObj.ObjPropAr.length - 1){ RetAr = null;}
	}
	return RetAr;
}
/////////
function getRow(objName){
	return objName.substring(objName.lastIndexOf("__") + 2, objName.length);
}
////////
function getNameWithoutRow(objName){
	var pos = "";
	pos = objName.lastIndexOf("__");
	return objName.substring(0, pos);
 }
///////
function transEventObj(eventObj){
	if (!sObj){return null;}
	if (sObj.isIE){
		eventObj = window.event;
	}
	return eventObj;
}
///////
function getSrcElement(eventObj){
	var rntObj;
	eventObj = transEventObj(eventObj);
	if (eventObj == null || !sObj){return null;}
	if (sObj.isIE){
		rntObj = eventObj.srcElement;
	}
	else {rntObj = eventObj.target;}

	return rntObj;
}
///////
function isBlank(str){
	for(var b = 0; b < str.length; b++) {
		var c = str.charAt(b);
		if ((c != " ") && (c != "\n") && (c != "\t")) return false;
	}
	return true;
}
///////////
function isDuplicated(objName, dispName, dataType, format){
	var loc_ar = "";
	var delim = ",";
	var idx = -1;
	var value_add = "";
	var dispName_add = "";
	var formIdx = "";
	var formName = "";
	var objNameForFocus = "";
	var value_ar = new Array();
	var colKey_ar = new Array();
	var objValue_ar = new Array();
	var dataType_ar = new Array();

	var objName_ar = objName.split(delim);
	var dispName_ar = dispName.split(delim);
	var dataType_ar = dataType.split(delim);
	var format_ar = format.split(delim);

	for (var i = 0; i  < objName_ar.length; i ++){
		loc_ar = getLocByNetName(objName_ar[i]);
		formIdx = loc_ar[0];
		formName = loc_ar[3];
		colKey_ar[i] = loc_ar[1];
		objValue_ar[i] = "";
		dataType_ar[i] = dataType_ar[i].toUpperCase();
		if (i == 0){
			dispName_add = dispName_ar[i];
			objNameForFocus = objName_ar[i];
		}
		else {dispName_add += " + " + dispName_ar[i];}
	}
	for (var r_idx = 1; r_idx < sObj.DatAr[formIdx].length; r_idx ++){
		value_add = "";
		for (var i = 0; i  < objName_ar.length; i ++){
			objValue_ar[i] = sObj.DatAr[formIdx][r_idx][colKey_ar[i]];
			if (!(isBlank(objValue_ar[i]))){
				if (dataType_ar[i] == "DATE"){
					objValue_ar[i] = genDateStr(objValue_ar[i], format_ar[i]);
				}
				else if (dataType_ar[i] == "INTEGER" || dataType_ar[i] == "DECIMAL"){
					objValue_ar[i] = Number(objValue_ar[i]);
				}
				else if (dataType_ar[i]  == "TEXT"){
					// do nothing
				}
				value_add += objValue_ar[i];
			}
			else{break;}
		}
		if (!(isBlank(value_add))){
			idx ++;
			value_ar[idx] = value_add;
			for(var v_idx = 0; v_idx < value_ar.length -1; v_idx ++){
				//alert("new value: " + value_add + "  compare value: " + value_ar[v_idx])
				if (value_add.toUpperCase() == value_ar[v_idx].toUpperCase()){
					showMessages("A010069", dispName_add + " at row " + r_idx, "");
					document.forms[formName].elements[objNameForFocus + "__" + r_idx].focus();
					return null;
				}
			}
		}
	}
	return "";
}

///////////
function isInteger(inputStr){
	var retrun_value = "true";
	inputStr = trim(inputStr);
	for (var d = 0; d < inputStr.length; d++){
		var oneChar = inputStr.charAt(d);
		if ((oneChar < "0" || oneChar > "9")){
			retrun_value = "false";
			break;
		}
	}
	return retrun_value;
}

/////////
function printScreen(){
	var LHeight = "";
	var LWidth = "";
	if ((sObj.isIE && sObj.browserVersion < 5.0) || (sObj.isNAV && sObj.browserVersion < 4.5)){
		showMessages("A010220","","Internet Explorer v5.0 and Netscape v4.5");
		return;
	}

	if (typeof sObj.hostLayerName != "undefined"){
		var layerName = sObj.hostLayerName;
		if (layerName != "" && layerName != null ){
			LHeight = document.all[layerName].style.height;
			LWidth = document.all[layerName].style.width;
			document.all[layerName].style.height = "";
			document.all[layerName].style.width = "";
		}
	}
	window.print();
	if (LHeight != ""){
		document.all[layerName].style.height = LHeight;
		document.all[layerName].style.width = LWidth;
	}

}
/////////

function objToDateString(dateObj, format){
	var result = "";
	var date_str = "";
	var time_str = "";
	var pos = -1;
	var pos2 = -1;
	var len = format.length;

	var year = dateObj.getFullYear();
	var month = dateObj.getMonth() + 1;
	var day = dateObj.getDate();

	year = year.toString();
	month = month.toString();
	day = day.toString();

	result = format;
	result = result.toUpperCase();

	pos = result.indexOf("Y");
	 if (pos > -1){
		pos2 = result.lastIndexOf("Y");
		if	(pos2 - pos == 1){
			year = year.substring(year.length -2, year.length);
			result = result.substring(0, pos) + year + result.substring(pos2 + 1, len);
		}
		else if (pos2 - pos == 3){
			result = result.substring(0, pos) + year + result.substring(pos2 + 1, len);
		}
		else{alert("System Error occurred, the date format '"  + format + "' is invalid");}
	}
	pos = result.indexOf("M");
	 if (pos > -1){
		pos2 = result.lastIndexOf("M");
		if	(pos2 - pos == 0){
			result = result.substring(0, pos) + month  + result.substring(pos2 + 1, len);
		}
		else if (pos2 - pos == 1){
			if (month < 10) {month = "0" + month;}
			result = result.substring(0, pos) + month  + result.substring(pos2 + 1, len);
		}
		else{alert("System Error occurred, the date format '"  + format + "' is invalid");}
	}
	pos = result.indexOf("D");
	 if (pos > -1){
		pos2 = result.lastIndexOf("D");
		if	(pos2 - pos == 0){
			result = result.substring(0, pos) + day  + result.substring(pos2 + 1, len);
		}
		else if (pos2 - pos == 1){
			if (day < 10) {day = "0" + day}
			result = result.substring(0, pos) + day  + result.substring(pos2 + 1, len);
		}
		else{alert("System Error occurred, the date format '"  + format + "' is invalid");}
	}

	return result;
}
///////////
function objToTimeString(dateObj, format){
	var result = "";
	var date_str = "";
	var time_str = "";
	var pos = -1;
	var pos2 = -1;
	var len = format.length;

	var hour = dateObj.getHours();
	var minute = dateObj. getMinutes();
	var second = dateObj. getSeconds();

	hour = hour.toString();
	minute = minute.toString();
	second = second.toString();

	result = format;
	result = result.toUpperCase();

	pos = result.indexOf("H");
	 if (pos > -1){
		pos2 = result.lastIndexOf("H");
		if	(pos2 - pos == 0){
			result = result.substring(0, pos) + hour	+ result.substring(pos2 + 1, len);
		}
		else if (pos2 - pos == 1){
			if (hour < 10) {hour = "0" + hour;}
			result = result.substring(0, pos) + hour	+ result.substring(pos2 + 1, len);
		}
		else{alert("System Error occurred, the date format '"  + format + "' is invalid");}
	}
	pos = result.indexOf("M");
	 if (pos > -1){
		pos2 = result.lastIndexOf("M");
		if	(pos2 - pos == 0){
			result = result.substring(0, pos) + minute	+ result.substring(pos2 + 1, len);
		}
		else if (pos2 - pos == 1){
			if (minute < 10) {minute = "0" + minute;}
			result = result.substring(0, pos) + minute	+ result.substring(pos2 + 1, len);
		}
		else{alert("System Error occurred, the date format '"  + format + "' is invalid");}
	}
	var pos = result.indexOf("S");
	 if (pos > -1){
		pos2 = result.lastIndexOf("S");
		if	(pos2 - pos == 0){
			result = result.substring(0, pos) + second	+ result.substring(pos2 + 1, len);
		}
		else if (pos2 - pos == 1){
			if (second < 10) {second = "0" + second;}
			result = result.substring(0, pos) + second	+ result.substring(pos2 + 1, len);
		}
		else{alert("System Error occurred, the date format '"  + format + "' is invalid");}
	}

	return result;
}
////////
function roundDeci(floatValue, deciPlace){
	var shift = Math.pow(10, deciPlace);
	return ( Math.round(floatValue * shift) ) / shift;
}
////////
function roundDownDeci(floatValue, deciPlace){
	var shift = Math.pow(10, deciPlace);
	return ( Math.floor(floatValue * shift) ) / shift ;
}
function roundUpDeci(floatValue, deciPlace){
	var shift = Math.pow(10, deciPlace);
	return ( Math.ceil(floatValue * shift) ) / shift;
}
function rtrim(trim_str){
	var apos = 0;
	var bpos = 0;
	if (trim_str == null || trim_str == "") {return "";}
	bpos = trim_str.length;
	for (var ts = trim_str.length - 1 ; ts >= 0; ts--){
		if (trim_str.charAt(ts) == " "){
			bpos = ts;
		}
		else {break;}
	}
	return	trim_str.substring(apos, bpos);


}

/////////
function trim(trim_str){
	var apos = 0;
	var bpos = 0;
	if (trim_str == null || trim_str == "") {return "";}
	bpos = trim_str.length;
	for (var ts = 0; ts < trim_str.length; ts++){
		if (trim_str.charAt(ts) == " "){
			apos = ts + 1;
		}
		else {break;}
	}
	for (var ts = trim_str.length - 1 ; ts >= 0; ts--){
		if (trim_str.charAt(ts) == " "){
			bpos = ts;
		}
		else {break;}
	}
	return	trim_str.substring(apos, bpos);
}

//////////////////////////////////////////////////////////////////////////////////////////

//////////
function selectAll(objName){
	var loc_ar = getLocByNetName(objName);
	var formIdx = loc_ar[0];
	var formName = loc_ar[3];

	if (loc_ar == null){
		showMessages("System Error occurred, object name passed internally is invalid \nat common function 'selectAll(objName)'.");
		return null;
	}

	for(var r_idx = 1; r_idx < sObj.DatAr[formIdx].length; r_idx ++){
		if (document.forms[formName].elements[objName + "__" + r_idx].type == "checkbox"){
			//document.forms[formName].elements[objName + "__" + r_idx].checked = true
			setData(objName + "__" + r_idx,"y");
		}
	}
}
/////////
/*** set value of data string array.(sObj.DatAr) and elements in the page ***/
// Arguments: objName = name of object
//		valToSet = value to be set
function setData(objName, valToSet){
	var rntValue = true;
	var targetObj = getObject(objName);

	if (targetObj != null) {
		var type = "";
		if (typeof valToSet != "string"){valToSet = valToSet.toString();}

		if (typeof targetObj.type != "undefined"){
			type = targetObj.type;
		}
		else if (typeof targetObj[0].type != "undefined"){
			type = targetObj[0].type;
		}
		else {return false;}

		if (type == "checkbox" ){
			if (valToSet.toUpperCase() == "Y"){
				targetObj.checked = true;
				setArData(objName, valToSet);
			}
			else if (valToSet.toUpperCase() == "N"){
				targetObj.checked = false;
				setArData(objName, valToSet);
			}
			else{rntValue = false;}
		}
		else if (type == "radio"){
			rntValue = false;
			for(var i=0; i < targetObj.length;i++){
				if (targetObj[i].value == valToSet){
					targetObj[i].checked = true;
					setArData(objName, valToSet);
					rntValue = true;
					break;
				}
			}
		}
		else if (type == "select-one"){
			rntValue = false;
			for(var i=0; i < targetObj.options.length;i++){
				if (targetObj.options[i].value == valToSet){
					targetObj.selectedIndex = i;
					setArData(objName, valToSet);
					rntValue = true;
					break;
				}
			}
		}
		else if(type == "textarea"){
			targetObj.value = valToSet;
			setArData(objName, valToSet);
		}
		else if(type == "hidden"){
			targetObj.value = valToSet;
			setArData(objName, valToSet);
		}
		else if(type == "password"){
			targetObj.value = valToSet;
			setArData(objName, valToSet);
		}
		else if(type == "text"){
			targetObj.value = valToSet;
			setArData(objName, valToSet);
		}
		else {rntValue = false;}
	}
	else {rntValue = false;}

	return rntValue;
}
/////////
/*** set value of data string array.(sObj.DatAr) only ***/
// Arguments: objName = name of obj
//		valToSet = new value to be set
function setArData(objName, valToSet){
	var formName = "";
	locAr = new Array();
	locAr = getLoc(objName);
	if (locAr == null){
		alert("System Error occurred, object name '" + objName + "' not found.");
		return false;
	}
	// set the new value to the data array
	sObj.DatAr[locAr[0]][locAr[1]][locAr[2]] = valToSet;
	//alert(sObj.OriDatAr[locAr[0]][locAr[1]][locAr[2]] +"----"+ valToSet)
	if (sObj.OriDatAr[locAr[0]][locAr[1]][locAr[2]].toUpperCase() != valToSet.toUpperCase() ){
		// set the modified flag (0 0r 1) to mod array
		sObj.ModAr [locAr[0]][locAr[1]][locAr[2]] = 1;	// mark it modified
	}
	else {sObj.ModAr [locAr[0]][locAr[1]][locAr[2]] = 0;}  // mark non-modified
	//alert(sObj.DatAr [locAr[0]])
	return true;
}

/////////

function showMessages(m_code_str, dispName, param_str){
	var m_text = "";
	var final_text = "";
	var m_type = "";
	var m_footer = "";
	var rnt_value = null;
	var del = ",";
	var ins_pos;
	var m_type_array = new Array();
	m_code_array = new Array;
	dispName_array = new Array;
	param_array = new Array;
	if (m_code_str != null && m_code_str != ""){m_code_array = m_code_str.split(del);}
	else {
		alert("System Error occurred,  message code missed when trying to display message.");
		return null;
	}
	if (dispName !=  null){
		if (m_code_array.length == 1){dispName_array[0] = dispName;}
		else {dispName_array = dispName.split(del);}
		/*if (m_code_array.length != dispName_array.length){
			alert("System Error occurred,  number of	parameters passed to display message are invalid.")
			return null
		}*/
	}
	if (param_str != null){
		if (m_code_array.length == 1){param_array[0] = param_str;}
		else {param_array = param_str.split(del);}
		/*if (m_code_array.length != param_array.length){
			alert("System Error occurred,  number of	parameters passed to display message are invalid.")
			return null
		}*/
	}
	for (var m = 0; m < m_code_array.length; m++){
		if (m_code_array[m]!= null && m_code_array[m]!= ""){
			if (typeof document.ssMessages.elements[m_code_array[m]] != "undefined"){
				m_type_array[m] = m_code_array[m].charAt(2);
				if (typeof	document.ssMessages.elements[m_code_array[m]].value == "undefined" ){
					alert("System Error occurred, duplicate message codes defined.");
					return null;
				}
				m_text = document.ssMessages.elements[m_code_array[m]].value;
				ins_pos = m_text.indexOf("%s");
				if (ins_pos > -1) {
					if (typeof param_array[m] != "undefined" ){
						if (param_array[m] == null ){param_array[m] = "";}
						m_text = m_text.substring(0, ins_pos) + param_array[m] + m_text.substring( ins_pos + 2);
					}
				}
				if (m_type_array[m]!= 3){
					if (typeof dispName_array[m]!= "undefined" && dispName_array[m] != null && dispName_array[m] != ""){
						m_text += " : <" + dispName_array[m] + ">";
					}
				}
			}
			else {
				alert("System Error occurred in finding the text of the message code '"+ m_code_array[m]+ "'");
				return null;
			}
		}
		else {
			alert("System Error occurred, message code missed.");
			return null;
		}
		if (m == 0){final_text += m_text;}
		else {final_text += "\n" + m_text;}
	}
	if (m_type_array != null){
		for (var mta_index = 0; mta_index < m_type_array.length; mta_index++){
			if (m_type_array[mta_index] == 1){	// if anyone is alert type, message should be display as alert()
				m_type = 1;
				break;
			}
			else if (m_type_array[mta_index] == 2){ // if anyone is confirm type provided no alert type, message should be display as confirm()
				m_type = 2;
			}
			else if (m_type_array[mta_index] == 3){ // if all are promt type, message should be display as prompt()
				if (m_type != 2){m_type = 3;}
			}
		}
	}

	if (m_type == 1){ // alert type : no return value
		//m_footer = "Please complete or correct the field(s) and submit again."
		alert(final_text + m_footer);
	}
	else if (m_type == 2){ // confirm type : return value will be "true or false"
		//m_footer = "footer message for confirm type"
		rnt_value = confirm(final_text + m_footer);
	}
	else if (m_type == 3){ // prompt type  : return value will be "string, blank or null"
		//m_footer = "footer message for prompt type"
		if (dispName == null){dispName = "";}
		rnt_value = prompt( final_text , dispName);
	}
	return rnt_value;
}


//////////////////////////////////////////////////////////////////////////////////////////

//	ssDG.js -- this is based on "display grid to change" version


function SObj ()
{
//		 DatAr [i] [j] [k]
//			 where	i = form index
//				j controls the repeating rows
//			 e.g.
//
//		 Row 0 for curformIdx 0
//						 Col 0	 Col 1			 Col2
//				 Row 0		 ObjName1  ObjName1  ObjName3
//				 Row 1		 D1  D2 	 D3
//				 Row 2
//		 Row 1for curformIdx 1
//						 Col 0	 Col 1			 Col2
//				 Row 0		 ObjName4  ObjName5  ObjName6
//				 Row 1
//				 Row 2
//		 Row 2for curformIdx 2
//
//	... repeat for all forms
//
	this.DatAr = new Array();
//		 ODatAr stores the original data and mirros the format of DataAr
	this.OriDatAr = new Array();
//		 ValAr mirros the format of DataAr
	this.ValAr = new Array();
//		 ModAr	mirrors the format of DataAr
	this.ModAr = new Array();
//
//		 ObjPropAr this array stores properties of all object names in a matrix
//		 e.g.
//		Col 0 		Col 1 Col2
//		 Row 0	ObjName1
//		 1	ObjName2
//		 2	ObjName3
//
//	... repear for all forms
	this.ObjPropAr = new Array();
// one line array for storing validation rules
	this.ObjValAr = new Array();
	this.CurFormIdx = -1;
	this.delim_row = "`|";
	this.delim_col ="`%";
	this.delim_opt = "`&";
	this.delim_disp = "`^";
	this.fm_date="yyyy/mm/dd";
	this.fm_time = "hh:mm:ss";
	this.v_rule_delim = "^";
	this.decimal = 2;
	this.hostLayerName = "";
	this.defaultButton = "";
	this.num_length = 18;
	this.isNAV = (navigator.appName.indexOf("Netscape") != -1);
	this.isIE = (navigator.appName.indexOf("Microsoft") != -1);
	if (this.isIE){
		this.browserVersion = parseFloat(navigator.appVersion.substr(navigator.appVersion.indexOf("MSIE") + 4));
	}
	else{
		this.browserVersion = parseFloat(navigator.appVersion);
	}
	//this.DynObjAr = new Array()
	this.allowSubmit = true;
//add "__"

}

var sObj = new SObj();
function getDataArray(i_str, del)
{
	return i_str.split(del);
}


function getValString (ori_txt, replace_txt)
{
	//var rnt_str = ori_txt 	*** to be change to
	var rnt_str = "";
	var pos = -1;
	var pos2 = -1;
	var ori_txt_lowerC = ori_txt.toLowerCase();
	var temp_replace_txt = "<!--^" + replace_txt + " ";
	pos = ori_txt_lowerC.indexOf(temp_replace_txt);
	if	(pos > -1){
		var temp_replace_txt2 = "-->";
		pos2 = ori_txt_lowerC.indexOf(temp_replace_txt2, pos);
		if	(pos2 > -1){
						 rnt_str = ori_txt.substring(pos + temp_replace_txt.length, pos2);
						 // search the display name and concat it before the rule string
						 pos1 = rnt_str.indexOf("||");
						 if ( pos1 > -1){
				rnt_str = rnt_str.substring( pos1 + 2) + sObj.v_rule_delim + rnt_str.substring(0, pos1);
						 }
						 else{rnt_str = "" + sObj.v_rule_delim + rnt_str.substring(0, pos1);} // give a blank string for display name if it does not exist
		}
	}
	return rnt_str;
}

function replaceText(ori_txt, replace_txt, insert_txt, replace_value)
{
	var pos = -1;
	var pos2 = -1;
	var pos3 = -1;
	var pos4 = -1;
	var pos5 = -1;
	var pos6 = -1;
	optAr  = new Array();
	var temp_replace_txt = "";
	var temp_insert_txt = "";
	var temp_insert_value = "";
	var defVal = "";
	var compare_value = "";
	var temp_insert_event = ' onblur="changeHandler(event)" ';
	var temp_insert_event_onclick = ' onblur="changeHandler(event)" ';
	var ori_txt_lowerC = ori_txt.toLowerCase();
	var rnt_str = ori_txt;
	replace_txt =  replace_txt.toLowerCase();
	var name_prefix = replace_txt.substring(0, 2);
	insert_txt = insert_txt.toLowerCase();
	temp_replace_txt =	'"' + replace_txt +  '"';
	temp_insert_txt =  '"' + insert_txt +  '"';

//document.write ori_txt
//////////////////////////////////////////////////////////
// Comment by Sunny 2001/02/08 for Netscape 6
// Updated by Miu 2001/07/20 for IE, NS4 and NS6 compromising
//if (replace_value.indexOf("\42") > -1 && replace_value.indexOf("\47") > -1){	// if both double quot and single quot found
	if (browser.ns6==true)	{
		var regExp2 = "/42/g";
		replace_value = replace_value.replace(regExp2, "&quot;");
		temp_insert_value = ' value="' + replace_value + '" ';
	} else {
		var regExp3 = "/\42/g";
		replace_value = replace_value.replace(regExp3, "&quot;");
		temp_insert_value = ' value="' + replace_value + '" ';
	}
//}
//
	//////////////////////////////////////////////////////////////////
	// add logic to replace all the hidden fields type h_
	// or change all HTML templates
	if (replace_txt.substring(0, 3) == "gd_"){ // test for Grid Display Field
		temp_replace_txt = "<!--s" + replace_txt.substring(3) + "-->";
		pos = ori_txt_lowerC.indexOf(temp_replace_txt);
		if	(pos > -1){
			temp_replace_txt = "<!--e" + replace_txt.substring(3) + "-->";
			pos2 = ori_txt_lowerC.indexOf(temp_replace_txt, pos);
			if	(pos2 > -1){
				if (replace_value == ""){replace_value = "&nbsp;";}
				pos2 = pos2 + temp_replace_txt.length;
				rnt_str = rnt_str.substring(0, pos) + replace_value +
				rnt_str.substring(pos2 , rnt_str.length);
			}
		}
	}
	else if (name_prefix == "d_"){
		var d_cnt = -1;
		var endSearch = false;
		var temp_str = "";
		var temp_str2 = "";
		var pos_selected = -1;
		defVal = "";
		var str_selected = " selected ";
		pos = ori_txt_lowerC.indexOf(temp_replace_txt);
		pos2 = ori_txt_lowerC.indexOf("</select", pos);
		temp_str = ori_txt_lowerC.substring(pos, pos2);
		temp_str2 = rnt_str.substring(pos, pos2);
		pos4 = pos;
		if	(pos > -1){
			do{
				d_cnt ++;
				ori_txt_lowerC = rnt_str.toLowerCase();
				pos3 = ori_txt_lowerC.indexOf("<option", pos4);
				// check (pos3 < pos2) is to ensure that the 'option' tag is in this 'select' tag
				if (pos3 > -1 && pos3 < pos2){
					pos4 = ori_txt_lowerC.indexOf(">", pos3);
					// find the default selected value of the dropdown obj
					pos_selected = ori_txt_lowerC.lastIndexOf(str_selected, pos4);
					// to prevent to search the  'selected' HTML text of	previous 'option' tag
					if (pos_selected < pos3){pos_selected = -1;}
					//alert("d_cnt=" + d_cnt	 +"  "+ pos_selected )
					pos5 = ori_txt_lowerC.lastIndexOf( " value" , pos4);
					pos5 = ori_txt_lowerC.indexOf( "=", pos5);
					pos5 = ori_txt_lowerC.indexOf( '"', pos5);
					pos6 = ori_txt_lowerC.indexOf( '"', pos5 + 1);
					compare_value = rnt_str.substring(pos5 + 1, pos6);
					//alert("replace_value=" + replace_value)
					if (replace_value != ""){
						if (compare_value.toLowerCase() != replace_value.toLowerCase() && pos_selected > -1){
							// delete the 'selected' HTML text
							rnt_str = rnt_str.substring(0, pos_selected) +	"  " +
							rnt_str.slice(pos_selected + str_selected.length);
							pos4	= pos4 - str_selected.length;
							//alert("after delete selected = " + rnt_str)
						}
						else if (compare_value.toLowerCase() == replace_value.toLowerCase() &&	pos_selected == -1){
							// add the 'selected' to HTML text
							rnt_str = rnt_str.substring(0, pos3 + 7) +	str_selected +
							rnt_str.slice(pos3 + 7);
							pos4	= pos4 + str_selected.length;
							//alert("after add selected = " + rnt_str)
						}
					}
					else if (replace_value == "" && pos_selected > -1){
						defVal = compare_value;
						//alert("defVal=" + defVal)
						break;
					}
				}
				else{endSearch = true;}
			}while (endSearch == false)
			/*
					 Add default value plus "~~~" at the beginning of the return string
						for updating data string array
			 */

			 if (defVal != ""){defVal = defVal + "~~~";}
			rnt_str = defVal +	rnt_str.substring(0, pos) +
			temp_insert_txt  +	temp_insert_event +
			rnt_str.slice(pos + temp_replace_txt.length  , rnt_str.length);
			//alert(rnt_str)
		}
/********* the following codes are reserved for use in future
		var opt_idx = 0
		optAr = replace_value.split(sObj.delim_opt)
		var insert_opt_text = ""
		var insert_disp_text = null
		for (opt_idx = 0; opt_idx < optAr.length; opt_idx ++){
			insert_disp_text = optAr[opt_idx].split(sObj.delim_disp)
			if (insert_disp_text[1] == null){ insert_disp_text[1] = insert_disp_text[0] }
			if (opt_idx == 0){insert_opt_text  = '<option selected value="'+ insert_disp_text[1] + '"> ' + insert_disp_text[0] + '</option>'}
			else {insert_opt_text  += '<option	value="'+ insert_disp_text[1] + '">' + insert_disp_text[0] + '</option>'}
		}
		pos = ori_txt_lowerC.indexOf(temp_replace_txt)
		pos2 = ori_txt_lowerC.indexOf(">", pos)
		pos3 = ori_txt_lowerC.indexOf("<", pos2)
		pos4 = ori_txt_lowerC.indexOf(">", pos3)
		pos4 = ori_txt_lowerC.indexOf(">", pos4 + 1)
		//	if any option tag found, replace it
		if (ori_txt_lowerC.substring(pos3, pos4).substring(0, 7) == "<option"){
			dum_opt_len = pos4 - pos3 + 1
		}
		else{dum_opt_len = 0}
		if	(pos > -1){
			rnt_str = rnt_str.substring(0, pos) +
			temp_insert_txt  +
			rnt_str.substring(pos + temp_replace_txt.length, pos2 + 1) +
			 insert_opt_text +
			rnt_str.slice(pos2 + 1+ dum_opt_len , rnt_str.length)
			ori_txt_lowerC = rnt_str.toLowerCase()
		}
************************************************/
	}
	else if (name_prefix == "c_"){
		if (replace_value.toLowerCase() == "y") {
			temp_insert_value = " checked ";
		}
		else {temp_insert_value = "";}
		pos = ori_txt_lowerC.indexOf(temp_replace_txt);
		if	(pos > -1){
			rnt_str = rnt_str.substring(0, pos) +
			temp_insert_txt  +	temp_insert_value + temp_insert_event_onclick +
			rnt_str.slice(pos + temp_replace_txt.length  , rnt_str.length);
		}
	}
		else if (name_prefix == "r_"){
		 pos = ori_txt_lowerC.indexOf(temp_replace_txt);
		 defVal = "";
		 var pos_checked = -1;
		 var str_checked = " checked ";
		 while(pos > -1 ){
			pos1 = ori_txt_lowerC.indexOf(">", pos);
			pos2 = ori_txt_lowerC.lastIndexOf("<", pos1);
			pos_checked = ori_txt_lowerC.lastIndexOf(str_checked, pos1);
			if (pos_checked < pos2){pos_checked = -1;}
			pos3 = ori_txt_lowerC.lastIndexOf( " value", pos1);
			pos3 = ori_txt_lowerC.indexOf( "=", pos3);
			pos3 = ori_txt_lowerC.indexOf( '"', pos3);
			pos4 = ori_txt_lowerC.indexOf( '"', pos3 + 1);
			compare_value = rnt_str.substring(pos3 + 1, pos4);
			if (replace_value != ""){
				if (compare_value.toLowerCase() != replace_value.toLowerCase() && pos_checked > -1){
					// delete the 'checked' HTML text
					rnt_str = rnt_str.substring(0, pos_checked) +  "	" +
					rnt_str.slice(pos_checked + str_checked.length);
				}
				else if (compare_value.toLowerCase() == replace_value.toLowerCase() &&	pos_checked == -1){
					// add the 'selected' to HTML text
					rnt_str = rnt_str.substring(0, pos + temp_replace_txt.length ) +	str_checked +
					rnt_str.slice(pos + temp_replace_txt.length);
				}
			 }
			 else if (replace_value == "" && pos_checked > -1){
				defVal = compare_value;
			}
			rnt_str =  rnt_str.substring(0, pos) +
			temp_insert_txt  + temp_insert_event_onclick +
			rnt_str.slice(pos + temp_replace_txt.length  , rnt_str.length);
			//alert("END :	" + rnt_str)
			ori_txt_lowerC = rnt_str.toLowerCase();
			pos = ori_txt_lowerC.indexOf(temp_replace_txt , pos + temp_insert_txt.length + temp_insert_event.length );

		}
		/***
				 Add default value plus "~~~" at the beginning of the return string
					for updating data string array
		 ***/
		 if (defVal != ""){defVal = defVal + "~~~";}
		 rnt_str = defVal +  rnt_str;

		 /***********Reserve for future rollback use, may be*************
		while(pos > -1 ){
			pos1 = ori_txt_lowerC.indexOf(">", pos)
			pos2 = ori_txt_lowerC.lastIndexOf("<", pos1)
			temp_str = ori_txt_lowerC.substring(pos2, pos1)
			temp_str2 = rnt_str.substring(pos2, pos1)
			if ( temp_str.indexOf(" checked ") > -1 && defVal == ""){
				// find the default checked value of the radio button obj
				pos2 = temp_str.indexOf( " value")
				pos2 = temp_str.indexOf( "=", pos2)
				pos2 = temp_str.indexOf( '"', pos2)
				pos3 = temp_str.indexOf( '"', pos2 + 1)
				defVal = temp_str2.substring(pos2 + 1, pos3)
			 }
			rnt_str =  rnt_str.substring(0, pos) +
			temp_insert_txt  + temp_insert_event +
			rnt_str.slice(pos + temp_replace_txt.length  , rnt_str.length)
			ori_txt_lowerC = rnt_str.toLowerCase()
			pos = ori_txt_lowerC.indexOf(temp_replace_txt , pos + temp_insert_txt.length + temp_insert_event.length )
		}
		*******************************************************/


/********* the following codes are reserved for use in future
		var opt_idx = 0
		 optAr = replace_value.split(sObj.delim_opt)
		// alert("length="+ optAr.length)
		 pos = ori_txt_lowerC.indexOf(temp_replace_txt)
		for (opt_idx = 0; opt_idx < optAr.length; opt_idx ++){
			if	(pos > -1){
				temp_insert_value = ' value="'+ optAr[opt_idx] + ' '
				rnt_str = rnt_str.substring(0, pos) +
				temp_insert_txt  +	temp_insert_value +
				rnt_str.slice(pos + temp_replace_txt.length  , rnt_str.length)
				ori_txt_lowerC = rnt_str.toLowerCase()
				pos = ori_txt_lowerC.indexOf(temp_replace_txt , pos + temp_insert_txt.length + temp_insert_value.length)
			}
		}
***********************************************/
	}
	else if (name_prefix == "b_"){
		pos = ori_txt_lowerC.indexOf(temp_replace_txt);
		if	(pos > -1){
			rnt_str = rnt_str.substring(0, pos) +
			temp_insert_txt  +
			rnt_str.slice(pos + temp_replace_txt.length  , rnt_str.length);
		}
	}
	else if (name_prefix == "s_"){
		pos = ori_txt_lowerC.indexOf(temp_replace_txt);
		if	(pos > -1){
			pos1 =	 ori_txt_lowerC.indexOf(">", pos);
			rnt_str = rnt_str.substring(0, pos) +
			temp_insert_txt 	+  temp_insert_event +
			rnt_str.substring(pos + temp_replace_txt.length ,  pos1 + 1) +
			replace_value +
			rnt_str.slice( pos1 + 1 , rnt_str.length);
		}
	}
	else {

		pos = ori_txt_lowerC.indexOf(temp_replace_txt);
		if	(pos > -1){
			rnt_str = rnt_str.substring(0, pos) +
			temp_insert_txt  +	temp_insert_value + temp_insert_event +
			rnt_str.slice(pos + temp_replace_txt.length  , rnt_str.length);
		}
		//alert("pos = " + pos + "		 " + temp_replace_txt + "**********\n" +	rnt_str)
	}

	return rnt_str;
}




/***********************************************************************
	- Function Name : displayGrid

	- Purpose:	This function is for displaying grid table and merging data to it

 - Arguments:  htmlText1 = variable name contains text of HTML structure
				 GridData = name of  hidden element object contain the data string
				 form_name = name of form at which the grid table locate

***********************************************************************/

function displayGrid(htmlText, GridData, form_name)
{
	var pos1;
	var pos2;
	var o_type = '';
	var detail_row = '';
	var html_1st_half = '';
	var html_2st_half = '';
	var disp_value = '';
	var data_value = '';
	var row = '';
	var name_prefix = "";
	var defVal = "";

//	alert('a');

	rowStr_array = new Array();
	colStr_array = new Array();
	oriColStr_array = new Array();
	dataRow_array = new Array();
	objName_array = new Array();

	var form = document.forms[form_name];

	if (typeof document.forms[form_name] == "undefined"){
		alert("System Error occurred, the form name does not exist.");
		return false;
	}
//<
	// diable form reset and submit function of form to prevent user from clear all value in the form
	form.onreset = disableReset;
	form.onsubmit = disableReset;

//	sets form index to previous value + 1
	sObj.CurFormIdx ++;
	var formIdx = sObj.CurFormIdx;

//		 obtains delimitors
			var del_row = sObj.delim_row; // row level delimited
	var del_col = sObj.delim_col; // column level delimited
	var del_opt = sObj.delim_opt; // option values level delimited
	var del_disp = sObj.delim_disp; // display and data values level delimited
//		 change incoming html text to all lowercase in a temporary string xxxx_lowerC
	var htmlText_lowerC = htmlText.toLowerCase();
// obtain the object names for all elements of this screen from GridData string
	dataRow_array = getDataArray(form.elements[GridData].value, del_row);
	objName_array = getDataArray(dataRow_array[0].toLowerCase(), del_col);

// this array stores the index and locations of all objects in the incoming data form
//>
// kk repeats from 0 for each new form that comes in
// objPropAr builds on and its length increases as the second and third form comes in
// and so is the validation rule ValAr
// objvalar is validation for one object only
//alert ("obj length = " + objName_array.length)


	for (var kk = 0; kk < objName_array.length; kk++) {
				 // ObjPropAr contains :	ObjPropAr[rowNo][0] =object name
				 // 	ObjPropAr[rowNo][1] = form index
				 // 	ObjPropAr[rowNo][2] = data string name
				 // 	ObjPropAr[rowNo][3] = column key
				 // 	ObjPropAr[rowNo][4] = form name
				 sObj.ObjPropAr[sObj.ObjPropAr.length] = [objName_array[kk], formIdx, GridData, kk, form_name];
				 var ValString = getValString (htmlText, objName_array[kk]);
				 //locate validation rules here
				 tempVAr = new Array();
				 tempVAr = getDataArray(ValString , sObj.v_rule_delim);
				 // subtract 1 from valindex to ensure that ValAr index is the same as PropAr
				 var valindex = sObj.ObjPropAr.length - 1;
				 sObj.ObjValAr [valindex] =  tempVAr;
				 tempVAr = null;
	}

	if (dataRow_array.length > 2	|| dataRow_array.length == 1){	 // more than two rows of data	means multi-lines grid table
		// *********** get the detail row ******************
		for (var n_idx = 0; n_idx < objName_array.length; n_idx ++){
			pos1 = htmlText_lowerC.indexOf(objName_array[n_idx]);
			if (pos1 > -1){
				pos2 = htmlText_lowerC.lastIndexOf("<tr>", pos1);
				pos1 = htmlText_lowerC.indexOf("</tr>", pos2);
				if (pos2 > -1 && pos1 > -1){
					detail_row = htmlText.substring(pos2, pos1 + 5);
					html_1st_half = htmlText.substring(0, pos2);
					html_2st_half = htmlText.substring(pos1 + 5, htmlText.length);
					break;
				}
			}
		}
		//	**************************************************

		document.write(html_1st_half);
	}
	else if (dataRow_array.length == 2){detail_row = htmlText;} // only two rows means free form table (the first row contains object names only)
	else {
		alert("System Error occurred, invalid data string format");
	}

	// *********** duplicate the detail lines to document with different object names  **********************
	//			 (concat two underscores and a row number at the end of the names )
	tempAr = new Array();
	temp2Ar = new Array();
	tempODAr = new Array();

	for (var row_idx = 0; row_idx < dataRow_array.length; row_idx ++)
	// since row _idx = 0 stores only the object names
	{
		rowStr_array[row_idx] = detail_row;
		colStr_array = getDataArray(dataRow_array[row_idx], del_col);
		oriColStr_array = getDataArray(dataRow_array[row_idx], del_col);
		tempZeroAr = new Array();
		if (row_idx > 0) {
			for (var name_idx = 0; name_idx < objName_array.length; name_idx ++)
			{
				if (objName_array.length != colStr_array.length){
					alert("System Error occurred \nThe number of columns at data row no." + row_idx + " is not equal to that of object names.");
					break;
				}
				//replace text here !!!

				//document.write rowStr_array[row_idx]

				rowStr_array[row_idx] =  replaceText(rowStr_array[row_idx],
						objName_array[name_idx], objName_array[name_idx]	+ "__" + row_idx,
						colStr_array[name_idx]);

				name_prefix = objName_array[name_idx].substring(0, 2);
				if (name_prefix == "d_" || name_prefix == "r_"){
					pos1 = rowStr_array[row_idx].indexOf("~~~");
					if (pos1 > -1){
						defVal = rowStr_array[row_idx].substring(0, pos1);
						rowStr_array[row_idx] = rowStr_array[row_idx].substring(pos1 + 3);
						colStr_array[name_idx] = defVal;
						//oriColStr_array[name_idx] = defVal
						tempZeroAr [name_idx] = 1;
					}
					else{tempZeroAr [name_idx] = 0;}
				}
				else{tempZeroAr [name_idx] = 0;}
			}
			//alert(rowStr_array[row_idx])
			row += rowStr_array[row_idx];
		}
		else {tempZeroAr = objName_array;} // row_idx = 0
		tempAr [row_idx] = colStr_array;
		tempODAr[row_idx] = oriColStr_array;
		temp2Ar [row_idx] = tempZeroAr;
		tempZeroAr = null;
	}

	// *********************************************************************
	document.write(row);

	if (dataRow_array.length > 2	|| dataRow_array.length == 1){	 // more then two rows of data	implies multi-lines grid table
		document.write(html_2st_half);
	}

	// *** prepare 2-D details of data array for submission ***/
	sObj.DatAr [formIdx] = tempAr;
	sObj.OriDatAr [formIdx] = tempODAr;
	sObj.ModAr [formIdx] = temp2Ar;
	tempAr = null;
	temp2Ar =null;

	return true;
}


// this function is to disable form reset function of form in order to prevent user
// from clearing all value in the form
function disableReset(){
	return false;
}


// // Trap the key command default action of browser
function keyStrokeHandler(e){
	e = transEventObj(e);

	var sourceElement = getSrcElement(e);
	var key = getKeyCode(e);

	var elementType = "";
	var objName = "";
	if (typeof sourceElement == "object"){
		elementType = sourceElement.type;
		objName = sourceElement.name;
	}

	if (key ==	13){ // enter key (implement the default button)
		if (sObj.isIE){
			defButton = sObj.defaultButton;
			//var buttonObj = document.forms["buttonBar"].elements[defButton]
			var buttonObj = document.all[defButton];
			if (typeof defButton != "undefined" && defButton != ""
				 && elementType != "button"
				 && typeof buttonObj != "undefined" ){
				if (typeof objName != "undefined" && objName.indexOf("__") > -1&& getLoc(objName) != null){
					var rnt_handler = true;
					if (elementType != "checkbox" && elementType != ""){
						rnt_handler = changeHandler(e);
					}
					if (rnt_handler){
						buttonObj.click();
					}
				}
				else {
					buttonObj.click();
				}
				if (sObj.isIE){
					e.cancelBubble = true;
				}
			}
		}
	}
//	else if (key ==  39 || key == 37){ // left and right arrow key plus alt key (prevent forward
//		if (sObj.isIE){
//			if (e.altKey == true){
//				// alert message must be triggered	in order to block the default event action
//				showMessages("A010096", "",""); //This key command does not function for this system")
//				event.cancelBubble = true;
//				event.returnValue = false;
//				return false;
//			}
//		}
//	}
	else if (key ==  8){	// backspace key
		if (sObj.isIE){
			if (elementType != "text" && elementType != "textarea" && elementType != "password" ){
				window.scrollTo(0,0);
				event.cancelBubble = true;
				event.returnValue = false;
				return false;
			}
		}
	}
	else if (key ==  27 || key == 112 || key == 113 || key == 114 || key == 115 || key == 116|| key == 117	|| key == 118|| key == 119 ||key == 120 ||key == 121 || key == 122 || key == 123){	 // 27=escape , function key from F1 to F12(112 - 123)
		if (sObj.isIE){ // alter the key stroke to control key
			e.keyCode = 17;
			e.cancelBubble = true;
			e.returnValue = false;
			return false;
		}
	}
	return true;
}

//////////////////////////////////////////////////////////////////

// for netscape only
function handleResize(e){
	 location.reload();
}

//////////////////////////////////////////////////////////////////
function setDefaultButton(btnName){
	if (sObj.defaultButton != "undefined"){
		sObj.defaultButton = btnName;
	}
}
//////////////////////////////////////////////////////////////////
if (sObj.isNAV){
	//document.captureEvents(Event.keydown)
	//document.onkeydown = keyStrokeHandler
	window.captureEvents(Event.RESIZE);
	window.onresize = handleResize;
}
else if(sObj.isIE){
	document.onkeydown = keyStrokeHandler;
}

////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////

/* ssVa.js - this script validates forms */

function changeHandler(e){
	var sourceElement = getSrcElement(e);
	if (sourceElement != null){
		implementChangeHandler(sourceElement);
	}
	else{
		alert("System Error Occurred while calling method getSrcElement()");
	}
}

function implementChangeHandler(sourceElement){

	// If data have not changed, no action will be taken.
	if (getData(sourceElement.name) == sourceElement.value){return true;}
	var type = sourceElement.type;
	var rnt_result = true;
	//var val_result = fieldValidate(sourceElement)
	var val_result = fieldValidate(sourceElement);

	if (val_result == true){
		if (type == "checkbox" ){
			if (sourceElement.checked == true){
				if (setArData(sourceElement.name, "y") == false){rnt_result = false;}
			}
			else{
				if (setArData(sourceElement.name, "n") == false){rnt_result = false;}
			}
		}
		else if (type == "radio"){
			if (sourceElement.checked == true){
				if (setArData(sourceElement.name, sourceElement.value) == false){rnt_result = false;}
			}
		}
		else if (type == "select-one"){
			if (setArData(sourceElement.name, sourceElement.options[sourceElement.selectedIndex].value)
					 == false){rnt_result = false;}
		}
		else if(type == "textarea"){
			if (setArData(sourceElement.name, sourceElement.value) == false){rnt_result = false;}
		}
		else {
			if (setArData(sourceElement.name, sourceElement.value) == false){rnt_result = false;}
		}

		if (rnt_result == false){
			alert("System Error Occurred while setting data to Array");
			return false;
		}
	}
	else if (val_result == null){
		return true;
	}
	else {
		if (sObj.isIE){
//	Commented by Sunny Tam, due to error occurs
//			e.cancelBubble = true
//			e.returnValue = false
		}
		return false;
	}

	return true;
}

////////////////////
function fieldValidate(sourceElement){
//function fieldValidate(sourceElement){
//perform minimum validation based on validation rules
// use ^CF(validation argument) to call additional screen specific validations
//e.g.	 CallFunction(sourceElement, "check phone number")
//			......
//	 CallFunction (sourceElement, validation_argument)
//		if validation_argument == "check phone number" {
//		. . . validation rules here . . .
//				 return true if validation ok
//		or if failed validatoin, setfocus (sourceElement)
//		 by the following code :		event.returnValue = false ??

// and ends with the end of the name

/********/
	var objname = "";
	var ValIsCallFct = "cf";
	var ValIsProtect = "pr"; // protected and disallow changing data
	var ValIsReq = "rq";
	var ValIsRange = "rn";
	var ValIsInt = "in";
	var ValIsDec = "de";	// decimal
	var ValIsDate = "dt";
	var ValIsDGTN = "dgtn";
	var ValIsDGEN = "dgen";
	var ValIsDLTN = "dltn";
	var ValIsDLEN = "dlen";
	var ValIsTGTN = "tgtn";
	var ValIsTGEN = "tgen";
	var ValIsTLTN = "tltn";
	var ValIsTLEN = "tlen";
	var ValIsTime = "t";
	var ValIsDatetime = "dl";
	var ValIsMaxLength = "xl";
	var ValIsMinLength = "ml";
	var ValIsLE = "le";  // less than equal to
	var ValIsLT = "lt";
	var ValIsGE = "ge";
	var ValIsGT = "gt";
	var ValIsEQ = "eq";
	var ValIsOr = "or"; // immediately after this, other operators
	var ValIPhone = "sgpphone";

	var v_type = "";
	var v_subval_delim = ",";
	var rnt_result = true;
	var more_message = "";
	var msg_code_add = "";
	var newval = "";
	var param1 = "";
	var param2 = "";
	var v_param = "";
	var v_param_add = "";
	var call_function = "";
	//var sourceElement = getSrcElement(e)

	newval = rtrim(newval);
	objname = sourceElement.name;
	tempAr = new Array();
	tempAr = getLoc(objname);
	if (tempAr == null){return false;}
	var formkey =  tempAr[0];
	var rowno = tempAr[1];
	var colno = tempAr[2];
	var objidx = tempAr[3];
	tempAr = null;
	if (sourceElement.type == "checkbox") {
		if (sourceElement.checked == true){
			newval = "y";
		}
		else{newval = "n";}

	}
	else {newval = sourceElement.value;}

			//locate validation rules here
			//AT THE NED, CHECK ALL MSG CODE VALUES !!!!!!!!!!!!!!!!!!!!!!!!!!!

			// larry changed the variable mm to start from 1, instead of	0.
			// because the 0 index of  sObj.ObjValAr contains display name, not the rule itself
			var disp_name = sObj.ObjValAr [objidx][0]; // this is the display name of the object to be validated
			for (var mm = 1; mm < sObj.ObjValAr [objidx].length; mm++){
		param1 = "";
		param2 = "";
		vparam = "";
		more_message = "";
		ar_validate = new Array();
		ar_validate = sObj.ObjValAr [objidx][mm].split(v_subval_delim);
		v_type = trim(ar_validate[0]).toLowerCase();

		 if (v_type == ValIsCallFct) {	// if  additional function
			//arg_ar = new Array()
			var  arg_ar = extractFunArg(ar_validate[1]);
			for (var ar_idx = 1; ar_idx < 16; ar_idx ++){
				if (typeof arg_ar[ar_idx] == "undefined"){
					arg_ar[ar_idx]	= null;
				}
			}
			if (typeof fObj != "undefined"){
				//29-Nov-1999 Elaine modify
				// original: more_message = fObj[trim(arg_ar[0])](arg_ar[1],arg_ar[2], arg_ar[3],
				//more_message = fObj[trim(arg_ar[0])](sourceElement,arg_ar[1],arg_ar[2], arg_ar[3],
				more_message = fObj[trim(arg_ar[0])](e,arg_ar[1],arg_ar[2], arg_ar[3],
						arg_ar[4],arg_ar[5], arg_ar[6],
						arg_ar[7],arg_ar[8],arg_ar[9],
						arg_ar[10], arg_ar[11],arg_ar[12],
						arg_ar[13], arg_ar[14], arg_ar[15]);
				if (more_message != ""){
					msg_code = more_message;
				}
			}
		} else if (v_type == ValIsProtect) { // if field protected and disallow changing data
			if ( newval != (sObj.DatAr[formkey][rowno][colno]) ) {
				more_message = "PROTECTED"; // this field is protected
			}
		}
		else if (v_type == ValIsReq){
			// no checking on field validation
//				more_message = require_check(newval)
//				if (more_message != ""){
//					sourceElement.value = sObj.DatAr[formkey][rowno][colno]
//				msg_code = "A010001"
//			}
		}
		else if (v_type == ValIsRange) {	// if field name
			param1 = trim(ar_validate[1]);
			param2 = trim(ar_validate[2]);
			if (newval != ""){more_message = range_check(newval, param1, param2);}
			if (more_message != ""){
				msg_code = "A010105";
				v_param = trim(ar_validate[1]) + " and	" + trim(ar_validate[2]);
			}
		}
		else if (v_type == ValIsInt) {	// if field is integer
			if (newval != ""){
				// added by Stephen Dec 3 1999
				newval = trim(newval);
				sourceElement.value = trim(sourceElement.value);
				more_message = int_check(newval);
			}
			if (more_message != ""){
				msg_code = more_message;
			}
		}
		else if (v_type == ValIsDec) {	// if field is decimal
			var deci_fmt = "";
			if (typeof ar_validate[1] != "undefined" && ar_validate[1] != null && ar_validate[1] != ""){deci_fmt = ar_validate[1];}
			else {deci_fmt = sObj.num_length + "." + sObj.decimal;}
			if (newval != ""){
				// added by Stephen Dec 3 1999
				newval = trim(newval);
				sourceElement.value = trim(sourceElement.value);
				more_message = decimal_check(newval, deci_fmt);
			}
			if (more_message != ""){
				msg_code = more_message;
			}
		}
		else if (v_type == ValIsDate) {  // if date
			var date_fmt = "";
			if (typeof ar_validate[1] != "undefined"){date_fmt = ar_validate[1];}
			else {date_fmt = sObj.fm_date;}
			if (newval != ""){
				// added by Stephen Dec 3 1999
				newval = trim(newval);
				sourceElement.value = trim(sourceElement.value);
				more_message = date_check(newval, date_fmt);
				}
			if (more_message != ""){
				msg_code = "A010003";
				v_param = date_fmt;
			}
		}
		else if (v_type == ValIsDGTN) {  // if date
			var date_fmt = "";
			if (typeof ar_validate[1] != "undefined"){date_fmt = ar_validate[1];}
			else {date_fmt = sObj.fm_date;}
			if (newval != ""){
				// added by Stephen Dec 3 1999
				newval = trim(newval);
				sourceElement.value = trim(sourceElement.value);
				more_message = DGTN_check(newval, date_fmt);
			}
			if (more_message != ""){
				msg_code = "A010110";
			}
		}
		else if (v_type == ValIsDGEN) {  // if date
			var date_fmt = "";
			if (typeof ar_validate[1] != "undefined"){date_fmt = ar_validate[1];}
			else {date_fmt = sObj.fm_date;}
			if (newval != ""){
				// added by Stephen Dec 3 1999
				newval = trim(newval);
				sourceElement.value = trim(sourceElement.value);
				more_message = DGEN_check(newval, date_fmt);
			}
			if (more_message != ""){
				msg_code = "A010112";
			}
		}
		else if (v_type == ValIsDLTN) {  // if date
			var date_fmt = "";
			if (typeof ar_validate[1] != "undefined"){date_fmt = ar_validate[1];}
			else {date_fmt = sObj.fm_date;}
			if (newval != ""){
				// added by Stephen Dec 3 1999
				newval = trim(newval);
				sourceElement.value = trim(sourceElement.value);
				more_message = DLTN_check(newval, date_fmt);
			}
			if (more_message != ""){
				msg_code = "A010111";
				v_param = date_fmt;
			}
		}
		else if (v_type == ValIsDLEN) {  // if date
			var date_fmt = "";
			if (typeof ar_validate[1] != "undefined"){date_fmt = ar_validate[1];}
			else {date_fmt = sObj.fm_date;}
			if (newval != ""){
				// added by Stephen Dec 3 1999
				newval = trim(newval);
				sourceElement.value = trim(sourceElement.value);
				more_message = DLEN_check(newval, date_fmt);
			}
			if (more_message != ""){
				msg_code = "A010113";
				v_param = date_fmt;
			}
		}
		else if (v_type == ValIsTime) {  // if date
			var time_fmt = "";
			if (typeof ar_validate[1] != "undefined"){time_fmt = ar_validate[1];}
			else {time_fmt = sObj.fm_time;}
			if (newval != ""){
				more_message = time_check(newval, time_fmt);
				}
			if (more_message != ""){
				msg_code = "A010008";
				v_param = time_fmt;
			}
		}
		else if (v_type == ValIsTGTN) {  // if date
			var date_fmt = "";
			if (typeof ar_validate[1] != "undefined"){date_fmt = ar_validate[1];}
			else {date_fmt = sObj.fm_date;}
			if (newval != ""){more_message = TGTN_check(newval, date_fmt);}
			if (more_message != ""){
				msg_code = "A010114";
				v_param = date_fmt;
			}
		}
		else if (v_type == ValIsTGEN) {  // if date
			var date_fmt = "";
			if (typeof ar_validate[1] != "undefined"){date_fmt = ar_validate[1];}
			else {date_fmt = sObj.fm_date;}
			if (newval != ""){more_message = TGEN_check(newval, date_fmt);}
			if (more_message != ""){
				msg_code = "A010116";
				v_param = date_fmt;
			}
		}
		else if (v_type == ValIsTLTN) {  // if date
			var date_fmt = "";
			if (typeof ar_validate[1] != "undefined"){date_fmt = ar_validate[1];}
			else {date_fmt = sObj.fm_date;}
			if (newval != ""){more_message = TLTN_check(newval, date_fmt);}
			if (more_message != ""){
				msg_code = "A010115";
				v_param = date_fmt;
			}
		}
		else if (v_type == ValIsTLEN) {  // if date
			var date_fmt = "";
			if (typeof ar_validate[1] != "undefined"){date_fmt = ar_validate[1];}
			else {date_fmt = sObj.fm_date;}
			if (newval != ""){more_message = TLEN_check(newval, date_fmt);}
			if (more_message != ""){
				msg_code = "A010117";
				v_param = date_fmt;
			}
		}

		else if (v_type == ValIsDatetime) {  // if datetime
			var datetime_fmt = "";
			if (typeof ar_validate[1] != "undefined"){datetime_fmt = ar_validate[1];}
			else {datetime_fmt = sObj.fm_date + " " + sObj.fm_time;}
			if (newval != ""){more_message = datetime_check(newval, datetime_fmt);}
			if (more_message != ""){
				msg_code = "A010009";
				v_param = datetime_fmt;
			}
		}
		else if (v_type == ValIPhone) {
			if (newval != ""){more_message = SGPPhone_check(newval);}
			if (more_message != ""){
				msg_code = "A010010";
			}
		}
		else if (v_type == ValIsMaxLength) {	// if date
			if (typeof ar_validate[1] != "undefined"){v_param = ar_validate[1];}
			more_message = max_length_check(newval, v_param);
			if (more_message != ""){
				msg_code = "A010106";
			}
		}
		else if (v_type == ValIsLE) {  // if date
			if (typeof ar_validate[1] != "undefined"){v_param = ar_validate[1];}
			if (newval != ""){more_message = LE_check(newval, v_param);}
			if (more_message != ""){
				msg_code = "A010104";
			}
		}
		else if (v_type == ValIsLT) {  // if date
			if (typeof ar_validate[1] != "undefined"){v_param = ar_validate[1];}
			if (newval != ""){more_message = LT_check(newval, v_param);}
			if (more_message != ""){
				msg_code = "A010101";
			}
		}
		else if (v_type == ValIsGE) {  // if date
			if (typeof ar_validate[1] != "undefined"){v_param = ar_validate[1];}
			if (newval != ""){more_message = GE_check(newval, v_param);}
			if (more_message != ""){
				msg_code = "A010103";
			}
		}
		else if (v_type == ValIsGT) {  // if date
			//alert("newval" + newval)
			if (typeof ar_validate[1] != "undefined"){v_param = ar_validate[1];}
			if (newval != ""){more_message = GT_check(newval, v_param);}
			if (more_message != ""){
				msg_code = "A010100";
			}
		}
		else if (v_type == ValIsEQ) {  // if date
			if (typeof ar_validate[1] != "undefined"){v_param = ar_validate[1];}
			if (newval != ""){more_message = EQ_check(newval, v_param);}
			if (more_message != ""){
				msg_code = "A010102";
			}
		}
		// immediately after this, other operators
		else if (v_type == ValIsOr) {  // if date
			if (newval != ""){more_message = OR_check(newval);}
			if (more_message != ""){
				msg_code = more_message;
			}
		}
		else {
			alert ("Validation Rule error - type not supported : " + v_type);
		}
		ar_validate = null;
		if (more_message == null ){
			rnt_result = null;
			break;
		}
		else if (more_message == "SYSTEM ERROR" ){ // come across system error
			//	IMPORTANT  ----------- change this line to system error code!!!!!!!!!!!!!
			//alert ("SYSTEM ERROR")
			showMessages("A010004", disp_name, v_param);
			rnt_result = null;
			break;
			//showmessage but let field passes through
		}
		else if (more_message == "PROTECTED" ){ // come across system error
			if (sourceElement.type == "checkbox") {
				if (sObj.DatAr[formkey][rowno][colno].toLoweCase() == "y"){
					sourceElement.checked = true;
				}
				else{sourceElement.checked = false;}

			}
			else {sourceElement.value = sObj.DatAr[formkey][rowno][colno];}
			//alert ("This field is protected." )
			showMessages("A010108", disp_name, v_param);
			rnt_result = null;
			break;
		}
		else if (more_message != ""){ // come across validation errors
			rnt_result = false;

			if (more_message.toUpperCase() != "NOMESSAGE"){
				showMessages(msg_code, disp_name, v_param);
			}
			if (sourceElement.type == "text" || sourceElement.type == "textarea"|| sourceElement.type == "password" ){
				sourceElement.focus();
				sourceElement.select();
			}

			break;
		}

	} 	// end for loop

		return rnt_result;

}
////////////////////////
function require_check(inputStr){
	var msg_addition = "";
	if ( isBlank(inputStr) ) {
		msg_addition = "err";
	}
	else {
		msg_addition = "";
	}

	return (msg_addition);
}
function int_check(inputStr){
	var msg_addition = "";
	var numlength = sObj.num_length;
	for (var c = 0; c < inputStr.length; c++){
		var oneChar = inputStr.charAt(c);
		if (c == 0	&& oneChar == "-" && inputStr.length > 1){
			continue;
		}
		if (oneChar < "0" || oneChar > "9"){
			msg_addition = "A010007";
			break;
		}
	}
	if (msg_addition == "" && inputStr.length > numlength)	{
		msg_addition = "A010012";
	}
	return(msg_addition);
}

function decimal_check(inputStr, deci_fmt){
	var msg_addition = "";
	var inStrDot = inputStr.indexOf(".");
	var numlength = 0;
	var numdec =0;

	if (deci_fmt == null || deci_fmt == "") {
		numlength = sObj.num_length;
		numdec = sObj.decimal;
	}
	else {
		numlength = deci_fmt.substring(0,deci_fmt.indexOf("."));
		numdec = deci_fmt.substring(deci_fmt.indexOf(".")+1,deci_fmt.length);
	}

	if (isNaN(Number(inputStr))){msg_addition = "A010002";}
	else if (inStrDot == 0 || inStrDot+1 == inputStr.length) {
		msg_addition = "A010012";
	}
	else {
		if (inputStr.length > numlength) {
			msg_addition = "A010012";
		}
		else if ((inStrDot != -1) && (inputStr.length-1-inStrDot > numdec)){
			msg_addition = "A010012";
		}
	}
	return(msg_addition);
}
function range_check(inputStr, param1, param2){
	var msg_addition = "";
	if (Number(inputStr) < Number(param1) || Number(inputStr) > Number(param2)){return "err";}
	return(msg_addition);
}

function max_length_check(inputStr, param){
	var msg_addition = "";
	if (inputStr.length > param){return "err";}
	return(msg_addition);
}

function GE_check(inputStr, param){
	var msg_addition = "";
	if (Number(inputStr) < Number(param)){return "err";}
	return(msg_addition);
}
function GT_check(inputStr, param){
	var msg_addition = "";
	if ( Number(inputStr) <= Number(param) ){return "err";}
	return(msg_addition);
}
function LE_check(inputStr, param){
	var msg_addition = "";
	if (Number(inputStr) > Number(param)){return "err";}
	return(msg_addition);
}
function LT_check(inputStr, param){
	var msg_addition = "";
	if (Number(inputStr) >= Number(param)){return "err";}
	return(msg_addition);
}
function EQ_check(inputStr, param){
	var msg_addition = "";
	if (Number(inputStr) != Number(param)){return "err";}
	return(msg_addition);
}
function OR_check(inputStr){
	alert ("stub for OR validation");
	var msg_addition = "";
	return(msg_addition);
}

function SGPPhone_check(phoneNo){
	// rule :  if phone no. is 8 digit, the first digit must be 9
	//				if phone no. is 7 digit, every combination except the first digit of	9
	var len = phoneNo.length;
	phoneValue = Number(phoneNo);
	if (!(len == 7 &&  phoneValue >=	0 && phoneValue <= 8999999 )
	 &&  ! (len == 8 &&  phoneValue >=	90000000 && phoneValue <=  99999999 )){
		return "err";
	}
	return "";

}
//////////////////////////////////////////////////////////////////
//	 function: rangeOverlapping_check
//	 Arguments : start1 to end1 is the 1st range
//		 start2 to end2 is the 2nd range
//		 The type of arguments should be all NUMBER or all CHAR
//////////////////////////////////////////////////////////////////
function rangeOverlapping_check(start1, end1, start2, end2){
	var rntValue = "";
	if (start2 < end1 && start2 >= start1){rntValue = "err";}
	else if (end2 > start1 && end2 <= end1){rntValue = "err";}
	else if (start2 <= start1 && end2 >= end1){rntValue = "err";}

	return rntValue;
}

function get_date_part(f_str, d_str){
	var s_rtn = "";
	f_str = f_str.toUpperCase();
	if (d_str == "" || isInteger(d_str) == "false" || d_str < 1) {s_rtn = "";}
	else if (f_str.indexOf("M") > -1){
		if (d_str.length > 2) {s_rtn = "";}
		else {s_rtn = "M";}
	}
	else if (f_str.indexOf("D") > -1){
		if (d_str.length > 2) {s_rtn = "";}
		else {s_rtn = "D";}
	}
	else if (f_str.indexOf("Y") > -1){
		if ((f_str.length == 4 && d_str.length == 4) || (f_str.length == 2 && d_str.length == 2)){
			s_rtn = "Y";
		}
		else {s_rtn = "";}
	}
	return s_rtn;
}

function get_time_part(f_str, t_str){
	var s_rtn = "";
	f_str = f_str.toUpperCase();
	if (t_str == "" || isInteger(t_str) == "false" || t_str < 0) {s_rtn = "";}
	else if (f_str.indexOf("H") > -1){
		if (t_str.length > 2) {s_rtn = "";}
		else {s_rtn = "H";}
	}
	else if (f_str.indexOf("M") > -1){
		if (t_str.length > 2) {s_rtn = "";}
		else {s_rtn = "M";}
	}
	else if (f_str.indexOf("S") > -1){
		if (t_str.length > 2) {s_rtn = "";}
		else {s_rtn = "S";}
	}
	return s_rtn;
}

function date_check(inputStr, dateFm){
	if (inputStr.length > 0 && inputStr.charAt(0) == " "){return "err";}
	var d_formate = trim(dateFm);
	var sDate = trim(inputStr);
	var sDate_len = sDate.length;
	f_part	 = new Array();
	d_part	 = new Array();
	d_type_p = new Array();
	var d_style;
	var no_of_part;
	var isleapYR = "false";
	var pos_1;
	var pos_2;
	var i_year	= 0;
	var i_month = 0;
	var i_day = 0;
	//if (dateFm == "" || dateFm == null){ d_formate = sObj.fm_date}
	//else {d_formate = dateFm}
	var formate_len = d_formate.length;

  // Added by Dicky on 2007/06/07, P2-0852
  var ls_dateFmDeli = "/";
  if (d_formate.indexOf("-") > -1 )
    ls_dateFmDeli = "-";
  else
    ls_dateFmDeli = "/";
  // End, Added by Dicky on 2007/06/07, P2-0852

	pos_1 = d_formate.indexOf(ls_dateFmDeli);

	if (pos_1 > -1){
		f_part[0] = d_formate.substring(0, pos_1);
		pos_2 = pos_1 + 1;
		pos_1 = d_formate.indexOf(ls_dateFmDeli, pos_2);
		if (pos_1 > -1){
			f_part[1] = d_formate.substring(pos_2, pos_1);
			f_part[2] = d_formate.substring(pos_1 + 1, formate_len);
			d_style = 3;
		}
		else {
			f_part[1] = d_formate.substring(pos_2, formate_len);
			d_style = 2;
		}
	}
	else {
		f_part[0] = d_formate;
		d_style = 1;
	}

	pos_1 = sDate.indexOf(ls_dateFmDeli);
	if (pos_1 > -1){
		d_part[0] = sDate.substring(0, pos_1);
		pos_2 = pos_1 + 1;
		pos_1 = sDate.indexOf(ls_dateFmDeli, pos_2);
		if (pos_1 > -1){
			d_part[1] = sDate.substring(pos_2, pos_1);
			d_part[2] = sDate.substring(pos_1 + 1, sDate_len);
			no_of_part = 3;
		}
		else {
			d_part[1] = sDate.substring(pos_2, sDate_len);
			no_of_part = 2;
		}
	}
	else {
		d_part[0] = sDate;
		no_of_part = 1;
	}

	if (d_style != no_of_part){return ("err");}

	if (d_style == 3){ // year, month and day
		d_type_p[0] = get_date_part(f_part[0], d_part[0]);
		d_type_p[1] = get_date_part(f_part[1], d_part[1]);
		d_type_p[2] = get_date_part(f_part[2], d_part[2]);
		if (d_type_p[0] == "" || d_type_p[1] == "" || d_type_p[2] == "") {return ("err");}
	}
	else if (d_style == 2){ // combination of 2 out of year, month and day
		d_type_p[0] = get_date_part(f_part[0], d_part[0]);
		d_type_p[1] = get_date_part(f_part[1], d_part[1]);
		if (d_type_p[0] == "" || d_type_p[1] == "") {return ("err");}
	}
	else if (d_style == 1){ // only 1 out of year, month and day
		d_type_p[0] = get_date_part(f_part[0], d_part[0]);
		if (d_type_p[0] == "") {return ("err");}
	}
	for (var i = 0; i < d_style; i++){
		if (d_type_p[i] == "Y"){i_year = d_part[i];}
		else if (d_type_p[i] == "M"){i_month = d_part[i];}
		else if (d_type_p[i] == "D"){i_day = d_part[i];}
	}
	if (i_year > 0){
		if (i_year < 100){i_year = i_year + 1900;}
		if (((i_year % 4 == 0) && (i_year % 100 != 0)) || (i_year % 1000 == 0)) {isleapYR = "true";}
	}
	if (i_month > 0){
		if (i_month < 1 || i_month > 12) {return ("err");}
	}
	if (i_day > 0){
		if (i_day > 31) {return ("err");}
		if (i_month > 0){
			if (((i_month <= 7) && (i_month % 2 == 0)) || ((i_month >= 8) && (i_month % 2 > 0))) {
				if (i_day > 30) {return ("err");}
			}
			else if (i_day > 31) {return ("error");}
			if (i_month == 2){
				if (i_day > 29) {return ("err");}
				if (i_year > 0){
					if (isleapYR == "true" && i_day > 29) {return ("err");}
					else if (isleapYR == "false" && i_day > 28) {return ("err");}
				}
			}
		}
	}
	return ("");
}

function time_check(inputStr, dateFm){

	var t_format = trim(dateFm);
	var sTime = trim(inputStr);
	var sTime_len = sTime.length;
	f_part	 = new Array();
	t_part	 = new Array();
	t_type_p = new Array();
	var t_style;
	var no_of_part;
	var pos_1;
	var pos_2;
	var i_hour	= 0;
	var i_minute = 0;
	var i_second	 = 0;
	var format_len = t_format.length;
	var del_time = ":";
	pos_1 = t_format.indexOf(del_time);

	if (pos_1 > -1){
		f_part[0] = t_format.substring(0, pos_1);
		pos_2 = pos_1 + 1;
		pos_1 = t_format.indexOf(del_time, pos_2);
		if (pos_1 > -1){
			f_part[1] = t_format.substring(pos_2, pos_1);
			f_part[2] = t_format.substring(pos_1 + 1, format_len);
			t_style = 3;
		}
		else {
			f_part[1] = t_format.substring(pos_2, format_len);
			t_style = 2;
		}
	}
	else {
		f_part[0] = t_format;
		t_style = 1;
	}

	pos_1 = sTime.indexOf(del_time);
	if (pos_1 > -1){
		t_part[0] = sTime.substring(0, pos_1);
		pos_2 = pos_1 + 1;
		pos_1 = sTime.indexOf(del_time, pos_2);
		if (pos_1 > -1){
			t_part[1] = sTime.substring(pos_2, pos_1);
			t_part[2] = sTime.substring(pos_1 + 1, sTime_len);
			no_of_part = 3;
		}
		else {
			t_part[1] = sTime.substring(pos_2, sTime_len);
			no_of_part = 2;
		}
	}
	else {
		t_part[0] = sTime;
		no_of_part = 1;
	}

	if (t_style != no_of_part){return ("err");}

	if (t_style == 3){ // year, month and day
		t_type_p[0] = get_time_part(f_part[0], t_part[0]);
		t_type_p[1] = get_time_part(f_part[1], t_part[1]);
		t_type_p[2] = get_time_part(f_part[2], t_part[2]);
		if (t_type_p[0] == "" || t_type_p[1] == "" || t_type_p[2] == "") {return ("err");}
	}
	else if (t_style == 2){ // combination of 2 out of year, month and day
		t_type_p[0] = get_time_part(f_part[0], t_part[0]);
		t_type_p[1] = get_time_part(f_part[1], t_part[1]);
		if (t_type_p[0] == "" || t_type_p[1] == "") {return ("err");}
	}
	else if (t_style == 1){ // only 1 out of year, month and day
		t_type_p[0] = get_time_part(f_part[0], t_part[0]);
		if (t_type_p[0] == "") {return ("err");}
	}
	for (var i = 0; i < t_style; i++){
		if (t_type_p[i] == "H"){i_hour = t_part[i];}
		else if (t_type_p[i] == "M"){i_minute = t_part[i];}
		else if (t_type_p[i] == "S"){i_second = t_part[i];}
	}
	if (i_hour < 0 || i_hour > 23){
		return ("err");
	}
	if (i_minute < 0 || i_minute > 59){
		return ("err");
	}
	if (i_second < 0 || i_second > 59){
		return ("err");
	}
	return ("");
}
////////////////////
function datetime_check(inputStr, datetimeFm){
	if (inputStr.length > 0 && inputStr.charAt(0) == " "){return "err";}
	datetimeFm = trim(datetimeFm);
	inputStr = trim(inputStr);
	var pos1 = inputStr.indexOf(" ");
	var pos2 = datetimeFm.indexOf(" ");
	if (pos1 > -1 && pos2 > -1){
		var dStr = trim(inputStr.substring(0,pos1));
		var tStr = trim(inputStr.substring(pos1 + 1, inputStr.length));
		var dFm = trim(datetimeFm.substring(0,pos2));
		var tFm = trim(datetimeFm.substring(pos2 + 1, datetimeFm.length));
		if (date_check(dStr, dFm) != "" || time_check(tStr, tFm) != ""){
			return "err";
		}

	}
	else {return "err";}
	return "";
}
////////////////////
function genDateStr(inputStr, dateFm){
	var d_formate = trim(dateFm);
	var sDate = trim(inputStr);
	var sDate_len = sDate.length;
	f_part	 = new Array();
	d_part	 = new Array();
	d_type_p = new Array();
	var d_style;
	var no_of_part;
	var isleapYR = "false";
	var pos_1;
	var pos_2;
	var i_year	= 0;
	var i_month = 0;
	var i_day = 0;

	var formate_len = d_formate.length;

  // Added by Dicky on 2007/06/07, P2-0852
  var ls_dateFmDeli = "/";
  if (d_formate.indexOf("-") > -1 )
    ls_dateFmDeli = "-";
  else
    ls_dateFmDeli = "/";
  // End, Added by Dicky on 2007/06/07, P2-0852

  pos_1 = d_formate.indexOf(ls_dateFmDeli);

	if (pos_1 > -1){
		f_part[0] = d_formate.substring(0, pos_1);
		pos_2 = pos_1 + 1;
		pos_1 = d_formate.indexOf(ls_dateFmDeli, pos_2);
		if (pos_1 > -1){
			f_part[1] = d_formate.substring(pos_2, pos_1);
			f_part[2] = d_formate.substring(pos_1 + 1, formate_len);
			d_style = 3;
		}
		else {
			f_part[1] = d_formate.substring(pos_2, formate_len);
			d_style = 2;
		}
	}
	else {
		f_part[0] = d_formate;
		d_style = 1;
	}

	pos_1 = sDate.indexOf(ls_dateFmDeli);
	if (pos_1 > -1){
		d_part[0] = sDate.substring(0, pos_1);
		pos_2 = pos_1 + 1;
		pos_1 = sDate.indexOf(ls_dateFmDeli, pos_2);
		if (pos_1 > -1){
			d_part[1] = sDate.substring(pos_2, pos_1);
			d_part[2] = sDate.substring(pos_1 + 1, sDate_len);
			no_of_part = 3;
		}
		else {
			d_part[1] = sDate.substring(pos_2, sDate_len);
			no_of_part = 2;
		}
	}
	else {
		d_part[0] = sDate;
		no_of_part = 1;
	}

	if (d_style == 3){ // year, month and day
		d_type_p[0] = get_date_part(f_part[0], d_part[0]);
		d_type_p[1] = get_date_part(f_part[1], d_part[1]);
		d_type_p[2] = get_date_part(f_part[2], d_part[2]);
		//if (d_type_p[0] == "" || d_type_p[1] == "" || d_type_p[2] == "") {return ("err")}
	}
	else if (d_style == 2){ // combination of 2 out of year, month and day
		d_type_p[0] = get_date_part(f_part[0], d_part[0]);
		d_type_p[1] = get_date_part(f_part[1], d_part[1]);
		//if (d_type_p[0] == "" || d_type_p[1] == "") {return ("err")}
	}
	else if (d_style == 1){ // only 1 out of year, month and day
		d_type_p[0] = get_date_part(f_part[0], d_part[0]);
		//if (d_type_p[0] == "") {return ("err")}
	}
	for (var i = 0; i < d_style; i++){
		if (d_type_p[i] == "Y"){i_year = d_part[i];}
		else if (d_type_p[i] == "M"){i_month = d_part[i];}
		else if (d_type_p[i] == "D"){i_day = d_part[i];}
	}

	i_year = i_year.toString();
	i_month = i_month.toString();
	i_day = i_day.toString();

	if (i_year.length == 1){i_year = "0000";}
	else if (i_year.length == 2){i_year = "00" + i_year;}
	if (i_month.length == 1){i_month	= "0" + i_month;}
	if (i_day.length == 1 ){i_day  = "0" + i_day;}

	return (i_year + i_month + i_day);
}
////////////////////
function genTimeStr(inputStr, TimeFm){
	var t_format = trim(TimeFm);
	var sTime = trim(inputStr);
	var sTime_len = sTime.length;
	f_part	 = new Array();
	t_part	 = new Array();
	t_type_p = new Array();
	var t_style;
	var no_of_part;
	var pos_1;
	var pos_2;
	var i_hour	= 0;
	var i_minute = 0;
	var i_second	 = 0;
	var format_len = t_format.length;
	var del_time = ":";
	pos_1 = t_format.indexOf(del_time);

	if (pos_1 > -1){
		f_part[0] = t_format.substring(0, pos_1);
		pos_2 = pos_1 + 1;
		pos_1 = t_format.indexOf(del_time, pos_2);
		if (pos_1 > -1){
			f_part[1] = t_format.substring(pos_2, pos_1);
			f_part[2] = t_format.substring(pos_1 + 1, format_len);
			t_style = 3;
		}
		else {
			f_part[1] = t_format.substring(pos_2, format_len);
			t_style = 2;
		}
	}
	else {
		f_part[0] = t_format;
		t_style = 1;
	}
	pos_1 = sTime.indexOf(del_time);
	if (pos_1 > -1){
		t_part[0] = sTime.substring(0, pos_1);
		pos_2 = pos_1 + 1;
		pos_1 = sTime.indexOf(del_time, pos_2);
		if (pos_1 > -1){
			t_part[1] = sTime.substring(pos_2, pos_1);
			t_part[2] = sTime.substring(pos_1 + 1, sTime_len);
			no_of_part = 3;
		}
		else {
			t_part[1] = sTime.substring(pos_2, sTime_len);
			no_of_part = 2;
		}
	}
	else {
		t_part[0] = sTime;
		no_of_part = 1;
	}
	if (t_style == 3){ // year, month and day
		t_type_p[0] = get_time_part(f_part[0], t_part[0]);
		t_type_p[1] = get_time_part(f_part[1], t_part[1]);
		t_type_p[2] = get_time_part(f_part[2], t_part[2]);
	}
	else if (t_style == 2){ // combination of 2 out of year, month and day
		t_type_p[0] = get_time_part(f_part[0], t_part[0]);
		t_type_p[1] = get_time_part(f_part[1], t_part[1]);
	}
	else if (t_style == 1){ // only 1 out of year, month and day
		t_type_p[0] = get_time_part(f_part[0], t_part[0]);
	}
	for (var i = 0; i < t_style; i++){
		if (t_type_p[i] == "H"){i_hour = t_part[i];}
		else if (t_type_p[i] == "M"){i_minute = t_part[i];}
		else if (t_type_p[i] == "S"){i_second = t_part[i];}
	}
	i_hour = i_hour.toString();
	i_minute = i_minute.toString();
	i_second = i_second.toString();
	if (i_hour.length == 1){i_hour = "0" + i_hour;}
	if (i_minute.length == 1){i_minute = "0" + i_minute;}
	if (i_second.length == 1){i_second = "0" + i_second;}

	return (i_hour + i_minute + i_second);
}
////////////////////
function genToDateStr(){
	var today = new Date();
	var i_year = today.getFullYear();
	var i_month = today.getMonth() + 1;
	var i_day = today.getDate();
	i_year = i_year.toString();
	i_month = i_month.toString();
	i_day  = i_day.toString();
	if (i_month.length == 1){i_month	= "0" + i_month;}
	if (i_day.length == 1){i_day	= "0" + i_day;}

	return (i_year + i_month + i_day);
}
////////////////////
function genTimeNowStr(){
	var today = new Date();
	var i_hour = today.getHours();
	var i_minute = today.getMinutes();
	var i_second = today.getSeconds();
	i_hour = i_hour.toString();
	i_mimute = i_minute.toString();
	i_second	= i_second.toString();
	if (i_minute.length == 1){i_minute	= "0" + i_minute;}
	if (i_second.length == 1){i_second	= "0" + i_second;}

	return (i_hour + i_minute + i_second);
}
////////////////////
/* function: date_compare
		 Arguments : possible value of relation are  'GT' , 'GE', 'LT',  'LE' and 'EQ'
			 if relation is 'GT', means date1 should be greater than date2
			 if date1 or date2 encapsulates format separated by ","
			 (like '01/01/1999,dd/mm/yyy'), this function will convert the date string
			 according	to the format specified to compare with another one.
			 If not, the system default date format will be used as the format of the date.
*/
function date_compare(date1, date2, relation){
	var rntValue = "";
	var d_1 = date1;
	var d_2 = date2;
	var d_fm1 = sObj.fm_date;
	var d_fm2 = sObj.fm_date;
	var pos1 = date1.indexOf(",");
	var pos2 = date2.indexOf(",");
	if (pos1	> -1){
		d_1 = date1.substring(0, pos1);
		d_fm1 = date1.substring(pos1 + 1, date1.length);
	}
	if (pos2	> -1){
		d_2 = date2.substring(0, pos2);
		d_fm2 = date2.substring(pos2 + 1, date2.length);
	}
	d_1 = genDateStr(d_1, d_fm1);
	d_2 = genDateStr(d_2, d_fm2);
	switch (relation.toUpperCase()){
		case 'GT':
			if (d_1 <= d_2){rntValue = "err";}
			break;
		case 'GE':
			if (d_1 < d_2){rntValue = "err";}
			break;
		case 'LT':
			if (d_1 >= d_2){rntValue = "err";}
			break;
		case 'LE':
			if (d_1 > d_2){rntValue = "err";}
			break;
		case 'EQ':
			if (d_1 != d_2){rntValue = "err";}
			break;
		default:
			rntValue = "";
	}
	return rntValue;

}
////////////////////
/* function: dateTime_compare
		 Arguments : possible value of relation are  'GT' , 'GE', 'LT',  'LE' and 'EQ'
			 if relation is 'GT', means dateTime1 should be greater than dateTime2
			 if dateTime1 or dateTime2 encapsulates format separated by ","
			 (like '01/01/1999 10:20,dd/mm/yyy hh:mm'), this function will convert the date string
			 according to the format specified to compare with another one.
			 If not, the system default date and time format will be used as the format of the dateTime.
*/
function dateTime_compare(dateTime1, dateTime2, relation){
	var rntValue = "";
	var dt_1_ms;
	var dt_2_ms;
	var d_1 = dateTime1;
	var d_2 = dateTime2;
	var d_fm1 = sObj.fm_date +	" " + sObj.fm_time;
	var d_fm2 = sObj.fm_date +	" " + sObj.fm_time;
	var pos1 = d_1.indexOf(",");
	var pos2 = d_2.indexOf(",");
	if (pos1	> -1){
		d_1 = dateTime1.substring(0, pos1);
		d_fm1 = dateTime1.substring(pos1 + 1, dateTime1.length);
	}
	if (pos2	> -1){
		d_2 = dateTime2.substring(0, pos2);
		d_fm2 = dateTime2.substring(pos2 + 1, dateTime2.length);
	}

	dt_1_ms = dateTimeStringToObj(d_1, d_fm1).getTime();
	dt_2_ms = dateTimeStringToObj(d_2, d_fm2).getTime();

	//alert(dt_1_ms  + "	" + dt_2_ms)
	switch (relation.toUpperCase()){
		case 'GT':
			if (dt_1_ms <= dt_2_ms){rntValue = "err";}
			break;
		case 'GE':
			if (dt_1_ms < dt_2_ms){rntValue = "err";}
			break;
		case 'LT':
			if (dt_1_ms >= dt_2_ms){rntValue = "err";}
			break;
		case 'LE':
			if (dt_1_ms > dt_2_ms){rntValue = "err";}
			break;
		case 'EQ':
			if (dt_1_ms != dt_2_ms){rntValue = "err";}
			break;
		default:
			rntValue = "";
	}
	return rntValue;

}
///////////////////
function genToDateStr(){
	var today = new Date();
	var i_year = today.getFullYear();
	var i_month = today.getMonth() + 1;
	var i_day = today.getDate();
	i_year = i_year.toString();
	i_month = i_month.toString();
	i_day  = i_day.toString();
	if (i_month.length == 1){i_month	= "0" + i_month;}
	if (i_day.length == 1){i_day	= "0" + i_day;}

	return (i_year + i_month + i_day);
}
////////////////////
function DGTN_check(Date1, dateFm){
	var rnt_str = "";
	var Date1_str = genDateStr(Date1, dateFm);
	var Date2_str = genToDateStr();
	//alert(Date1_str + " " +Date2_str)
	if (Date1_str <=	Date2_str){ rnt_str = "err";}
	return rnt_str;
}
////////////////////
function DLTN_check(Date1, dateFm){
	var  rnt_str = "";
	var Date1_str = genDateStr(Date1, dateFm);
	var Date2_str = genToDateStr();
	if (Date1_str >=	Date2_str){ rnt_str = "err";}
	return rnt_str;
}
////////////////////
function DGEN_check(Date1, dateFm){
	var rnt_str = "";
	var Date1_str = genDateStr(Date1, dateFm);
	var Date2_str = genToDateStr();
	if (Date1_str <  Date2_str){ rnt_str = "err";}
	return rnt_str;
}
////////////////////
function DLEN_check(Date1, dateFm){
	var rnt_str = "";
	var Date1_str = genDateStr(Date1, dateFm);
	var Date2_str = genToDateStr();
	if (Date1_str >  Date2_str){ rnt_str = "err";}
	return rnt_str;
}
////////////////////
function TGTN_check(time1, timeFm){
	var rnt_str = "";
	var time1_str = genDateStr(time1, timeFm);
	var time2_str = genTimeNowStr();
	//alert(time1_str + " " +time2_str )
	if (time1_str <= time2_str){ rnt_str = "err";}
	return rnt_str;
}

////////////////////
function TLTN_check(time1, timeFm){
	var rnt_str = "";
	var time1_str = genDateStr(time1, timeFm);
	var time2_str = genTimeNowStr();
	if (time1_str >= time2_str){ rnt_str = "err";}
	return rnt_str;
}
////////////////////
function TGEN_check(time1, timeFm){
	var rnt_str = "";
	var time1_str = genDateStr(time1, timeFm);
	var time2_str = genTimeNowStr();
	if (time1_str < time2_str){ rnt_str = "err";}
	return rnt_str;
}

////////////////////
function TLEN_check(time1, timeFm){
	var rnt_str = "";
	var time1_str = genDateStr(time1, timeFm);
	var time2_str = genTimeNowStr();
	if (time1_str > time2_str){ rnt_str = "err";}
	return rnt_str;
}
////////////////////
function FormValidate(){
	var objname = "";
	var ValIsReq = "rq";
	var v_type = "";
	var v_subval_delim = ",";
	var rnt_result = true;
	var more_message = "";
	var msg_code_add = "";
	var newval = "";
	var formkey = "";
	var rowno = "";
	var colno = "";
	var objidx = "";
	var formName = "";
	var tempAr = "";
	var disp_name =  "";
	var isSingleRow = false;
	for (var vr_idx = 0; vr_idx < sObj.ObjPropAr.length; vr_idx++){
		if (sObj.ObjValAr[vr_idx].length < 2){continue;}
		v_type = trim(sObj.ObjValAr [vr_idx][1]).toLowerCase();
		if (v_type == ValIsReq){
			disp_name = sObj.ObjValAr [vr_idx][0];
			objname = sObj.ObjPropAr[vr_idx][0];
			tempAr = getLocByNetName(objname);
			formkey =  tempAr[0];
			colno = tempAr[1];
			objidx = tempAr[2];
			formName = tempAr[3];
			isSingleRow = (sObj.DatAr[formkey].length == 2);
			for (var r_idx = 1; r_idx < sObj.DatAr[formkey].length; r_idx++){
				more_message = "";
				newval = sObj.DatAr[formkey][r_idx][colno];

				more_message = require_check(newval);
					if (more_message != ""){
					msg_code = "A010001";
					if (msg_code_add	== ""){
						msg_code_add = msg_code;
						if (!isSingleRow){disp_name_add = disp_name  + " at row " + r_idx;}
						else{disp_name_add = disp_name;}
						more_message="";
						focus_fieldname = objname + "__" + r_idx;  // for focusing the first invalid field
						focus_formname = formName;
					}
					else {
						msg_code_add = msg_code_add + "," + msg_code;
						if (!isSingleRow){disp_name_add = disp_name_add + "," +  disp_name +	" at row " + r_idx;}
						else{disp_name_add = disp_name_add + "," +	disp_name;}
						more_message="";
					}
				}
			}
		}
	}
	if (msg_code_add > ""){
		showMessages(msg_code_add, disp_name_add, null);
		//alert("The following form field(s) were incomplete or incorrect:\n\n" + message + "\n\n Please complete or correct the form and submit again.")
		if (typeof document.forms[focus_formname].elements[focus_fieldname] != "undefined"){
			document.forms[focus_formname].elements[focus_fieldname].focus();
		}
		 rnt_result = false;
	}
		return rnt_result;

}

//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////

/* ssSF.JS	this functions submits form data, copies data to submit form */
///////

/***********************************************************************
	- Purpose:	This function is for submitting form to server
			Before submition, validation and tranferring field values to submitting form	will process
			by calling functions 'copyToFormSubmit'  and 'validate'

 - Arguments:  form_names = names of forms to where the data are merged (separated by ",")
				 formToSubmit_name = name of submission form
				 actionSource = object name that fire the 'submitForm' function
				 submitParam = action flag to indicate weather all , modified  or no rows to be submitted
				possible values are: - "ALL", "MODIFIED", "NONE"
				validation = action flag to indicate weather validation should take action
				possible values are: - "VAL", "NOVAL"
				pageFn = page specific function which will run after validation have passed, before submission.
***********************************************************************/

function submitForm(formToSubmit_name, actionSource, submitParam, validation, pageFn ){
	var result = true;
	var objSubmit;
	/******************************************************************/
	// The following codes force to sync. the data in User Interface and
	// internal array due to the broswer caching the UI data if
	// users returning to previous page using back function of broswer .
	if(typeof document.forms[formToSubmit_name] != "undefined" &&
		 typeof document.forms[formToSubmit_name].elements["submitted"] != "undefined"){
		objSubmit = document.forms[formToSubmit_name].elements["submitted"];
		if (objSubmit.value == "1"){
			var formIdx = 0;
			var objName = "";
			var formName = "";
			var objNameAr = null;
			var sourceElement = null;
			var rtnValue = false;
			for (formIdx = 0; formIdx < sObj.DatAr.length; formIdx++){
				objNameAr = sObj.DatAr[formIdx][0];
				for (var name_idx = 0; name_idx < objNameAr.length; name_idx++){
					objName = objNameAr[name_idx].toLowerCase();
					formName = getLocByNetName(objName)[3];
					if (typeof document.forms[formName] != "undefined"){
						for (var row_idx = 1; row_idx < sObj.DatAr[formIdx].length; row_idx++){
							objName += "__" + row_idx;
							if (typeof document.forms[formName].elements[objName] != "undefined"){
								sourceElement = document.forms[formName].elements[objName];
								//alert("before : objName=" + objName + " UI value=" +	sourceElement.value + " array value=" + getData(objName))
								rtnValue = implementChangeHandler(sourceElement);
								//alert("after : objName=" + objName + " rtnValue=" + rtnValue + " UI value=" +  sourceElement.value + " array value=" + getData(objName))
								if (rtnValue != true){
									return;
								}
							}
						}
					}
					//else{alert("System Error occurred, form named '" + formName + "' does not exists")}
				}
			}
		}
		objSubmit.value = "1";
	}
	/*******************************************************************/
	if (sObj.allowSubmit){
		sObj.allowSubmit = false;
		result = implementSubmitForm(formToSubmit_name, actionSource, submitParam, validation, pageFn );
		if (!result){sObj.allowSubmit = true;}
	}
	//return result
}

function implementSubmitForm(formToSubmit_name, actionSource, submitParam, validation, pageFn ){
	/*
	// This codes added for preventing the form from double submission
	// caused by subsequent calling this function
	// added on 8 July 1999 : Larry
	if (sObj.submitting == true){return false}
	sObj.submitting = true
	///////////////////////////////////////////////////////////////////////////////////////////
	*/
	var doSubmit = false;
	var valResult = true;
	var formToSubmit = document.forms[formToSubmit_name];
	if (typeof formToSubmit == "undefined"){
		alert("System Error occurred, some problem on the submit form");
		//sObj.submitting = false
		return false;
	}
	if (!(getConfirm(actionSource))){
		//sObj.submitting = false
		return false;
	}
	if (validation.toUpperCase() == "VAL"){
		valResult = FormValidate();
	}
	if (valResult == true) {
		if (pageFn != ""){
			argAr = new Array();
			argAr = extractFunArg(pageFn);

			for (var ar_idx = 1; ar_idx < 16; ar_idx ++){
				if (typeof argAr[ar_idx] == "undefined"){
					argAr[ar_idx]  = null;
				}
			}
			if (typeof fObj != "undefined"){
				var rnt_value = fObj[argAr[0]](argAr[1],argAr[2], argAr[3],
					argAr[4],argAr[5], argAr[6],
					argAr[7],argAr[8],argAr[9],
					argAr[10], argAr[11],argAr[12],
					argAr[13], argAr[14], argAr[15]);
				if (rnt_value == null){
					//sObj.submitting = false
					return false;
				}
				else if (rnt_value != ""){
					showMessages(rnt_value, null, null);
					//sObj.submitting = false
					return false;
				}
			}
		}

		if (copyToFormSubmit(formToSubmit, actionSource, submitParam)  != true) {
			alert("System Error occurred when submitting form.");
			//sObj.submitting = false
			 return false;
		}
	}
	else {
		//sObj.submitting = false
		return false;
	}

	formToSubmit.submit();

	//alert("**** For debugging purpose ****\n		 Form submission success !") // debug

	return true;
}



/*****************************************************************************
 - This function is call from 'submitForm' function
 - Purpose:  prepare and write data strings, modified flag strings and action string for submission form
 - Arguments: form_submit = submission form object
				 actionSource = object name that fire the 'submitForm' function
				 submitParam = action flag to indicate weather all , modified  or no rows to be submitted
				possible values are: - "ALL", "MODIFIED", "NONE"
 ****************************************************************************/
function copyToFormSubmit(form_submit, actionSource, submitParam){

	var o_idx = 0;
	var r_idx = 0;
	var c_idx = 0;
	var p_idx = 0;
	var dataName = "";
	var modName = "";
	rowAr  = new Array();
	mRowAr	= new Array();
	mColAr	= new Array();
	var row_str = "";
	var mRow_str = "";
	var d_str = "";
	var m_str = "";
	var isMod = false;
	var isChanged = false;
	var cnt = 0;

	if (submitParam.toUpperCase() != "NONE"){

		/*** generate data strings and mod strings ***/
		for ( o_idx = 0; o_idx < sObj.DatAr.length; o_idx ++){ // loop for data strings
			m_str = "";
			d_str = "";
			isChanged = false;

			mRowAr = sObj.ModAr[o_idx];
			rowAr  = sObj.DatAr[o_idx];

			for ( r_idx = 1; r_idx < rowAr.length; r_idx ++){
				/*** check modified row if 'submitParam' = "MODIFIED" ***/
				cnt = 1;
				mColAr = mRowAr[r_idx];
				isMod = false;
				for (c_idx = 0; c_idx < mColAr.length; c_idx ++){
					if (mColAr[c_idx] == 1){
						isMod = true;
						isChanged = true;
						break;
					}
				}
				/*if (submitParam.toUpperCase() == "MODIFIED"){
					isMod = false
					for (c_idx = 0; c_idx < mColAr.length; c_idx ++){
						if (mColAr[c_idx] == 1){
							isMod = true
							break
						}
					}
				}*/
				if (submitParam.toUpperCase() == "ALL" ||
					 (submitParam.toUpperCase() == "MODIFIED" && isMod == true) ){
					/*** mod strings ***/
					mRow_str = mRowAr[r_idx].join(sObj.delim_col);

					/*** data strings ***/
					row_str = rowAr[r_idx].join(sObj.delim_col);

					/*if (cnt == 1){
						m_str +=	rowAr[0].join(sObj.delim_col) + sObj.delim_row + mRow_str
						d_str += rowAr[0].join(sObj.delim_col) + sObj.delim_row + row_str
					}*/
					if (cnt == 1){
						m_str +=	sObj.delim_row + mRow_str;
						d_str +=	sObj.delim_row + row_str;
					}
					else {
						m_str += sObj.delim_row + mRow_str;
						d_str += sObj.delim_row + row_str;
					}
					cnt ++;
				}
			}

			m_str =  rowAr[0].join(sObj.delim_col) + m_str;
			d_str = rowAr[0].join(sObj.delim_col) + d_str;
			/*** look for the corresponding data string name ***/
			for ( p_idx = 0; p_idx < sObj.ObjPropAr.length; p_idx ++){
				if (sObj.ObjPropAr[p_idx][1] == o_idx){
					dataName = sObj.ObjPropAr[p_idx][2];
					var n_len = dataName.length;
					modName = "mod" + dataName.substring(n_len - 1, n_len);
				}
			}

			if (isChanged == true){
				/*** write data to submission form ***/
				var regExp = /\x0D\x0A/g;
				d_str  =	 d_str .replace(regExp, "\\n");
				//var regExp2 = /\42/g
				//d_str  =	 d_str .replace(regExp2, "&#34;")
				var regExp3 = /\47/g;
				d_str  =	 d_str .replace(regExp3, "''");

				form_submit.elements[dataName].value = d_str;
				form_submit.elements[modName].value = m_str;
			}
			else{
				/*** write data to submission form ***/
				form_submit.elements[dataName].value = "nochange";
				form_submit.elements[modName].value = "nochange";
			}
			/*alert("***** For debugging purpose ***** \n________________________________________________\n" +
			form_submit.elements[dataName].value	+ "\n" +
			form_submit.elements[modName].value  + "\n________________________________________________\n\nSOURCE	ACTION	= '" +
			actionSource + "'") // debug
			*/
		}
	}

	/*** write action source to submission form ***/
	form_submit.elements["action"].value = actionSource;



	return true;
}

function getConfirm(action){
	var rntValue = true;
	var actStr = action.toUpperCase();


	/*alert("***** For debugging purpose ***** \n________________________________________________\n" +
				+ "\n" +
			actStr + "'") */ // debug


	if (actStr == "I_DELETE"){
		if (isChanged()){
			showMessages("A010109", null, null); // Record changed, delete not allowed.
			rntValue = false;
		}
		else {
			rntValue = showMessages("A020001", null, null); // Do you really want to delete this record ?
		}
	}

	// added Stephen Law 12/128/1999
	else if (actStr == "I_UPDATE_TMP") {
		rntValue = showMessages("A020010", null, null); // Do you really want to generate this cert ?
	}

	else if (actStr.indexOf("UPDATE") > -1 || actStr.indexOf("UPD") > -1 ){
		rntValue = showMessages("A020002", null, null); // Do you really want to update this record ?
	}
	else if (actStr.indexOf("EXIT") > -1){
		if (isChanged()){
			rntValue = showMessages("A020003", null, null);
		}


	}

	return rntValue;
}

function isChanged(){
	for (var f_idx = 0; f_idx < sObj.ModAr.length; f_idx ++){
		for (var r_idx = 1; r_idx < sObj.ModAr[f_idx].length; r_idx ++){
			for (var c_idx = 0; c_idx < sObj.ModAr[f_idx][r_idx].length; c_idx ++){
				if (sObj.ModAr[f_idx][r_idx][c_idx] != "0")
				{return true;}
			}
		}
	}
	return false;
}

function logOut(addFn, urlString){
	var rnt_value = "";
	// check if there is additional function needed to be executed before log out.
	if (addFn != "" && addFn != null){
		argAr = new Array();
		argAr = extractFunArg(addFn);

		for (var ar_idx = 1; ar_idx < 16; ar_idx ++){
			if (typeof argAr[ar_idx] == "undefined"){
				argAr[ar_idx]  = null;
			}
		}
		if (typeof fObj != "undefined"){
			var rnt_value = fObj[argAr[0]](argAr[1],argAr[2], argAr[3], argAr[4],argAr[5], argAr[6], argAr[7],argAr[8],argAr[9], argAr[10], argAr[11],argAr[12], argAr[13], argAr[14], argAr[15]);
			if (rnt_value == null){
				return;
			}
			else if (rnt_value != ""){
				showMessages(rnt_value, null, null);
				return;
			}
		}
	}
	if (rnt_value == ""){
		rnt_value = showMessages("A020005", null, null); // Do you really want to log out system ?
		if (rnt_value == true) {
			location.replace(urlString);
		}
	}
}

// Added by miu on 21-06-01 //
function show_menu(n) {
	if (n==0) {
		if (browser.ns) {
			document.layers['menu'].visibility = 'visible';
		 } else {
			document.all('menu').style.visibility = 'visible';
		}
	} else {
		if (browser.ns) {
				if (document.layers['submenu'+n].innerHTML == "") {
					document.layers['submenu'+n].innerHTML = submenuArray[n];
				} else {
					document.layers['submenu'+n].innerHTML = "";
				}
		 } else {
				if (document.all('submenu'+n).innerHTML == "") {
					document.all('submenu'+n).innerHTML = submenuArray[n];
				} else {
					document.all('submenu'+n).innerHTML = "";
				}
		}
	}
}

// Added by miu on 21-06-01 //
function hide_menu(n) {
	if (browser.ns) {
			for (i=1;i<=NO_OF_MENU_BLOCK;i++) {
					document.layers['submenu'+i].innerHTML = "";
			}
			document.layers['menu'].visibility = 'hidden';
	} else {
			document.all('menu').style.visibility = 'hidden';
	}
}

// Added by miu on 21-06-01 //
function replace_space(str,substr,withstr) {
	var i ;
	var j ;
	i = str.indexOf(substr);
	j = substr.length;
	if (i > 0) {
		return replace_space(str.substring(0,i) + withstr + str.substring(i+j,str.length),substr,withstr);
	} else {
		return str;
	}
}

// Added by Kelvin on 2002/06/27
// for closing all the child window when log out
var childwindows = new Array();

function OpenChildWindow(url, title, properties) {
	var i;
	i = childwindows.length;
	childwindows[i] = window.open(url, title, properties);
	childwindows[i].document.write("Loading... Please wait...<script language=Javascript>window.location='" + url + "';</script>");
	return true;
}

function CloseAllChildWindows() {
	var i;
	for (i=0;i<childwindows.length;i++) {
		childwindows[i].close();
	}
}

// Added by Dicky on 2007/08/29, enh465
function enable_all_marked_ddl(abEnable) {
  enable_all_marked_ddl_by_form(abEnable, "MainForm");
}

function enable_all_marked_ddl_by_form(abEnable, asFormName) {
  var elementArray = new Array();
  // Modified by Dicky on 2007/11/23, P2-0945
  //if (document.all)
  //  elementArray = document.all;
  //else
  //  elementArray = document.getElementsByTagName("*");
  elementArray = document.getElementsByTagName("select");
  // End, Modified by Dicky on 2007/11/23, P2-0945
  for (var i = 0; i < elementArray.length; i++) {
    if (elementArray[i].type == "select-one") {
      var obj = elementArray[i];
      var ls_temp_obj_type;
      eval("ls_temp_obj_type = typeof(document." + asFormName + ".hddl_" + obj.name + ")");
      if (ls_temp_obj_type != "undefined") {
        if (abEnable) {
          //alert("Enable:" + obj.name + ", " + obj.value);
          if (obj.disabled == true && obj.value != "%") {
            //alert("Action:" + obj.name + ", " + obj.value);
            obj.disabled = false;
          }
        } else {
          //alert("Disnable:" + obj.name + ", " + obj.value);
          if (obj.length == 1 && obj.value != "%") {
            obj.disabled = true;
          }
        }
        //alert(obj.name + ", " + obj.value);
      }
    }
  }
}
// End, Added by Dicky on 2007/08/29, enh465

function DateAdd(interval,number,date){ // date
    n = parseInt(number,10);
    if (typeof(date)=="string"){
        d = ToDate(date);
    }
        if (typeof(date)=="object"){
        var d = new Date(date.valueOf());
    }
    switch(interval){
        case "y": d.setFullYear(d.getFullYear()+n); break;
        case "m": d.setMonth(d.getMonth()+n); break;
        case "d": d.setDate(d.getDate()+n); break;
        case "w": d.setDate(d.getDate()+7*n); break;
        case "h": d.setHours(d.getHour()+n); break;
        case "n": d.setMinutes(d.getMinutes()+n); break;
        case "s": d.setSeconds(d.getSeconds()+n); break;
        case "l": d.setMilliseconds(d.getMilliseconds()+n); break;
    }
    return d;
}

function ToDate(str){
    var s = str.replace(/-/g,"/");
    s = s.split("/");
    var date = new Date(parseInt(s[0],10),parseInt(s[1],10)-1,parseInt(s[2],10));
    return date;
}

function dateToString(d){
    var dateString = myFullYear(d.getFullYear()) + '/' + addZ(d.getMonth()+1)+ '/' + addZ(d.getDate());
    return dateString;
}

function myFullYear(y){
    return ( y < 1900 )? y + 1900 : y;
}

function addZ(z) {//adds a zero in front of date numbers
    return (z<10)? '0' + z : z;
}


Date.prototype.getISOWeek =
          function(utc) {
            var y = utc ? this.getUTCFullYear(): this.getFullYear();
            var m = utc ? this.getUTCMonth() + 1: this.getMonth() + 1;
            var d = utc ? this.getUTCDate() : this.getDate();
            // If month jan. or feb.
            if (m < 3) {
              var a = y - 1;
              var b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0);
              var c = ( (a - 1) / 4 | 0) - ( (a - 1) / 100 | 0) + ( (a - 1) / 400 | 0);
              var s = b - c;
              var e = 0;
              var f = d - 1 + 31 * (m - 1);
            }
            // If month mar. through dec.
            else {
              var a = y;
              var b = (a / 4 | 0) - ( a / 100 | 0) + (a / 400 | 0);
              var c = ( (a - 1) / 4 | 0) - ( (a - 1) / 100 | 0) + ( (a - 1) / 400 | 0);
              var s = b - c;
              var e = s + 1;
              var f = d + ( (153 * (m - 3) + 2) / 5 | 0) + 58 + s;
            }
            var g = (a + b) % 7;
            // ISO Weekday (0 is monday, 1 is tuesday etc.)
            var d = (f + g - e) % 7;
            var n = f + 3 - d;
            if (n < 0)
              var w = 53 - ( (g - s) / 5 | 0);
            else if (n > 364 + s)
              var w = 1;
            else
              var w = (n / 7 | 0) + 1;
            return w;
          };
          
Date.prototype.getISOYear =
          function(utc) {
            var l_week = this.getISOWeek(utc);
            var l_rtn;
            l_rtn = this.getYear();
            if (l_week  == 1) {
                if (this.getMonth() == 11) {
                    l_rtn = l_rtn + 1;
                }
            }
            if (l_week  >= 52) {
                if (this.getMonth() == 0) {
                    l_rtn = l_rtn - 1;
                }
            }
            return l_rtn;
          };    
    
          
function IsNumeric(sText)
{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;

   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
   
}          

// Added by Dicky on 2008/08/28, enh509-02, moved from wecMain.htp
// Added by Sunny 2005-10-05, enh330
function OpenNewWindow(as_url, as_x, as_y, as_width, as_height, as_level) {
    if (as_x == null){ as_x = 0; }
    if (as_y == null){ as_y = 0; }
    if (as_width  == null){ as_width  = 900; }
    if (as_height == null){ as_height = 600; }
    // Added by Dicky on 2008/08/28, enh509-02
    if (as_level == null){ as_level = ""; }
    var ls_top_left = "";
    if (!(as_x==0 && as_y==0)) 
    { 
      if (as_x!=0) ls_top_left = ls_top_left + ",left=" + as_x;
      if (as_y!=0) ls_top_left = ls_top_left + ",top=" + as_y;
    }
    else 
    {
      ls_top_left = "";
    }
    // End, Added by Dicky on 2008/08/28, enh509-02

    // Modified by Dicky on 2006/01/06, enh347
    //rv_win = OpenChildWindow(as_url,'new_window','resizable,status,menubar=no,toolbar=no,scrollbars=yes,status=yes,width=800,height=600');
    if (OpenChildWindow(as_url,'new_window' + (new Date()).getTime(),'resizable,status,menubar=no,toolbar=no,scrollbars=yes,status=yes,width='+as_width+',height='+as_height+ls_top_left)) {
        //alert('after open - childwindows.length:' + childwindows.length);
        // never execute
        var i = childwindows.length;
        if (!(as_x==0 && as_y==0)) { childwindows[i-1] .moveTo(as_x, as_y); }
    }
    //rv_win.focus();
}
// End
// End, Added by Dicky on 2008/08/28, enh509-02