// List of helper windows opened/used by the main windows
var g_winList = new Array();
var g_activeElement_theLinksForm = null;
var g_activeElementValue_theLinksForm = "";
var g_helpText = new Array();
var g_sessionId = -1;

function op() {}

HelpText.prototype.id = "";
HelpText.prototype.divName = "";
HelpText.prototype.text = "";

function HelpText(id, divName, text) {
	this.id = id;
	this.divName = divName;
	this.text = text;
}

function Hlp(id, divName, text) {
	var str = text.replace(/`/g, '"');
	str = str.replace(/\n/g, '<br />');
	g_helpText[g_helpText.length++] = new HelpText(id, divName, str);
}

function HelpText_Find(id) {
	for (i=0; i < g_helpText.length; i++) {
		if (g_helpText[i].id == id)
			return g_helpText[i];
	}
	return null;
}

function HelpText_Show(divName, regEx_Id) {
	var str = "";

	for (i=0; i < g_helpText.length; i++) {
		if (divName != g_helpText[i].divName) continue;
		if (!regEx_Id.test(g_helpText[i].id)) continue;

		if (str.length > 0)
			str += "<br /><br />";

		str += g_helpText[i].text;
	}

	WriteToLayer(divName, str);
}

function MsgBox_Show(str) {
	WriteToLayer("msgBox", str);
}

// Does the work of writing the string to the div.
function WriteToLayer(name, aString) {
	var layer;
	// W3C DOM
	if(document.getElementById) {
		layer = document.getElementById(name);
		if (layer != null) {
			layer.style.visibility = 'visible';
			layer.innerHTML = aString;
		}
	}
	// Netscape DOM
	else if (document.layers) {
		layer = document.layers[name];
		if (layer != null) {
			layer.document.nstip.document.write(aString);
			layer.document.nstip.document.close();
		}
	}
	// IE DOM
	else if (document.all && document.readyState == "complete") {
		layer = document.all[name];
		if (layer != null)
			layer.innerHTML = aString;
	}
}

function GetWin(winName) {
	var win;
	if (parent != null)
		win = parent.g_winList[winName];// Use the window list in the parent
	else
		win = g_winList[winName];

	return win;
}
function SetWin(winName, win) {
	if (parent != null)
		parent.g_winList[winName] = win;
	else
		g_winList[winName] = win;
}

function GetWinOpener(win) {
	if (win.opener != null) {
		return win.opener;
	}
	return win.parent.opener;
}

/**** Parameters
confirmPost
0 - discard changes even if hasChanged() returns true
1 - prompt user on whether to post if hasChanged() returns true. Changes are submitted only 
	if the user selects OK, otherwise they are discarded.
2 - always post changes if hasChanged() returns true
3 - submit changes regardless of hasChanged()
4 - Same as 1 except the okURL is used.
okURL - not used if confirmPost=1

targetType
0 - target is _blank
1 - target is _self
2 - target is _top
3 - target is _parent
4 - target is window.opener or window.parent.opener (if the first is null)
*/	
function onChangePage(newURL, confirmPost, targetType, okURL) {
	var subForm = document.forms["theSubForm"];

	if (confirmPost == 3)
		return onSubmitPage(newURL, targetType);// Submit changes always

	if ( (confirmPost != 0) && (hasChanged() == 1) ) {
		if ( (confirmPost == 1) || (confirmPost == 4) ) {
			// Promt user on whether to submit changes
			if(confirm( ErrList["confirmSubmit"] ))
			{
				if (confirmPost == 1)
					return onSubmitPage(newURL, targetType);
				else
					return onSubmitPage(okURL, targetType);// Submit changes using okURL
			}
		}
		else if (confirmPost == 2)
			return onSubmitPage(newURL, targetType);// Submit changes always
	}

	var _URL = BuildURL(newURL);
	switch (targetType)
	{
	case(2): top.location = escape(_URL); break;
	case(3): parent.location = escape(_URL); break;
	case(4): var win = GetWinOpener(window); win.location = escape(_URL); break;
	default: window.location = escape(_URL);
	}
	return true;
}

// Submit form data regardless.
function onSubmitPage(url, targetType) {
	var form = null;
	var dataForm = document.forms["theDataForm"];
	var subForm = document.forms["theSubForm"];
	var submitData = "";
	var i;

	subForm.elements["formData"].value = "";
	i = ValidatePage(dataForm);
	if (i < 0)
		return false;

	if ((i==0) && hasPrepareSubmitData()) {
		submitData = PrepareSubmitData(dataForm);
	}
	if (HasSysResetReq(submitData)) {
	    if (confirm(ErrList["resetReq"])) {
	        targetType = 3;
	    }
	    else {
	        // Use dont want to reset now, so remove reset request
	        submitData = RemoveSysResetReq(submitData);
	    }
	}
	
	if (submitData.length > 0) {
	    subForm.elements["formData"].value = g_postProcType + g_pairSeparator + submitData;
	}

	var _URL = BuildURL(url);
	subForm.method = "POST";
	subForm.action = escape(_URL);
	switch (targetType)
	{
	case(0): subForm.target = "_blank"; break;
	case(1): subForm.target = "_self"; break;
	case(2): subForm.target = "_top"; break;
	case(3): subForm.target = "_parent"; break;
	case(4): var win = GetWinOpener(window); subForm.target = win.name; break;
	}
	subForm.submit();
	return true;
}

function BuildURL(url) {
	var urlPart ="";
	var argsPart = "";
	var newURL = "";
	
	urlPart = url.substring(0, url.indexOf("?"));
	argsPart = url.substring(url.indexOf("?") + 1, url.length);

	newURL = urlPart + "?" + "sessionId=" + g_sessionId;
	if (argsPart.length > 0)
		newURL += "&" + argsPart;
		
	return newURL;
}

function FormatSysResetReq() {
    return "reset" + g_nameSeparator + "1";
}

function HasSysResetReq(submitData) {
    return submitData.lastIndexOf( FormatSysResetReq() ) >= 0;
}

function RemoveSysResetReq(submitData) {
    var searchStr = g_pairSeparator + FormatSysResetReq();
    var i = submitData.indexOf(searchStr);
    if (i < 0) {
        searchStr = FormatSysResetReq();
        i = submitData.indexOf(searchStr); 
    }

    if (i >= 0) {
        var str = submitData.substring(0, i);
        str += submitData.substr(i + searchStr.length);
        return str;
    }
    
    return submitData;
}

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)
				El_SetDirty(form.elements[i]);
		}
	}

	if (form.elements["hasDataChanged"].value != 0)
		return 1;

	// Check each element, just in case
	for (i=0; i < g_el.length; i++) {
		if (g_el[i].dirty != 0) {
			form.elements["hasDataChanged"].value = 1;
			return 1;
		}
	}
	return 0;
}

function OnLoad_Default(bShowHelp, bPromptForReset) {
	var linksForm = document.forms["theLinksForm"];
	var dataForm = document.forms["theDataForm"];
	var el;
	var re = /[.]*/;	// match all
	var bSelSet = false;

	// Show help
	if (bShowHelp) {
		HelpText_Show("helpText1", re);
		HelpText_Show("helpText2", re);
	}

	if (linksForm) {
		if (linksForm.length > 0) {
			el = linksForm.elements[0];
			LinksForm_SetActiveElement(el);
			LinksForm_SetActiveElementValue(GetHTMLElementValue(el));
			SelectHTMLElement(el);
			bSelSet = true;
		}
	}
	// focus not set in the linksForm, so set focus to 1st element in dataFrm
	if (!bSelSet && dataForm) {
		for (i=0; i < dataForm.length; i++) {
			el = dataForm.elements[i];
			if ( (el.type == "hidden") || (el.disabled) )
				continue;

			SelectHTMLElement(el);
			bSelSet = true;
			break;
		}
	}
	
	if (bPromptForReset) {
	    if (confirm(ErrList["resetReq"]))
	        Signal_Logout("", false, 1, "2");
	    else
	        Signal_Logout("", false, 1, "1");
	}
}

/* possible return values are:
< 0: errors, (no pg change)
> 0: errors, but ignore (ie pg changed but no data submitted)
  0: no errors (submit data)
*/
function ValidatePage(dataForm) {
	if (typeof (OnValidatePage) != "function")
		return 0;//OK

	return OnValidatePage(dataForm);// Call page specific validation func
}

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) {
			El_SetDirty(dataForm.elements[i]);
			return;
		}
	}
}

function MakeURL(url) {
	if (url != null) {
		if (url.length > 0)
			return url;
	}
	return "WebPro.htm";
}

function OnSysDataKey(url, whichKey, ctrlName, confirmPost, targetType) {
	var form = document.forms["theLinksForm"];
	var dataForm = document.forms["theDataForm"];
	var val;
	var i;

	//change any '/' to '\'
	val = GetHTMLElementValue(form.elements[ctrlName]);
	val = val.replace(/[\/]/g, ":");

	if (!Signal_SysDataKey(url, whichKey, val, confirmPost, targetType))
		LinksForm_RestoreActiveElementValue();
}

function OnSysDataKeyCopyFrom(url, whichKey, ctrlName, confirmPost, targetType) {
	var dataForm = document.forms["theDataForm"];
	var val;
	var i;

	//change any '/' to '\'
	val = GetHTMLElementValue(dataForm.elements[ctrlName]);
	val = val.replace(/[\/]/g, ":");

	if (!Signal_SysDataKey(url, whichKey, val, confirmPost, targetType))
		LinksForm_RestoreActiveElementValue();
}

function OnSysDataCategory(url, ctrlName, confirmPost, targetType) {
	var form = document.forms["theLinksForm"];
	var val;
	var valList;

	// val = <categoryId>,<group number>,<sdId>
	val = GetHTMLElementValue(form.elements[ctrlName]);
	valList = val.split(",");
	return Signal_SysDataCategory(url, valList[0], valList[1], valList[2], confirmPost, targetType);
}

function OnChangeKTSSite(element, url, confirmPost, targetType) {
	var whichSite = GetHTMLElementValue(element);
	return Signal_KTSSite(url, whichSite, '', confirmPost, targetType);
}

function OnSysId(url, ctrlName, confirmPost, targetType) {
	var form = document.forms["theLinksForm"];
	var val = GetHTMLElementValue(form.elements[ctrlName]);
	return Signal_SysId(url, val, confirmPost, targetType);
}

//+++++ 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;
}

function TrimStr(str, chr) {
	if (str.length <= 0)
		return str;

	return str.substring(0, str.length - chr.length);
}

function Event_GetCharCode(e) {
	e = (e) ? e : event;
	if (e.which)
		return e.which;
	else
		return e.keyCode;	// IE
}

// Doesn't allow the 'Enter' key to be processed. Sometimes
//this keypress causes the browser to change URL because a submit is performed
function Form_NoKeyPress(e) {
	return (Event_GetCharCode(e) != 13);
}

function LinksForm_KeyPress(e) {
	if (Event_GetCharCode(e) != 13)
		return true;

	if (g_activeElement_theLinksForm == null)
		return false;	// No element has focus

	var name = g_activeElement_theLinksForm.name;
	var whichKey;
	var keyName = "mbBase";
	var i = name.indexOf(keyName);
	if (i < 0)
		return false;

	whichKey = name.substr(i + keyName.length);
	OnValidateSysDataKey(null, whichKey, name, 2, 1);
	return false;
}

function LinksForm_SetActiveElement(element) {
	g_activeElement_theLinksForm = element;
}

function LinksForm_SetActiveElementValue(value) {
	g_activeElementValue_theLinksForm = value;
}

function LinksForm_RestoreActiveElementValue() {
	if (g_activeElement_theLinksForm)
		SetHTMLElementValue(g_activeElement_theLinksForm, g_activeElementValue_theLinksForm);
}

function getFileName(fileNamePath){
	if(typeof(fileNamePath) != "string")
		return "";
	
	var lastSlash = fileNamePath.lastIndexOf("\\");
	if(lastSlash == -1)
		lastSlash = fileNamePath.lastIndexOf("/");
	return fileNamePath.substring(lastSlash+1, fileNamePath.length);
}

function getExtension(fileNamePath){
	if(typeof(fileNamePath) != "string")
		return "";
	
	var lastFullStop = fileNamePath.lastIndexOf(".");
	return fileNamePath.substring(lastFullStop, fileNamePath.length);
}

function matchExtension(extension, extensions){
	var extensionLower = extension.toLowerCase();
	var extensionsLower = extensions.toLowerCase();

	return (extensionsLower.indexOf(extensionLower) > -1);
}

function setPointer() {
	if (document.all) 
		for (var i=0; i < document.all.length; i++) document.all(i).style.cursor = 'wait'; 
} 

function resetPointer() {
	if (document.all) 
		for (var i=0;i < document.all.length; i++) 
			document.all(i).style.cursor = 'default'; 
}

function GetHTMLElementValue(element) {
	switch(element.type) {
	case "text":
	case "password":
	case "hidden":
	case "button":
	case "file":
		return element.value;

	case "combobox":
	case "select-one":
		if (element.selectedIndex >= 0)
			return element.options[element.selectedIndex].value;
		break;

	case "checkbox":
		if(element.checked)
			return 1;
		else
			return 0;

	case "select-multiple":
		var value = "";
		for(var i=0; i < element.length; i++) {
			if( !element.options[i].selected )
				continue;

			value += element.options[i].value + g_valueSeparator;
		}
		value = TrimStr(value, g_valueSeparator);
		return value;
		
	default:
		//case "radio":
		for (var i=0; i < element.length; i++) {
			if (element[i].checked){
				return element[i].value;
			}
		}
		break;
	};
	return "";
}
function SetHTMLElementValue(element, value) {
	switch(element.type) {
	case "text":
	case "password":
	case "hidden":
	case "button":
	case "file":
		element.value = value;
		return true;

	case "combobox":
	case "select-one":
		for (var i=0; i < element.length; i++) {
			if (element.options[i].value == value) {
				element.selectedIndex = i;
				return true;
			}
		}
		return false;

	case "checkbox":
		if (value == 0)
			element.checked = false;
		else
			element.checked = true;

		return true;

	case "radio":
		if (element.value == value) {
			element.checked = true;
			return true;
		}
		return false;
	
	case "select-multiple":
		Sel_SelectMultiple(element, value);
		return true;
	};
	return false;
}

function SelectHTMLElement(element) {
	switch(element.type) {
	case "text":
	case "password":
	case "button":
	case "file":
		element.focus();
		element.select();
		break;

	case "combobox":
	case "select-one":
	case "select-multiple":
	case "checkbox":
	case "radio":
		element.focus();
		break;
	};
}

//----- Selection box helper functions
function Sel_Erase(element) {
	element.options.length = 0;
}
function Sel_Build(element, valList) {
	Sel_Erase(element);
	for (var i=0; i < valList.length; i++)
		element.options[i] = new Option(valList[i].a, valList[i].b);
}
function Sel_Clear(element) {
	if (element.selectedIndex < 0) return;
	for (var i=element.selectedIndex; i < element.length; i++)
		element.options[i].selected = false;
}
function Sel_SelectAll(element, bSelect) {
	var i;
	for (var i=0; i < element.length; i++)
		element.options[i].selected = bSelect;
}
function Sel_Select(element, value) {
	var i=Sel_FindOptionByValue(element, value);
	if (i >= 0)
		element.selectedIndex = i;
}
function Sel_SelectMultiple(element, valueList) {
	var val = valueList.split(g_valueSeparator);
	var j;

	Sel_Clear(element);
	for (var i=0; i < val.length; i++) {
		j = Sel_FindOptionByValue(element, val[i]);
		if (j >= 0)
			element.options[j].selected = true;
	}
}
function Sel_FindOptionByValue(element, value) {
	for (var i=0; i < element.length; i++) {
		if (element.options[i].value == value)
		return i;
	}
	return -1;
}
function Sel_FindOptionByText(element, value) {
	for (var i=0; i < element.length; i++) {
		if (element.options[i].text == value)
		return i;
	}
	return -1;
}
function Sel_GetSelList(element) {
	var list = new Array();
	for (var i=element.selectedIndex; i < element.length; i++) {
		if (element.options[i].selected)
			list[list.length] = i;
	}
	return list;
}
function Sel_GetSelListAsRange(element) {
	var list = new Array();
	var pair;

	for (var i=0; i < element.length; i++) {
		if (!element.options[i].selected)
			continue;

		// begin of range
		pair = new Pair(i/*name*/,"");
		for (i++; i < element.length; i++) {
			if (element.options[i].selected)
				continue;
			// end of range
			pair.b = i-1; //value
			break;
		}
		if (i >= element.length)
			pair.b = element.length-1; //value

		list[list.length] = pair;
	}
	return list;
}

//----- Pair of values object
Pair.prototype.a;
Pair.prototype.b;
function Pair(a,b) {
	this.a = a;
	this.b = b;
}
function ParsePairArray(value, pairSepChar, fieldSepChar) {
	var list = new Array();
	var pairList;
	var fieldList;
	var i, j;
	var pair;

	if (value.length <= 0)
		return list;

	pairList = value.split(pairSepChar);
	for (i=0; i < pairList.length; i++) {
		fieldList = pairList[i].split(fieldSepChar);
		var pair;
		switch (fieldList.length) {
		case(0): pair = new Pair("",""); break;
		case(1): pair = new Pair(fieldList[0],fieldList[0]); break;
		default: pair = new Pair(fieldList[0],fieldList[1]);
		}
		list[list.length] = pair;
	}
	return list;
}

function List_Find(list, val) {
	for (i=0; i < list.length; i++) {
		if (list[i] == val)
			return i;
	}
	return -1;
}

function Selection_SelectAll(elName, bSelect) {
	var form = document.forms["theDataForm"];
	Sel_SelectAll(form.elements[elName], bSelect);
}

tSysData.prototype.id;			// sys data id
tSysData.prototype.name;		// display name
tSysData.prototype.categoryId;	// category id
tSysData.prototype.nGroup;		// group number (page)
tSysData.prototype.url;
function tSysData() {
	this.id = -1;
	this.name = "";
	this.categoryId = -1;
	this.nGroup = -1;
	this.url = null;
}

/*----- Extension number table */
tTelInfo.prototype.port;
tTelInfo.prototype.number;
tTelInfo.prototype.type;

function tTelInfo(port, number, type) {
	this.port=port;
	this.number=number;
	this.type=type;
}
function tel(port, number, type) {
	g_telList[g_telList.length++] = new tTelInfo(port, number, type);
}
function TelList_FindByPort(port) {
	for (i=0; i < g_telList.length; i++) {
		if (g_telList[i].port == port)
			return i;
	}
	return -1;
}
function TelList_FindByNumber(number) {
	for (i=0; i < g_telList.length; i++) {
		if (g_telList[i].number == number)
			return i;
	}
	return -1;
}

/*----- Trunk number table */
tTrunkInfo.prototype.port;
tTrunkInfo.prototype.type;

function tTrunkInfo(port, type) {
	this.port=port;
	this.type=type;
}
function tkn(port, type) {
	g_trunkList[g_trunkList.length++] = new tTrunkInfo(port, type);
}
function TrunkList_FindByPort(port) {
	for (i=0; i < g_trunkList.length; i++) {
		if (g_trunkList[i].port == port)
			return i;
	}
	return -1;
}

/*----- Numbering plan */
tAccInfo.prototype.accList;			// Eg 1xx|55x
tAccInfo.prototype.accPrefixList;	// Eg 1|55
// Following are set by IsValid
tAccInfo.prototype.bMatchLen = false;
tAccInfo.prototype.iAcc = -1;

function tAccInfo(accList/*eg 1xx|55x*/) {
	tAccInfo_Build(this, accList);
}

function tAccInfo_Build(obj, accList/*eg 1xx|55x*/) {
	obj.accList = new Array();
	obj.accPrefixList = new Array();
	if ((accList != null) && (accList.length > 0))
		obj.accList = accList.split("|");
	
	// Determine the prefix for each acc (ie strip the trailing x's)
	for (i=0; i < obj.accList.length; i++) {
		j = obj.accList[i].indexOf("x");
		if (j > 0)
			obj.accPrefixList[i] = obj.accList[i].substring(0, j);
		else
			obj.accPrefixList[i] = obj.accList[i];
	}
}
function tAccNumInfo_IsValidLen(obj, val) {
	obj.bMatchLen = false;
	obj.iAcc = -1;
	// Check that it matches the len of at least one acc
	for (i=0; i < obj.accList.length; i++) {
		if (val.length == obj.accList[i].length) {
			obj.bMatchLen = true;
			obj.iAcc = i;
			return true;
		}
	}
	return false;
}
function tAccInfo_IsValid(obj, val) {
	obj.bMatchLen = false;
	obj.iAcc = -1;
	// Check that it matches at least one acc
	for (i=0; i < obj.accList.length; i++) {
		if ((val.indexOf(obj.accPrefixList[i]) == 0) && (val.length == obj.accList[i].length)) {
			obj.bMatchLen = true;
			obj.iAcc = i;
			return true;
		}
	}
	return false;
}
function tAccInfo_GetAccList(obj) {
	var str = "";
	for (var i=0; i < obj.accList.length; i++)
		str += obj.accList[i] + ", ";

	return TrimStr(str, ", ");
}

tExtNumInfo.prototype.fullDigitLen;
tExtNumInfo.prototype.accList;		// Eg 1xx|55x
tExtNumInfo.prototype.accPrefixList;// Eg 1|55
// Following are set by IsValid
tExtNumInfo.prototype.bMatchLen = false;
tExtNumInfo.prototype.iAcc = -1;

function tExtNumInfo(fullDigitLen, accList/*eg 1xx|55x*/) {
	this.fullDigitLen = fullDigitLen;
	tAccInfo_Build(this, accList);
}
function tExtNumInfo_IsValidExtNumberLen(obj, ext) {
	obj.bMatchLen = false;
	obj.iAcc = -1;
	if (ext.length > obj.fullDigitLen)
		return false;	// to long

	return tAccNumInfo_IsValidLen(obj, ext);
}
function tExtNumInfo_IsValidExtNumber(obj, ext) {
	obj.bMatchLen = false;
	obj.iAcc = -1;
	if (ext.length > obj.fullDigitLen)
		return false;	// to long

	return tAccInfo_IsValid(obj, ext);
}
function tExtNumInfo_GetAccList(obj) {
	return tAccInfo_GetAccList(obj);
}

function mkStr(ch, cnt) {
	var str="";
	for(i=0; i < cnt; i++)
		str += ch;

	return str;
}

tSPDInfo.prototype.startBin;
tSPDInfo.prototype.endBin;
tSPDInfo.prototype.GetBINCount = tSPDInfo_GetBINCount;

function tSPDInfo(startBin, endBin) {
	this.startBin = startBin;
	this.endBin = endBin;
}
function tSPDInfo_GetBINCount() {
	return this.endBin - this.startBin;
}

function elMatchName(ctrlName, sdId,k1,k2,k3)
{
    // Get sdName <SDNAME>-<KEY1>-<KEY2>-<KEY3>
    var name = ctrlName.split("-");
    if (name.length < 4)
        return false;

    // If a field is blank then we dont have to match (ie wild card)
    if ((sdId.length) > 0 && (sdId != name[0]))
        return false;        
    if ((k1.length) > 0 && (k1 != name[1]))
        return false;
    if ((k2.length) > 0 && (k2 != name[2]))
        return false;
    if ((k3.length) > 0 && (k3 != name[3]))
        return false;
 
    return true;
}
