//var LAUNCH_STRING = "DialogWrapper.html?src=ezc.asp";
//var DIALOG_PROPERTY = "scroll:no;dialogheight:600px;dialogwidth:800px";
var C_HOME_PAGE = "ezc.asp?_h=go&_md=Task&_ha=gmv&_tpl=TaskList.xsl&_gt=2&_gs=-1&_gb=0";

var C_DIALOG_SETTING = "scroll:yes; dialogheight:600px; dialogwidth:800px; resizable:yes";
var C_NOT_FOUND = "<Not Found>";

var g_SelectUrlBase = "ezc.asp?_h=go&_ha=gmv&_gt=-1&_gs=-1&_wct=text/xml";
var g_ResponseDomXml = "<ez:Data xmlns:ez='http://www.ezcomputing.com/framework'><ez:System><ez:Error/></ez:System></ez:Data>";
var g_DomProgID = "MSXML2.DOMDocument.4.0";


var _sys_var = new Array();
var _sys_action = new Array();
var _sys_err = new Array();

//***********************************************
//Events
//***********************************************
function showHelp(helpTopic)
{
	document.location = "help.htm#" + helpTopic;
}

function bodyOnLoad()
{
	if (typeof(bodyOnLoadUD) == "function")
	{
		bodyOnLoadUD();
	}
}

function formOnSubmit(frm)
{
	if (typeof(formOnSubmitUD) == "function")
	{
		return formOnSubmitUD(frm);
	}
	return true;
}

//function bodyOnLoadUD()
//{
//}

//function formOnSubmitUD(frm)
//{
//}
function clearForm(frm) 
{

	for (var i = 0; i < frm.length; i++) 
	{
		var elt = frm.elements[i];			

		if((elt.type == "text") 
			|| (elt.type == "hidden")
			|| (elt.type == "password") 
			|| (elt.type == "select-one")
			|| (elt.type == "textarea")
			) 
		{
			if (elt.getAttribute("ez:Default"))
			{
				elt.value = elt.getAttribute("ez:Default");
			}
			else
			{
				elt.value = "";
			}
		}
		else if (elt.type == "checkbox") 
		{
			if (elt.getAttribute("ez:Default"))
			{
				elt.checked = true;
			}
			else
			{
				elt.checked = false;
			}
		}
	}

	if (document.all.ViewManyListTable)
	{
		document.all.ViewManyListTable.style.display = "none";
	}
	
	if (document.all.navigationTR)
	{
		document.all.navigationTR.style.display = "none";
	}

	hideMsg();

	if (typeof(clearFormUD) == "function")
	{
		clearFormUD(); //define this function at page level if you want to set default or do some thing else
	}
	
}


//***************************************
function parseFormAction(frm)
{
	var action = new String(frm.action);

	var a1 = action.split("?");

	_sys_action["ez:PageName"] = a1[0];

	var a2 = a1[1].split("&");
	for (var n = 0; n < a2.length; ++n)
	{
		var a3 = a2[n].split("=");
		_sys_action[a3[0]] = a3[1];
	}
}

function dumpSysAction()
{
	var s = "";
	for (x in _sys_action)
	{
		s += x + "=" + _sys_action[x] + "\n";
	}
	alert(s);
}

function resetFormAction(frm)
{
	var s = "";
	for (x in _sys_action)
	{
		if (x == "ez:PageName")
		{
			s = _sys_action[x] + "?";
		}
		else
		{
			//if (_sys_action[x].length != null && _sys_action[x].length > 0)
			if (_sys_action[x] > "")
			{
				s += x + "=" + _sys_action[x] + "&";
			}
		}
	}
	
	s = s.substr(0, s.length - 1);	
	frm.action = s;	
}

/*
	_h: Handler
	_ha: HandlerAction
	_md: Metadata
	_tpl: Template name
	_gb: (grid) beginning row
	_ge: (grid) ending row
	_gs: (grid) size
	_gt: (grid) total rows
	_ga: (grid) action: first, next, prev, last
	_go: (grid) order by
	_on: object name.  can be table name or stored proc name
	_tpl: template name
	_cn: config file name

	_sid: session id
	_rc: role code
	_uid: user id (int)
	_pid: permanent id to identify the machine
	_msg: Message

	_sh: suppress header: for lookup	
	_tg: tag

	_wnt: no transforming
	_wct: content type
	
sample:
function onclickHandler(frm)
{
	parseFormAction(frm); 

//	_sys_action['_h'] = 'something+new';
//	_sys_action['_tpl'] = '';
	setHandlerAction('use');
	setTemplateName('');
	
	resetFormAction(frm);
}
*/
function setHandler(v) { _sys_action["_h"] = v;	}

function setHandlerAction(v) { _sys_action["_ha"] = v;}

function setMetadataName(v) { _sys_action["_md"] = v;}

function setTemplateName(v) { _sys_action["_tpl"] = v;}

function setObjectName(v) { _sys_action["_on"] = v;	}

function setGridBegin(v) { _sys_action["_gb"] = v;	}

function setGridEnd(v) { _sys_action["_ge"] = v;}

function setGridSize(v) { _sys_action["_gs"] = v;	}

function setGridTotal(v) { _sys_action["_gt"] = v;	}

function setGridAction(v) { _sys_action["_ga"] = v;	}

function setGridOrderBy(v) { _sys_action["_go"] = v;	}

function setNavigation(v) {_sys_action["_ga"] = v;  }


//***********************************************
//Modify Single
//***********************************************
function getReturnUrlForSearch(frm)
{
	var qryStrings = new String(frm.action).split("&");

	for (var n = 0; n < frm.elements.length; ++n)
	{
		//alert(frm.elements(n).type);
		if (frm.elements(n).tagName == "INPUT" 
			&& (frm.elements(n).type == "submit" 
			|| frm.elements(n).type == "button"
			|| frm.elements(n).type == "image") )
		{
			//ignore
		}
		else if (frm.elements(n).name == "_gp" || frm.elements(n).name == "_ga")
		{ 
			//ignore
		}
		else
		{
			
			//s += frm.elements(n).name + "=" + frm.elements(n).value + "&";		
			for (var i = 0; i < qryStrings.length; ++i)
			{
				var s = frm.elements[n].name;
				var s1 = s + "=";

				if (qryStrings[i].substr(0, s1.length) == s1)
				{
					if (frm.elements[n].value.length == 0)
					{
						qryStrings[i] = "";
					}
					else
					{
						qryStrings[i] = s + "=" + frm.elements[n].value;
						
						//qryStrings[i] = s + "=" + escape(frm.elements[n].value);
						//if (s == "RoleCode") alert(qryStrings[i]);
						
					}
					break;
				}
			}
			if (i == qryStrings.length && frm.elements[n].value.length > 0)
			{
				qryStrings[qryStrings.length] = 
					frm.elements[n].name + "=" 
					+ escape(frm.elements[n].value); //MUST escape the value here.
			}
		}		
	}
	var s = ""
	
	//ensure callback will execute get-many-view
	for (var m1 = 0; m1 < qryStrings.length; ++m1)
	{
		if (startWith(qryStrings[m1], "_ha="))
		{
			qryStrings[m1] = "_ha=gmv";
		}
		else if (startWith(qryStrings[m1], "_ga="))
		{
			qryStrings[m1] = ""; //remove _ga (grid action) in there is any
		}
		else
		{
			if (typeof(excludeFromReturnUrlForSearch) == "function")
			{
				if (excludeFromReturnUrlForSearch(qryStrings[m1]))
				{
					qryStrings[m1] = "";
				}
			}
		}
	}
	
	for (var m = 0; m < qryStrings.length; ++m)
	{
		if (qryStrings[m].length != 0)
		{
			if (m != 0)
			{
				s += "&";
			}
			s += qryStrings[m];	
		}
	}
//alert(s);
	return escape(s);
}

function editRecord(editRecordUrl, frm)
{
	var s = getReturnUrlForSearch(frm);
//alert(editRecordUrl + "&_rdt=" + s);
	window.location = editRecordUrl + "&_rdt=" + s;
	return false;
}

function newRecord(frm)
{

	parseFormAction(frm);

	setHandlerAction('gsn');

	setTemplateName(m_editPageName);
	
	_sys_action["_rdt"] = getReturnUrlForSearch(frm);

	if (typeof(setNewRecordParams) == "function")
	{
		setNewRecordParams(frm);
	}

	resetFormAction(frm);
}

function deleteRecord(frm, queryStringForDelete)
{

	if (!validateForm(frm))
	{
		return false;
	}
	parseFormAction(frm);

	setHandlerAction('dsv'); //delete-single-view

	if (typeof(setDeleteRecordParams) == "function")
	{
		setDeleteRecordParams(frm);
	}

	resetFormAction(frm);	

	frm.action = frm.action + "&" + queryStringForDelete;

	frm.submit(); //be sure the button is type button but not type submit.
	return false;
}

function updateSingle(frm)
{
	if (!validateForm(frm))
	{
		return false;
	}
	parseFormAction(frm);
	setHandlerAction("usr");
	_sys_action["_rdt"] = escape(frm._rdt_f.value);

	if (typeof(updateSingleUD)=="function") 
	{
		if (!updateSingleUD(frm)) return false;
	}
	
	resetFormAction(frm);	
	return true;
}

function applyUpdateSingle(frm)
{
	if (!validateForm(frm))
	{
		return false;
	}

	parseFormAction(frm);

	setHandlerAction("use");

	resetFormAction(frm);	
	if (typeof(applyUpdateSingleUD)=="function") 
	{
		if (!applyUpdateSingleUD(frm)) return false;
	}
	
	return true;
}

function createSingle(frm)
{
	if (!validateForm(frm))
	{
		return false;
	}
	
	parseFormAction(frm);
		
	setHandlerAction("isr");
	_sys_action["_rdt"] = escape(frm._rdt_f.value);

	if (typeof(createSingleUD)=="function") 
	{
		if (!createSingleUD(frm)) return false;
	}

	resetFormAction(frm);	

	return true;
}

function applyCreateSingle(frm)
{
//alert("x");

	if (!validateForm(frm))
	{
		return false;
	}

	parseFormAction(frm);

	setHandlerAction("ise");

	if (typeof(applyCreateSingleUD)=="function") 
	{
		if (!applyCreateSingleUD(frm)) return false;
	}

	resetFormAction(frm);	
//alert(frm.action);
//return false;

	return true;
	
}

function cancelButtonHandler(frm)
{
	return true;
}

//***********************************************
//Search
//***********************************************
function searchHandler(frm)
{
//alert(frm.action);

	parseFormAction(frm);

	setHandlerAction('gmv');
	setGridOrderBy('');
	if (frm._gpf == undefined || frm._gpf.value != "1")
	{
		//Form is initially loaded, or nav button is clicked.
		setGridBegin(0);
		setGridAction("");
		setGridTotal("-1"); // force to refresh total rows
	}
	else
	{
		//Enter number in to _gp field and press Enter
		var n = (frm._gp.value - 1) * _sys_action["_gs"];
		setGridBegin(n);
		setGridAction("");
	}
	var ret = true;
	if (typeof(cleanupSearchHandler) != "undefined") 
	{
		ret = cleanupSearchHandler(frm); //such as change gmv to gme
	}
	
	resetFormAction(frm);
	return ret;
//alert(frm.action);
}


function searchButtonIsClicked(frm)
{
	if (frm.elements('_gpf') == undefined)
	{
		//Navigation buttons not display yet.
		return true;
	}
	else
	{
		//If nav buttons are displayed but SubmitByPageCounter is 0, that
		//means search button is clicked
		return (frm._gpf.value != '1');
	}
}

function navigateTo(frm, Navigation)
{
	parseFormAction(frm);
	setHandlerAction("gmv");
	setNavigation(Navigation);
	
	if (typeof(setNavigationParams) == "function")
	{
		setNavigationParams(frm, Navigation);
	}
	resetFormAction(frm);
}

function sortRows(frm, orderByColumn)
{
	parseFormAction(frm);

	setGridOrderBy(orderByColumn); 
	setNavigation("First");
	setHandlerAction("gmv");
	
	if (typeof(setSortRowsParams) == "function")
	{
		setSortRowsParams(frm, orderByColumn);
	}

	resetFormAction(frm);

	frm.submit();	
}

function hideMsg()
{
	document.all.errorMsgRow.style.display = "none";
	document.all.infoMsgRow.style.display = "none";
}

//***********************************************
//String routines
//***********************************************
function startWith(s1, s2)
{
//return true if s2 is the starting string of s1
	if (s1 < s2) return false;
	return (s1.substr(0, s2.length) == s2)
}

function xmlDecode(s)
{	
	return s.replace(/&amp;/g, "&");
}

function xmlEncode(s)
{	
	return s.replace(/&/g, "&amp;");
}


function showElement(elementID, visible)
{
	var elts = document.all(elementID);
	if (elts == null)
	{
		alert(elementID + " is not valid");
		return false;
	}

	//Only one element with such id
	if (elts.length == undefined)
	{
		if (visible)
		{
			elts.style.display = "inline";
		}
		else
		{
			elts.style.display = "none";
		}
		return true;
	}

	//There are more than one element with such id.
	for (var i = 0; i != elts.length; ++i)
	{
		if (visible)
		{
			elts[i].style.display = "inline";
		}
		else
		{
			elts[i].style.display = "none";
		}
	}
}

function addRemoveSelectedItem(fld)
{
//Used in PickXxxx.xsl.  Form field SelectedItems must be defined.  This function's
//param fld is a check box.
	fld.form.SelectedItems.value 
		= addRemoveString(fld.form.SelectedItems.value, fld.value, fld.checked);
}

function addRemoveString(source, str, flag)
{
//Used in PickXxxx.xsl.  This function is to add or remove selected item from a string,
//which is stored in SelectedItems form field.
	re = new RegExp("^" + str + ",|," + str + "$|^" + str + "$");
	re2 = new RegExp("," + str + ",");

	if (flag)
	{
		//add
		if (source.search(re) != -1 || source.search(re2) != -1)
		{
			return source;
		}
		else
		{
			if (source.length)
			{
				return source + "," + str;
			}
			else
			{
				return str;
			}
		}
	}
	else
	{
		//remove
		var s = source.replace(re, "");
		if (s.length == source.length)
		{
			var s2 = s.replace(re2, ",");
			return s2;
		}
		return s;
	}
}

function pickItems(frm)
{
//Used in PickXxxx.xsl.  Form field SelectedItems must be defined.
	top.window.returnValue = frm.SelectedItems.value;
	top.window.close();
}


//***********************************************
//Menu
//***********************************************
function showSubmenu(menu, subMenuID)
{
	var subMenu = document.all(subMenuID);
	var menuTable = getParentTable(menu);

	if (menuTable.getAttribute("currentSubMenu") 
		&& menuTable.getAttribute("currentSubMenu") != subMenuID)
	{
		document.all(menuTable.getAttribute("currentSubMenu")).style.display = "none";		
	}

	//menu must be "position:relative" or "position:absolute"
	if (menuTable.id == "mainMenu")
	{
		subMenu.style.pixelTop = menu.offsetTop + menu.offsetHeight - 5;
		subMenu.style.pixelLeft = menu.offsetLeft - 3;
		subMenu.style.display = "inline";
	}
	else
	{
		subMenu.style.pixelTop = menuTable.offsetTop + menu.offsetTop - 2;
		subMenu.style.pixelLeft = menuTable.offsetLeft + menuTable.offsetWidth - 8; //menu.offsetLeft + menu.offsetWidth - 3;
		subMenu.style.display = "inline";
	}
	
	menuTable.setAttribute("currentSubMenu", subMenuID);
}

function hideSubmenu(subMenuID)
{
	var subMenu = document.all(subMenuID);
	var td = document.all(subMenu.getAttribute("parentMenuID"));

	var tbl = getParentTD(td);
	if (tbl.getAttribute("currentSubMenu"))
	{
		hideSubmenu(tbl.getAttribute("currentSubMenu"));
		tbl.removeAttribute("currentSubMenu");
	}

	subMenu.style.display = "none";
}

function getParentTD(elt)
{
	while ( elt && elt.tagName != "TD")
	{
		elt = elt.parentNode;
	}
	return elt;
}

function getParentTable(elt)
{
	while ( elt && elt.tagName != "TABLE")
	{
		elt = elt.parentNode;
	}
	return elt;
}

function menuMouseOver(thisElt)
{
	
	var elt = event.srcElement;

	var srcTD = getParentTD(event.srcElement);

	//srcTD dosn't belong to menu DIV, exit
	if (!thisElt.contains(srcTD)) return;
	
	var srcTable = getParentTable(srcTD);
	if (srcTD)
	{
		srcTD.style.background = "silver";
		if (srcTD.getAttribute("url")) srcTD.style.cursor = "hand";

		if (srcTable.id == "mainMenu")
		{
			srcTD.style.borderStyle = "inset";
			//window.status = srcTD.outerHTML;
		}
		
		if (srcTD.getAttribute("subMenuID"))
		{
			showSubmenu(srcTD, srcTD.getAttribute("subMenuID"));
		}
	}
/*
	if (srcTable && srcTable.className
		&& (srcTable.className == "mainMenu" || srcTable.className == "subMenu") )
	{
		if (elt.getAttribute("subMenuID"))
		{
			showSubmenu(elt, elt.getAttribute("subMenuID"))
		}
	}
*/
}

function menuOnClick(thisElt)
{
	var srcTD = getParentTD(event.srcElement);

	if (!thisElt.contains(srcTD)) return;

	if (srcTD)
	{
		var url = srcTD.getAttribute("url");
		if (url)
		{
			window.location = url;
		}
	}
}

function bodyOnClick()
{
	var menuContainer = document.all("menuDiv");
	
	if (menuContainer && !menuContainer.contains(event.srcElement))
	{
		if (menuContainer.all("mainMenu").getAttribute("currentSubMenu"))
		{
			//alert("disable submenu");
			hideSubmenu(menuContainer.all("mainMenu").getAttribute("currentSubMenu"));
		}
	}
}

function menuMouseOut(thisElt)
{
	var srcTD = getParentTD(event.srcElement);

	if (!thisElt.contains(srcTD)) return;

	var fromTable = getParentTable(event.fromElement);
	var toTable = getParentTable(event.toElement);

	if (srcTD && thisElt.contains(srcTD))
	{
		srcTD.style.background = "lightgrey";
		srcTD.style.cursor = "default";

		if (fromTable.id == "mainMenu")
		{
			srcTD.style.borderStyle = "outset";
		}
	}


	if (!toTable || !thisElt.contains(toTable))  //move outside of menu
	{

		if (fromTable.getAttribute("currentSubMenu"))
		{
			hideSubmenu(fromTable.getAttribute("currentSubMenu"));
		}
		if (fromTable.className == "subMenu")
		{

			hideSubmenu(fromTable.id);

			//hide submenu's parent menus
			var parentMenuID = fromTable.getAttribute("parentMenuID");
			while (parentMenuID)
			{
				var td = thisElt.all(parentMenuID);
				if (td)
				{
					//parentMenuID points to a TD, so we get that TD's table
					var menuTable = getParentTable(td);

					if (menuTable)
					{
						if (menuTable.id && menuTable.id != "mainMenu")
						{
							hideSubmenu(menuTable.id);
							parentMenuID = menuTable.getAttribute("parentMenuID");
						}
						else
						{
							return;
						}
					}
					else
					{
						//This is an error.  parentMenuID must point to a TD, thus
						//there must be a parent table.
						return;
					}
				}
				else
				{
					//This is an error.  submenu's parentMenuID must point to a
					//valid TD
					return;
				}
			}
		}
	}
	else if (toTable == fromTable) //move btw cells of the same menu
	{

		if (event.fromElement.tagName == "TD" && event.toElement.tagName == "TD")
		{
			//move between menu items of the same menu
		}
		else if (event.toElement.tagName == "TABLE")
		{
			//Move to the gap btw menu items		
			if (toTable.id == "mainMenu" && toTable.getAttribute("currentSubMenu"))
			{
				//Moving btwn main menu items 
//				hideSubmenu(toTable.getAttribute("currentSubMenu"));
			}
			else if (toTable.className == "subMenu")
			{
				if (event.offsetX < 0 
					|| event.offsetX + 1 > event.fromElement.offsetWidth
					|| (event.offsetY + 1 > event.fromElement.offsetHeight 
						&& event.fromElement.parentNode.nextSibling == null))
				{
					hideSubmenu(toTable.id);				
				}
			}
		}

		if (fromTable.getAttribute("currentSubMenu"))
		{
			hideSubmenu(fromTable.getAttribute("currentSubMenu"));
		}
	}
	else if (!fromTable.getAttribute("parentMenuID")) //move away from main menu to sub
	{
		//alert("main to sub");
	}
	else
	{
//writeLog("(4) ");
		//alert("sub to main");
		if (fromTable.getAttribute("currentSubMenu") == toTable.id)
		{
			//move to its sub menu.  do not hide itself
		}
		else
		{
			hideSubmenu(fromTable.id);
		}
	}

}

function writeLog(logText)
{
	document.all("logText").value += logText;
}


function setCookie(dictionaryName, cookieName, cookieValue)
{
	var dict = getCookieDictionary(dictionaryName);

	if (!dict.length) return;

	var re = new RegExp("([&]|^)" + cookieName + "[^&]*([&]|$)", "ig");
	return dict.replace(re, "");
	//return dict.replace(/cookieName=[^&]*([&]|$)/, cookieName);
}

function removeQueryString(src, queryStringName)
{
	//query string in the middle
	var re = new RegExp("[&]" + queryStringName + "=[^&]*[&]", "ig");

	//query string at the end
	var re2 = new RegExp("[&]" + queryStringName + "=[^&]*$", "ig");

	//query string in the beginning
	var re3 = new RegExp("[?]" + queryStringName + "=[^&]*[&]", "ig");

	//only one query string
	var re4 = new RegExp("[?]" + queryStringName + "=[^&]*$", "ig");
	if (src.search(re) != -1)
	{
		var s = src.replace(re, "&");
		return s;
	}
	else if (src.search(re2) != -1)
	{
		var s = src.replace(re2, "");
		return s;
	}
	else if (src.search(re3) != -1)
	{
		var s = src.replace(re3, "?");
		return s;
	}
	else if (src.search(re4) != -1)
	{
		var s = src.replace(re4, "");
		return s;
	}
}

function formatDecimal(num, decimalPos)
{
	if (isNaN(parseInt(num))) return "NaN";

	var sign = num < 0 ? -1 : 1;

	num *= Math.pow(10, decimalPos);	
	num = Math.round(Math.abs(num))
	num *= sign;					
	var s = "" + num;
	return s.substr(0, s.length - decimalPos) + "."
		+ s.substr(s.length - decimalPos, decimalPos)
/*
	num /= Math.pow(10, decimalPos);
	
	num *= sign;					

	return num;

    if (isNaN(parseInt(num))) return "NaN";

	var sign = num < 0 ? -1 : 1;

	num *= Math.pow(10, decimalPos);

	num = Math.round(Math.abs(num))
	num *= sign;

	var s = "" + num;
	return s.substr(0, s.length - decimalPos) + "."
		+ s.substr(s.length - decimalPos, decimalPos)
*/
}

function formatDecimal2(num)
{
	return formatDecimal(num, 2);
}

function formatDecimal4(num)
{
	return formatDecimal(num, 4);
}

function getElementValue(elt)
{
	if (elt.tagName == "INPUT" || elt.tagName == "SELECT")
	{
		return elt.value;
	}
	else if (elt.tagName == "TEXTAREA")
	{
		return elt.text;
	}	
}

function setElementValue(elt, val)
{
	if (elt.tagName == "INPUT" || elt.tagName == "SELECT")
	{
		elt.value = val;
	}
	else if (elt.tagName == "TEXTAREA")
	{
		elt.text = val;
	}
	
}

function getFieldErrorID(fldName)
{
	var n = fldName.indexOf(".");
	if (n >= 0)
	{
		return fldName.replace(/[.]/, "Error.");
	}
	else
	{
		return fldName + "Error";
	}
}

function validateNumber(val)
{
	return val.match(/^[\+\-]?[0-9]*(\.[0-9]+)?$/);
}

//This function marks the error field with *, appends error message to 
//gValidateFormMessage
function setFieldError(fldName, fldErrorID)
{
	if (!document.all(fldErrorID))
	{
		alert("Missing element '" + fldErrorID + "'");
		return false;
	}

	document.all(fldErrorID).className = "errorMarkOn";

	if (gValidateFormMessage.length) gValidateFormMessage += "<br/>";

	gValidateFormMessage += fldName + ": value required.";
}

function markFieldError(fldErrorID)
{
//<span class="errorMarkOff" id="ToShipError.1">*</span>
	if (!document.all(fldErrorID))
	{
		alert("Missing element '" + fldErrorID + "'");
		return false;
	}
	document.all(fldErrorID).className = "errorMarkOn";
}

function unmarkFieldError(fldErrorID)
{
	if (document.all(fldErrorID))
	{
		document.all(fldErrorID).className = "errorMarkOff";
	}
}

function appendValidateFormMessage(msg)
{
	if (gValidateFormMessage.length) 
	{
		gValidateFormMessage += "<br/>";
	}
	gValidateFormMessage += msg;
}

function validateForm(frm)
{
	//return true if success.  otherwise false

	var hasError = false;
	gValidateFormMessage = "";
	
	for (var i = 0; i != frm.elements.length; ++i)
	{
		var elt = frm.elements[i];
		var fldErrorID = getFieldErrorID(elt.name);
		var val = getElementValue(elt);

		if (elt.getAttribute("required") == "true")
		{
		
			if (val.length == 0)
			{
				markFieldError(fldErrorID);
				
				appendValidateFormMessage(elt.name + ": value required.");
				
				hasError = true;
			}
			else
			{
				unmarkFieldError(fldErrorID);
			}
			
		}

		if (!hasError)
		{
			var dataType = elt.getAttribute("datatype");		

			if (dataType == "varchar")
			{
				unmarkFieldError(fldErrorID);
			}
			else if (dataType == "datetime")
			{
//				if (elt.name=="OrderDate") debugger;
				
				//val = reformatDate(val);
				//setElementValue(elt, val);
				
				
				if (getElementValue(elt) == "today")
				{
					var d = new Date();
					val = "" + (d.getMonth() + 1)
						+ "/" + d.getDate() + "/" + d.getYear();
					setElementValue(
						elt, val);
				}
				else
				{
					if (val.length && !validateDate(val))
					{
						//set error
						markFieldError(fldErrorID);
						appendValidateFormMessage(elt.name + ": invalid date.");
						hasError = true;
					}
					else
					{
						unmarkFieldError(fldErrorID);
					}
				}

			}
			else if (dataType == "numeric")
			{
				if (!validateNumber(val))
				{
					//set error
					markFieldError(fldErrorID);
					appendValidateFormMessage(elt.name + ": invalid number.");
					hasError = true;
				}
				else
				{
					unmarkFieldError(fldErrorID);
				}
			}
		}		
	}

	if (gValidateFormMessage.length)
	{
		//document.all.errorMsgCell.innerHTML = gValidateFormMessage;
		showError(gValidateFormMessage);
	}
	else
	{
		hideError();
	}
	
	return gValidateFormMessage.length == 0; //!hasError;
}

function showError(errMsg)
{
	document.all.errorMsgCell.innerHTML = errMsg;
	if (document.all.errorMsgCell.parentNode)
	{
		document.all.errorMsgCell.parentNode.style.display = "inline";
	}
}

function hideError()
{
	if (document.all.errorMsgCell.parentNode)
	{
		document.all.errorMsgCell.parentNode.style.display = "none";
	}
}

function hideMessage()
{
	if (document.all.infoMsgCell.parentNode)
	{
		document.all.infoMsgCell.parentNode.style.display = "none";
	}
}

function reformatDate(s)
{
	if (s == "today")
	{
		var d = new Date();
		return "" + (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getYear();
	}
	else if (s == "yesterday")
	{
		var d = new Date() - 1;
		return "" + (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getYear();
	}
	else if (s == "tomorrow")
	{
		var d = new Date() + 1;
		return "" + (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getYear();
	}
	else if (s.length==6 && s.match("^[0-9]+$") != null)
	{
		return d.substr(2,2) + "/" + d.substr(0,2) + "/" + d.substr(4,2);
	}
	else if (s.length==8 && s.match("^[0-9]+$") != null)
	{
		return d.substr(2,2) + "/" + d.substr(0,2) + "/" + d.substr(4,4);
	}
	else
	{
		return s;
	}
}

function validateDate(d)
{
/*
	var seperator = "/";
	if (d.indexOf(".") >= 0)
	{
		seperator = ".";
	}
	else if (d.indexOf("-") >= 0)
	{
		seperator = "-";
	}
	var a = d.split(seperator);

*/
	var a = new Array();
	if (d.indexOf("/") >= 0)
	{
		a = d.split("/");
	}
	else if (d.indexOf(".") >= 0)
	{
		a = d.split(".");
	}
	else if (d.indexOf("-") >= 0)
	{
		a = d.split("-");
	}
	else
	{
		return false;
	/*
		if (d.length == 6)
		{
			a[0] = d.substr(0,2);
			a[1] = d.substr(2,2);
			a[2] = d.substr(4,2);			
		}
		else if (d.length == 8)
		{
			a[0] = d.substr(0,2);
			a[1] = d.substr(2,2);
			a[2] = d.substr(4,4);			
		}
		else
		{
			return false;
		}
		*/
	}

	if (a.length != 3)
	{
		return false;
	}

	if (a[0].match("^[0-9]+$") == null
		|| a[1].match("^[0-9]+$") == null
		|| a[2].match("^[0-9]+$") == null)
	{
		return false;
	}

	//assume the date format is mm/dd/yyyy
	return validateDateCore(a[2], a[0], a[1]);

}

function validateDateCore(y, m, d)
{
	if (y < 1 || y > 2099) return false;
	if (m < 1 || m > 12) return false;
	//if (d < 1 || d > 31) return false;

	if (y < 1000) y = parseInt(2000) + parseInt(y);
	if (y > 2099) return false;

	if ( (m==1 && d > 31)
		|| (m==3 && d > 31)
		|| (m==4 && d > 30)
		|| (m==5 && d > 31)
		|| (m==6 && d > 30)
		|| (m==7 && d > 31)
		|| (m==8 && d > 31)
		|| (m==9 && d > 30)
		|| (m==10 && d > 31)
		|| (m==11 && d > 30)
		|| (m==12 && d > 31) )
	{
		return false;
	}

	if (m == 2)
	{
		if (isLeapYear(y))
		{
			return d <= 29;
		}
		else
		{
			return d <= 28;
		}
	}

	return true;
}

function isLeapYear(year)
{
	return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}



	/*
	1. Cells being picked must have id defined as 
		<xsl:attribute name="id">record.<xsl:value-of select='position()'/></xsl:attribute>
	2. Item name must be defined in ez:pickName custom attribute
	3. Value is innerHTML, or ez:pickValue if defined.
	
	see SOShipStatusList.xsl
	*/
	function getPickItemNameValue(elt)
	{
		var name = "";
		if (elt.getAttribute("pickName"))
		{
			name = "" + elt.getAttribute("pickName");
		}

		var value = elt.innerHTML;
		if (elt.getAttribute("pickValue"))
		{
			value = "" + elt.getAttribute("pickValue");
		}
		return new Array(name, value);
	}

	function pickRecord(pickItemID)
	{
		//pickItemID is like "record.1"
		self.parent.document.all[self.frameElement.id].style.display = "none";
	//debugger;
		var retParams = new Array();
		var items = document.all[pickItemID];
		
		if (items.length == undefined) //Only 1 item in picked record.
		{		
			var a = getPickItemNameValue(items);			
			retParams[a[0]] = a[1];
		}
		else
		{
			for (var i = 0; i != items.length; ++i)
			{
				var a = getPickItemNameValue(items[i]);
				retParams[a[0]] = a[1];			
			}
		}
			
		self.parent.document.all[self.frameElement.id].src = '';

//alert(document.all("_PickType").value);
		self.parent.lookupFrameOnHide(retParams, document.all("_PickType").value);
		
	}

	function lookupFrameOnHide(returnParams, pickType)
	{
	
		//pickType is "CardNo" or "ItemNo"
		for (var x in returnParams)
		{
			if (document.all[x] != null)
			{
				setElementValue(document.all[x], xmlDecode(returnParams[x]));
				if (x == pickType)
				{
					document.all[x].setAttribute("currentValue", xmlDecode(returnParams[x]));
				}
			}
			else if (document.all[x + "Crit"] != null)
			{
				setElementValue(document.all[x + "Crit"], xmlDecode(returnParams[x]));
				if (x == pickType)
				{
					document.all[x + "Crit"].setAttribute("currentValue", 
						xmlDecode(returnParams[x]));
				}

			}

		}		
	}


function loadDom(url)
{
	var dom = new ActiveXObject("MSXML2.DOMDocument");
	dom.async = false;
	var flag = dom.load(url);
	if (flag == false) {
		with (dom.parseError) {
			error = "errorCode: " + errorCode + "\nline: " + line
				+ "\nlinepos: " + linepos + "\nreason: " + reason
				+ "srcText: " + srcText;
		}
		dom.loadXML("<Error/>");
		dom.selectSingleNode("/Error").text = error;
	}
	return dom;
}

function getProtocolHostPort()
{
	//this function return some like: http://maji/
	var s = new String(window.location);

	var n = s.indexOf("//") + 2;
	var n2 = s.indexOf("/", n);

	return s.substr(0, n2+1);
}

function getBasePage()
{
	var s = new String(window.location);
	var n = s.indexOf("?");

	if (n == -1)
	{
		return s;
	}
	else
	{
		return s.substr(0, n);
	}
}

function getCardLookupUrl(cardNo, cardType)
{
	//http://maji:8080/BeautyBeautyUSA/ezc.asp?_h=go&_md=Card&_ha=gmv&_sh=1&_tg=C&IsCustomer=1&_wnt=1&_wct=text/xml&Lookup=1&CardNo=C100001
	var s = getBasePage(); 
	s += "?_h=go&_md=Card&_ha=gmv&_sh=1&_wnt=1&_wct=text/xml&Lookup=1&CardNo=" + cardNo;
	
	if (cardType == "C")
	{
		s += "&_tg=C&IsCustomer=1";
		//s += "?_h=go&_md=Card&_ha=gmv&_sh=1&_tg=C&IsCustomer=1&_wnt=1&_wct=text/xml&Lookup=1&CardNo=" + cardNo;
	}
	else if (cardType == "V")
	{
		s += "&_tg=V&IsVendor=1";
		//s += "?_h=go&_md=Card&_ha=gmv&_sh=1&_tg=V&IsVendor=1&_wnt=1&_wct=text/xml&Lookup=1&CardNo=" + cardNo;
	}
	return s;
}
/*
function getVendorLookupUrl(cardNo)
{
	var url = getBasePage();
	url += "?_h=go&_md=Card&_ha=gmv&_sh=1&_tg=V&IsVendor=1&_wnt=1&_wct=text/xml&Lookup=1&CardNo=" + cardNo;
	return url;
}
*/
function getItemLookupUrl(itemNo)
{
	var url = getBasePage();
	url += "?_h=go&_md=Item&_ha=gsv&_wnt=1&_wct=text/xml&Lookup=1&ItemNo=" + itemNo;
	return url;
}

function performLookup(urlString)
{
//	var url = getCustomerLookupUrl(cardNo);
	var dom = loadDom(urlString);
	
	var result = new Array();
	
	if (dom.selectSingleNode("/Error"))
	{
		result["_Error"] = dom.selectSingleNode("/Error").text + "  url:" + urlString;
	}
	else if (!dom.selectSingleNode("/ez:Data/ez:System/@ez:Error"))
	{
		result["_Error"] = "Missing /ez:Data/ez:System/@ez:Error.  url:" + urlString;
	}
	else if (dom.selectSingleNode("/ez:Data/ez:System/@ez:Error").text != "")
	{
		result["_Error"] = dom.selectSingleNode("/ez:Data/ez:System/@ez:Error").text;
			//+ "  url:" + urlString;
	}
	else 
	{
		//[position()=1]
		var list = dom.selectNodes("/ez:Data/ez:Response/ez:Dataset/ez:Record/@*"); //dom.selectNodes("/ez:Data/ez:Dataset/ez:Record/@*");

		if (list.length)
		{
			result["_Error"] = "";
			for (var i = 0; i < list.length; ++i)
			{
				var elt = list.item(i);
				result[elt.name] = elt.text;
			}
		}
		else
		{
			result["_Error"] = "No record found.";			
		}

	}
	return result;	
}



/*
http://maji:8080/BeautyBeautyUSA/ezc.asp?_h=go&_md=Item&_ha=gsv&ItemNo=112&_wnt=1&_wct=text/xml&Lookup=1



http://maji:8080/BeautyBeautyUSA/ezc.asp?_h=go&_md=Card&_ha=gmv&_sh=1&_tg=C&IsCustomer=1&CardNo=C100001&_nt=1&_ct=text/xml
*/
function showFindItemFrame(itemNo)
{
	//_sh: suppress header
	hideError();
	hideMessage();
	document.all.lookupFrame.style.display = "inline";		
	document.all.lookupFrame.src = "ezc.asp?_h=go&_md=Item&_ha=gmv&_tpl=ItemPick.xsl"
		+ "&_sh=1&_gs=12&ItemNo=" + itemNo;		
}

function showFindCardFrame(cardNo, cardType)
{
//debugger;
	hideError();
	hideMessage();
	document.all.lookupFrame.style.display = "inline";		
	if (cardType == "C")
	{
		document.all.lookupFrame.src = "/BeautyBeautyUSA/ezc.asp?_h=go&_md=Card"
			+ "&_ha=gmv&_sh=1&_tpl=CardPick.xsl&_gs=12&_tg=C&IsCustomer=1"
			+ "&CardNo=" + cardNo;
	}
	else if (cardType == "V")
	{
		document.all.lookupFrame.src = "/BeautyBeautyUSA/ezc.asp?_h=go&_md=Card"
			+ "&_ha=gmv&_sh=1&_tpl=CardPick.xsl&_gs=10&_tg=V&IsVendor=1"
			+ "&CardNo=" + cardNo;
	}
}
/*
function showFindCustomerFrame(cardNo)
{
//debugger;
	hideError();
	hideMessage();
	document.all.lookupFrame.style.display = "inline";		
	document.all.lookupFrame.src = "/BeautyBeautyUSA/ezc.asp?_h=go&_md=Card"
		+ "&_ha=gmv&_sh=1&_tpl=CardPick.xsl&_gs=12&_tg=C&IsCustomer=1"
		+ "&CardNo=" + cardNo;
}

function showFindVendorFrame(cardNo)
{
	hideError();
	hideMessage();
	document.all.lookupFrame.style.display = "inline";		
	document.all.lookupFrame.src = "/BeautyBeautyUSA/ezc.asp?_h=go&_md=Card"
		+ "&_ha=gmv&_sh=1&_tpl=CardPick.xsl&_gs=10&_tg=V&IsVendor=1"
		+ "&CardNo=" + cardNo;
}
*/

function cardNoOnBlur(elt, cardNameFieldName, cardType)
{
	var val = elt.value;
	var frm = elt.form;
//debugger;
	hideError();
	hideMessage();

	if (val.length==0)
	{
		//frm.elements[cardNameFieldName].value = "";
		elt.value = "";
		elt.setAttribute("currentValue", "");
		return;
	}
	else if (val == elt.getAttribute("currentValue"))
	{
		return;
	}

//*********
//********* use getVendorLookupUrl if need!!!
//*********
	var url = getCardLookupUrl(val, cardType);

	var result = performLookup(url);

	if (result["_Error"].length)
	{
		showError(result["_Error"]);
		frm.elements[cardNameFieldName].value = "";
		elt.setAttribute("currentValue", "");
		return;
	}
	else
	{
		frm.elements[cardNameFieldName].value = result["CardName"];
		elt.setAttribute("currentValue", val);
	}
}

function itemNoOnBlur(elt, itemNameFieldName, cardNo, pos)
{
//1. If cardNo is not "", set CardNo in url so that the price will return

	var val = elt.value;
	var frm = elt.form;
//debugger;
	hideError();
	hideMessage();

	if (val.length==0)
	{
		elt.value = "";
		elt.setAttribute("currentValue", "");
		return;
	}
	else if (val == elt.getAttribute("currentValue"))
	{
		return;
	}

	var url = getItemLookupUrl(val);
	if (cardNo != '')
	{
		url += "&CardNo=" + cardNo;
	}
	var result = performLookup(url);

	if (result["_Error"].length)
	{
		showError(result["_Error"]);
		frm.elements[itemNameFieldName + "." + pos].value = "";
		
		if (cardNo.length)
		{
			frm.elements["Price." + pos].value = "";
		}
		
		elt.setAttribute("currentValue", "");
		return;
	}
	else
	{
		frm.elements[itemNameFieldName + "." + pos].value = result["ItemDescription"];

//		if (frm.elements["Price." + pos])
		if (cardNo.length)
		{
			frm.elements["Price." + pos].value = result["Price"];
		}
		//		document.all["Price." + m_currentRowIndex].value = returnParams["Price"];
		elt.setAttribute("currentValue", val);
	}
}

// 2009-02-25
function setFormFocus()
{
	var frm =  document.forms[0];
	for (var i = 0; i < frm.length; i++)
	{
		var elt = frm.elements[i];
		if ((elt.tagName == "SELECT" || elt.tagName == "INPUT" || elt.tagName == "TEXTAREA")
			&& elt.type != "hidden"  && elt.type != "submit" && elt.tabIndex != -1)
		{
			try { 
				elt.focus(); 
			}
			catch(oErr)
			{}
			break;
		}
	}
}
