//**** Parameters
//	confirmPost
//	0 - discard changes even if hasChanged() returns true
//	1 - prompt user on whether to post if hasChanged() returns true
//		Signal_OK() is called if the user selects to save the changes
//	2 - always post changes if hasChanged() returns true
//	3 - submit changes regardless of hasChanged()
//	4 - Same as 1 except the okURL is used.
//	5 - Allways change screen  <KH0060005> 2006/7/31 Topaz User Pro(FIX3)
//	okURL - only used if confirmPost=4
//
function onChangePage(newURL, confirmPost, targetTop, okURL) {
	var subForm = document.forms["theSubForm"];
	subForm.elements["newURL"].value = newURL.substring(newURL.indexOf("?") + 1, newURL.length);

	if (confirmPost == 3) {
		// Submit changes always
		onSubmitPage(newURL, targetTop);
		return;	
	}

	if (hasChanged() == 1) {
		if ( (confirmPost == 1) || (confirmPost == 4) ) {
			// Promt user on whether to submit changes
			if(confirm( ErrList["confirmSubmit"] ))
			{
				if (confirmPost == 1) {
					Signal_OK(targetTop);
					return;
				}
				else {
					// Submit changes using okURL
					onSubmitPage(okURL, targetTop);
					return;
				}
			}
		}
		else if (confirmPost == 2) {
			// Submit changes always
			onSubmitPage(newURL, targetTop);
			return;
		}
		// <KH0060005> 2006/7/31 Topaz User Pro(FIX3)
		else if (confirmPost == 5)
		{
			if(confirm( ErrList["confirmSubmit"] ))
			{
				// firstly saved changed data
				if( onSubmitPage("PCPro.htm?OK()", 2) == true )
				{
					// secondly go to the wait screen.
					onSubmitPage(okURL, targetTop);
				}
				return;
			}
		}
		// <KH0060005> 2006/7/31 Topaz User Pro(FIX3)
	}

	if (targetTop == 1)
		top.location =  escape(newURL);
	else
		location = escape(newURL);
}

// Submit form data regardless.
function onSubmitPage(url, targetTop) {
	var form = null;
	var dataForm = document.forms["theDataForm"];
	var subForm = document.forms["theSubForm"];

	if(hasValidator() == true) {
		if(ValidatePage(dataForm) == false)
			return false; // <KH0060005> 2006/7/31 Topaz User Pro(FIX3)
	}

	subForm.elements["formData"].value = "(";
	if(hasPreSubmit() == true) {
		subForm.elements["formData"].value += PreSubmit(dataForm);
	}

	if(hasPrepareSubmitData() == true) {
		subForm.elements["formData"].value += PrepareSubmitData(dataForm);
	}
	subForm.elements["formData"].value += ")";

	subForm.method = "POST";
	subForm.action = escape(url);
	if (targetTop == 1)
		subForm.target = "_top";

	subForm.submit();
	return true;// <KH0060005> 2006/7/31 Topaz User Pro(FIX3)
}

function doCheckBoxPreSubmit( theForm ) {
	var result = "";
	for( var i = 0 ; i < theForm.length; i++) {
		var element = theForm.elements[i];
		if( element.type == "checkbox" ) {
			if( eval("element.checked") == true )
				result += "1";
			else
				result += "0";
		}
	}
	return result;
}

function hasChanged() {
	var form = document.forms["theDataForm"];

	// The slider cannot update the dirty flag so we do it manually.
	for (i=0; i < form.length; i++) {
		if (form.elements[i].dirty != null) {
			if (form.elements[i].dirty != 0) {			
				ElInfo_SetDirty(form.elements[i]);
			}
		}
	}

	if (form.elements["hasDataChanged"].value != 0)
		return 1;

	// Check each element, just in case
	for (i=0; i < g_elInfoList.length; i++) {
		if (g_elInfoList[i].dirty != 0) {
			form.elements["hasDataChanged"].value = 1;
			return 1;
		}
	}
	return 0;
}

function hasValidator() {
	return typeof (ValidatePage) == "function";
}

function hasPreSubmit() {
	return typeof (PreSubmit) == "function";
}

function hasPrepareSubmitData() {
	return typeof (PrepareSubmitData) == "function";
}

function SetIsDirty(elName) {
	var dataForm = document.forms["theDataForm"];
	for (var i=0; i < dataForm.length; i++) {
		if (dataForm.elements[i].name == elName) {
			ElInfo_SetDirty(dataForm.elements[i]);
			return;
		}
	}
}

//----- SIGNALS
function Signal_Login(targetTop) {
// <KH0050001> 2005.2.7 国内5th開発
//	onChangePage("PCPro.htm?LOGIN()", 2, targetTop);
	onChangePage("PCPro.htm?LOGIN()", 3, targetTop);
}

function Signal_Logout(shouldPrompt, targetTop) {
	var result = 1;

	if (shouldPrompt)
		result = confirm(ErrList["confirm"]);

	if (result)
		onChangePage("PCPro.htm?LOGOUT()", 0, targetTop);
}

function Signal_OK(targetTop) {
	onChangePage("PCPro.htm?OK()", 2, targetTop);
}

function Signal_Apply(targetTop) {
	if(hasChanged() == 1)
		onChangePage("PCPro.htm?APPLY()", 3, targetTop);
}

function Signal_Cancel(doPrompt, targetTop) {
	if (doPrompt)
		onChangePage("PCPro.htm?CANCEL()", 1, targetTop);
	else
		onChangePage("PCPro.htm?CANCEL()", 0, targetTop);
}

function Signal_Help(helpPageUrl) {
	if (helpPageUrl.length = 0) {
		alert(ErrList["noHelp"]);
		return;
	}
	window.open(helpPageUrl, "Help", "scrollbars=yes, resizable=yes, width=600, height=600");
}

function Signal_HelpOffline(helpPageUrl) {
	if (helpPageUrl.length = 0) {
		alert(ErrList["noHelp"]);
		return;
	}
	onChangePage("PCPro.htm?HELP(" + helpPageUrl + ")", 0, 0);
}

function Signal_ChangeSysData(field, value, targetTop) {
	var url;
	url = "PCPro.htm?CHG_SYSDATA(" + field + "," + value + ")";
	onChangePage(url, 2, targetTop);
}

function Signal_Feature(featureId, page, whichPort, targetTop) {
	var url;
	url = "PCPro.htm?FEATURE(" + featureId + "," + page + "," + whichPort + ")";
	onChangePage(url, 2, targetTop);
}

function Signal_FeatureWithLogin(featureId, page, whichPort, targetTop) {
	var url;
	url = "PCPro.htm?FEATURE_LOGIN(" + featureId + "," + page + "," + whichPort + ")";
	onChangePage(url, 2, targetTop);
}

function Signal_FeatureOk(featureId, page, whichPort, targetTop) {
	var url;
	url = "PCPro.htm?FEATURE_OK(" + featureId + "," + page + "," + whichPort + ")";
	onChangePage(url, 2, targetTop);
}

function Signal_FeatureCancel(featureId, page, whichPort, doPrompt, targetTop) {
	var url;
	var okURL;

	url = "PCPro.htm?FEATURE_CANCEL(" + featureId + "," + page + "," + whichPort + ")";
	okURL = "PCPro.htm?FEATURE_OK(" + featureId + "," + page + "," + whichPort + ")";

	if (doPrompt)
		onChangePage(url, 4, targetTop, okURL);
	else
		onChangePage(url, 0, targetTop);
}

function Signal_FeatureOkWithLogout(featureId, page, whichPort, targetTop) {
	var url;
	url = "PCPro.htm?FEATURE_OK_LOGOUT(" + featureId + "," + page + "," + whichPort + ")";
	onChangePage(url, 2, targetTop);
}

function Signal_FeatureCancelWithLogout(featureId, page, whichPort, doPrompt, targetTop) {
	var url;
	var okURL;

	url = "PCPro.htm?FEATURE_CANCEL_LOGOUT(" + featureId + "," + page + "," + whichPort + ")";
	okURL = "PCPro.htm?FEATURE_OK_LOGOUT(" + featureId + "," + page + "," + whichPort + ")";

	if (doPrompt)
		onChangePage(url, 4, targetTop, okURL);
	else
		onChangePage(url, 0, targetTop);
}

function Signal_Goto(whichState, targetTop) {
	var url;
	url = "PCPro.htm?GOTO(" + whichState + ")";
	onChangePage(url, 2, targetTop);
}

function Signal_SysInit(initType, targetTop) {
	var url;

	if (confirm(ErrList["areYouSure"]))
	{
		url = "PCPro.htm?SYSINIT(" + initType + ")";
		onChangePage(url, 2, targetTop);
	}
}

function Signal_CopySwap(appliesTo, operation, targetTop) {
	var url;
	url = "PCPro.htm?COPYSWAP(" + appliesTo + "," + operation + ")";
	onChangePage(url, 2, targetTop);
}

function Signal_Clear(clearType, port, targetTop) {
	var url;
	url = "PCPro.htm?CLEAR(" + clearType + "," + port + ")";
	onChangePage(url, 2, targetTop);
}

function Signal_Backup(targetTop) {
	onChangePage("PCPro.htm?BACKUP()", 2, targetTop);
}

function Signal_Restore(targetTop) {
	var subForm = document.forms["theFileForm"];

	if (subForm.elements["fileName"].value.length <= 0)
	{
		alert(ErrList["noRestoreFile"]);
		return;
	}

	subForm.method = "POST";
	subForm.action = "PCPro.htm?RESTORE()";
	if (targetTop == 1)
		subForm.target = "_top";

	subForm.submit();
	return;
}

function Signal_SpdBin(whichBin, targetTop) {
	var url;
	url = "PCPro.htm?SPDBIN(" + whichBin + ")";
	onChangePage(url, 2, targetTop);
}

function Signal_InitTel(whichPort, targetTop) {
	var url;
	url = "PCPro.htm?INITTEL(" + whichPort + ")";
	onChangePage(url, 2, targetTop);
}

//<KH0050012>(GE/US) 2005/9/26
function Signal_FillDelete(appliesTo, targetTop) {
	var url;
	url = "PCPro.htm?FILLDELL(" + appliesTo + ")";
	onChangePage(url, 2, targetTop);
}

function GoChangeSysData(field, ctrlName, targetTop, confirmPost) {
	var form = document.forms["theLinksForm"];
	var url;
	var val;
	//change any '/' to '\'
	val = form.elements[ctrlName].value;
	val = val.replace("/", ":");
	url = "PCPro.htm?CHG_SYSDATA(" + field + "," + val + ")";
	onChangePage(url, confirmPost, targetTop);
}

function OnChangeSysData(sel, field, targetTop) {
	var url;
	url = "PCPro.htm?CHG_SYSDATA(" + field + "," + sel.options[sel.selectedIndex].value + ")";
	onChangePage(url, 2, targetTop);
}

function OnNextSysData(whichKey, count, targetTop, confirmPost) {
	var form = document.forms["theLinksForm"];
	var url;
	url = "PCPro.htm?NEXT_SYSDATA(" + whichKey + "," + count + ")";
	onChangePage(url, confirmPost, targetTop);
}

function OnPrevSysData(whichKey, count, targetTop, confirmPost) {
	var form = document.forms["theLinksForm"];
	var url;
	url = "PCPro.htm?PREV_SYSDATA(" + whichKey + "," + count + ")";
	onChangePage(url, confirmPost, targetTop);
}

//+++++ Helper functions
var g_hex = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");

// decimal to any other base 2 to 16
function DecimaltoAnother(A, radix) {
	var s = "";
	while (A >= radix) {
		s += g_hex[A % radix];  // remainder
		A = Math.floor(A / radix); // quotient, rounded down
	}
	s += g_hex[A];
	return transpose(s);
}

// string reversal
function transpose(s) {
	N = s.length;
	var t;
	for (i=0, t=""; i < N; i++)
		t += s.substring(N-i-1, N-i); // s.substring(from, to)

	return t;
}

function BinaryToDec(value) {
	return parseInt(value, 2);
}

function HexToDec(value) {
	return parseInt(value, 16);
}

function ConvertByteArray(value, separator) {
	var v;
	var hexVal;
	var i;

	var byteArray = value.split(separator);
	if (byteArray == null)
		return value;

	v = "";
	for (i=0; i < byteArray.length; i++)
	{
		hexVal = "" + DecimaltoAnother( parseInt(byteArray[i], 10), 16 );
		if (hexVal.length < 2)
			hexVal = "0" + hexVal;	// Pad with zero
		v += hexVal;
	}
	return HexToDec(v);
}

function ConvertNibbleArray(value, separator) {
	var v;
	var hexVal;
	var i;

	var nibbleArray = value.split(separator);
	if (nibbleArray == null)
		return value;

	v = "";
	for (i=0; i < nibbleArray.length; i++)
	{
		hexVal = "" + DecimaltoAnother( parseInt(nibbleArray[i], 10), 16 );
		v += hexVal;
	}
	return HexToDec(v);
}

function ConvertByteArrayHex(value, separator) {
	var v;
	var i;

	var byteArray = value.split(separator);
	if (byteArray == null)
		return value;

	v = "";
	for (i=0; i < byteArray.length; i++)
	{
		v += byteArray[i];
	}
	return HexToDec(v);
}

function IntWithHash_Format(value) {
	if (value == "#")
		return HexToDec("FFFF");

	return value;
}

// Doesn't allow the 'Enter' key to be processed. Sometimes
//this keypress causes the browser to change URL
function LinksForm_KeyPress() {
	if (event.keyCode == 13)
		return false;

	return true;
}

//Initalise the slider control
function InitSlider(name, min, max, display_min, display_max, display_unit, fmtStr, ticFreq, read_only, specialVal, value) {
	var form = document.forms["theDataForm"];
	var i;
	var sliderCount;
	var slider;

	for (i=0; i < form.length; i++) {
		if (form.elements[i].type != "slider")
			continue;

		slider = form.elements[i];
		if (slider.name == name) {
			slider.min			= min;
			slider.max			= max;
			slider.display_min	= display_min;
			slider.display_max	= display_max;
			slider.display_unit	= display_unit;
			slider.fmtStr		= fmtStr;
			slider.ticFreq		= ticFreq;
			slider.read_only	= read_only;
			slider.specialValue	= specialVal;
			slider.value		= value;
		}
	}
}

ElementInfo.prototype.name;
ElementInfo.prototype.submitName;
ElementInfo.prototype.dirty;
ElementInfo.prototype.validator;
ElementInfo.prototype.dependency;
ElementInfo.prototype.prepareSubmit;
ElementInfo.prototype.onValue;	/* Used for check boxes only */
ElementInfo.prototype.offValue;

function ElementInfo(name, submitName, dirty, validator, dependency, prepareSubmit, onVal, offVal) {
	this.name = name;

	if (submitName.length > 0)
		this.submitName = submitName;
	else
		this.submitName = name;

	this.dirty = dirty;
	this.validator = validator;
	this.dependency = dependency;
	this.prepareSubmit = prepareSubmit;
	this.onValue = onVal;
	this.offValue = offVal;
}

function ElInfo_Find(element) {
	for (var i=0; i < g_elInfoList.length; i++) {
		if (g_elInfoList[i].name == element.name)
			return i;
	}
	return -1;
}

function ElInfo_SetDirty(element) {
	var i;
	i = ElInfo_Find(element);
	if (i < 0)
		return;

	document.forms["theDataForm"].elements["hasDataChanged"].value = 1;
	g_elInfoList[i].dirty = 1;
}

function ElInfo_IsDirty(element) {
	i = ElInfo_Find(element);
	if (i < 0)
		return 0;

	return g_elInfoList[i].dirty;
}

var g_elInfoList = new Array();


function OnLoad_Login() {
	document.forms["theDataForm"].elements["userName"].focus();
}



// <KH0050001> 2005.2.7 国内5th開発
// 頁が表示されたとき、フォーカスを画面の先頭に移動させる。
function OnLoad_SysDataPage(){
	var dataForm = document.forms["theDataForm"];
	
	for (var i=0; i<g_elInfoList.length; i++ )
	{
		for (var j=0; j< dataForm.length; j++ )
		{
			if( g_elInfoList[i].name == dataForm.elements[j].name )
			{
				if( dataForm.elements[j].disabled == true )
				{
					continue;
				}
				if( dataForm.elements[j].type == "slider" ){
					continue;
				}
				
				dataForm.elements[j].focus();
				if( dataForm.elements[j].type != "select-one" ){
					dataForm.elements[j].select();
				}
				return
			}
		}
	}
}

// <KH0060005> 2006/5/24 GE/US6th User Pro
function ElInfo_InputRange(element)
{
	var validator;
	var elIndex = ElInfo_Find(element);
	if( elIndex < 0 )
	{
		return;
	}
	valList = g_elInfoList[elIndex].validator.split(",");
	for(j=0; j < valList.length; j++ ) 
	{
		validator = g_elementValidator[valList[j]];
		if(validator == null )
		{
			continue;
		}
		var txt = validator.validationMessage;
		if( txt == "" )
		{
			txt = ErrList["rangeError"] + validator.min + ErrList["to"] + validator.max;
		
		}
		var range = document.createTextNode(txt);
		var elem = document.getElementById("InputRangeBottom");
		elem.replaceChild(range, elem.firstChild);
	}
}


// <KH0060005> 2006/7/31 Topaz User Pro(FIX3)
function Signal_Wait(whichState, targetTop) {
	var url;
	url = "PCPro.htm?GOTO(" + whichState + ")";
	onChangePage(url, 5, targetTop, url);
}
