var Util = new Object;

function check(obj)
{
    obj.checked = true; 
}

function uncheck(obj)
{
    obj.checked = false;
}

function enable(obj)
{
    obj.disabled = false;
}

function disable(obj)
{
    obj.disabled = true;
}

function show(obj)
{
    obj.style.display="";
}

function hide(obj)
{
    obj.style.display="none";
}

function display(obj, isYes)
{
    if (isYes) show(obj);
    else hide(obj);
}

function isChecked(obj)
{
    return (obj.checked == true);
}

function isUnchecked(obj)
{
    return (obj.checked == false);
}

function isEnabled(obj)
{
    return (obj.disabled == false);
}

function new_fullTrim(a)
{
        return a.replace(/^\s*|\s*$/g, "");
}


function setProperty(obj, property, value) {
var evalStr = "obj." + property + "=" + value + ";";
//alert(evalStr);
	eval(evalStr);
}

function setPropertyById(id, property, value) {
	var obj;

	if (obj = document.getElementById(id)) {
		setProperty(obj, property, value);
	}
}

function changeStyle(obj, property, value) {
	setProperty(obj, "style." + property, value);
}

function changeStyleById(id, property, value) {
	var obj;

	if (obj = document.getElementById(id)) {
		changeStyle(obj, property, value);
	}
}

function changeStyleByIds(idArray, property, value) {
	var i;

	for (i = 0; i < idArray.length; i++) {
		changeStyleById(idArray[i], property, value);
	}
}

function setPropertyByIds(idArray, property, value) {
	var i;

	for (i = 0; i < idArray.length; i++) {
		setPropertyById(idArray[i], property, value);
	}
}

function setPropertyByName(rootObj, elementNames, nameExp, property, value) {
	var i, j;
	var re = new RegExp(nameExp);
	var objElementArray;

	for (i = 0; i < elementNames.length; i++) {
		objElementArray = rootObj.getElementsByTagName(elementNames[i]);
		for (j = 0; j < objElementArray.length; j++) {
			if (re.test(objElementArray[j].name) && (!objElementArray[j].disabled || property == "disabled")) {
				setProperty(objElementArray[j], property, value);
			}
		}
	}
}

function hideElementsById(idArray, hide) {
	changeStyleByIds(idArray, "display", hide ? "'none'" : "''");
}

function disableElementsById(idArray, disabled) {
	setPropertyByIds(idArray, "disabled", disabled);
}

function disableElementsByName(rootObj, elementNames, nameExp, disabled) {
	setPropertyByName(rootObj, elementNames, nameExp, "disabled", disabled);
}

function checkInputByName(rootObj, nameExp, checked) {
	setPropertyByName(rootObj, ['input'], nameExp, "checked", checked);
}

function hideSection(controlObj, idArray) {
	var hidden = !(document.getElementById(idArray[0]).style.display == 'none');

	hideElementsById(idArray, hidden);

	if (hidden) {
		controlObj.src = "/resource/images/twistie_collapsed.gif";
	} else {
		controlObj.src = "/resource/images/twistie_expanded.gif";
	}
}

function disableFormByName(nameExp) {
    var i;
    var inputElements = document.getElementsByTagName('input');
    var typeArray, controlObj;
    
    var re = new RegExp(nameExp);
    for (i = 0; i < inputElements.length; i ++) {
        if (re.test(inputElements[i].name)) {
            typeArray = inputElements[i].name.split('_');
            controlObj = document.getElementById(typeArray[0] + '_' + typeArray[1]);
            if (controlObj && (controlObj.name != inputElements[i].name)) {
                inputElements[i].disabled = !controlObj.checked || controlObj.disabled;
            }
        }
    }
}


function disableElementsById2(inputElements, idExp, disabled)
{
    var i;
    
    var re = new RegExp(idExp);
    for (i = 0; i < inputElements.length; i ++) {
        if (re.test(inputElements[i].id)) {
            inputElements[i].disabled = disabled;
        }
    }
}

function disableFormById(idExp, disabled) {
    disableElementsById2( document.getElementsByTagName('input'), idExp, disabled );
    disableElementsById2( document.getElementsByTagName('select'), idExp, disabled );
    disableElementsById2( document.getElementsByTagName('textarea'), idExp, disabled );
}

function refreshFields(nameExp, elementNamesArray, refreshInterval) {
	var refreshFrameString = "refreshFrame";

	if (window.location.toString().indexOf(refreshFrameString, window.location.toString().length - refreshFrameString.length) > 0) {
		var i, j;
		var re = new RegExp(nameExp);
		var objElementArray;
		var refreshField;

		for (i = 0; i < elementNamesArray.length; i ++) {
			objElementArray = document.getElementsByTagName(elementNamesArray[i]);
			for (j = 0; j < objElementArray.length; j ++) {
				if (re.test(objElementArray[j].id)) {
					refreshField = parent.document.getElementById(objElementArray[j].id);
					if (refreshField) {
						refreshField.innerHTML = objElementArray[j].innerHTML;
						refreshField.setAttribute('style', objElementArray[j].getAttribute('style'));
						refreshField.style.cssText = objElementArray[j].style.cssText;
					}
				}
			}
		}

		if (refreshInterval) {
			window.setTimeout("window.location = window.location;", refreshInterval * 1000);
		}

	} else {
		var subFrame = document.createElement('iframe');

		subFrame.setAttribute('src', window.location.toString() + ((window.location.toString().split('?').length > 1) ? '&' : '?') + refreshFrameString);
		subFrame.setAttribute('name', 'refreshFrame');
		subFrame.setAttribute('height', '0');
		subFrame.setAttribute('width', '0');
		subFrame.setAttribute('frameborder', '0');
		document.body.appendChild(subFrame);
	}
}

function clear_vdom_in_footer()
{
}

/*

function display_vdom_in_footer(title, vd_name)
{
    var vdom_sep = parent.footer.document.getElementById('vdom_sep');
    var vdom_title = parent.footer.document.getElementById('vdom_title');
    var vdom_val = parent.footer.document.getElementById('vdom_val');

    if (vdom_sep && (vdom_sep.innerHTML == ""))
        vdom_sep.innerHTML= "<img src='/resource/images/footer_separator.gif'>&nbsp;";
    if (vdom_title && (vdom_title.innerHTML== ""))
        vdom_title.innerHTML= title + ": ";
    if (vdom_val)
        vdom_val.innerHTML= vd_name;
}

function clear_vdom_in_footer()
{
    var vdom_sep = parent.footer.document.getElementById('vdom_sep');
    var vdom_title = parent.footer.document.getElementById('vdom_title');
    var vdom_val = parent.footer.document.getElementById('vdom_val');

    if (vdom_sep)
        vdom_sep.innerHTML = "";
    if (vdom_title)
        vdom_title.innerHTML= "";
    if (vdom_val)
        vdom_val.innerHTML= "";
}
*/

function check_value(obj)
{
    obj.value=(obj.checked)?"1":"0";
}

function myescape(str)
{
    var tmp = escape(str);
    tmp = tmp.replace("+", "%2B");
    return tmp;
}

function confirm_act(msg, url)
{
    if (confirm(msg)) window.location=url;
}

function confirm_delete(msg_delete, str)
{
    // the damn javascript will unescape string automatically. so have to escape it here.
    var url = str;
    var start_pos = 2;
    if ( str.indexOf('?') < 0 ) 
    {
        if ( arguments.length>2 ) 
        {
            url += ("?" + arguments[start_pos] + "=" + myescape(arguments[start_pos+1]) );
        }
        start_pos = 4;
    }
    for ( var i = start_pos; i < arguments.length; i = i + 2 ) {
        url += ("&" + arguments[i] + "=" + myescape(arguments[i + 1]) );
    }
    
    if( confirm(msg_delete))
    {
        window.location=url;
    }
}
function confirm_action(msg, str)
{
    // the damn javascript will unescape string automatically. so have to escape it here.
    var url = str;
    var start_pos = 2;
    if ( str.indexOf('?') < 0 ) 
    {
        if ( arguments.length>2 ) 
        {
            url += ("?" + arguments[start_pos] + "=" + myescape(arguments[start_pos+1]) );
        }
        start_pos = 4;
    }
    for ( var i = start_pos; i < arguments.length; i = i + 2 ) {
        url += ("&" + arguments[i] + "=" + myescape(arguments[i + 1]) );
    }
    
    if( confirm(msg))
    {
        window.location=url;
    }
}
function promp_rename(str)
{
    var url = str;
    var start_pos = 1;
    if ( str.indexOf('?') < 0 ) 
    {
        if ( arguments.length>1 ) 
        {
            url += ("?" + arguments[start_pos] + "=" + myescape(arguments[start_pos+1]) );
        }
        start_pos = 3;
    }
    for ( var i = start_pos; i < arguments.length; i = i + 2 ) {
        url += ("&" + arguments[i] + "=" + myescape(arguments[i + 1]) );
    }
    
	var name=prompt(YAHOO.FMG.GlobalText.rename_name, "");
	if(name=="")  alert(YAHOO.FMG.GlobalText.rename_alert1); 
	else if(name==arguments[2]) alert(YAHOO.FMG.GlobalText.rename_alert2);
	else if(name==null){}
	else
	{
	   url += ("&new=" + myescape(name) );
	   window.location=url;
	}	
}
function confirm_export(msg_export, str)
{
    // the damn javascript will unescape string automatically. so have to escape it here.
    var url = str;
    var start_pos = 2;
    if ( str.indexOf('?') < 0 )
    {
        if ( arguments.length>2 )
        {
            url += ("?" + arguments[start_pos] + "=" + myescape(arguments[start_pos+1]) );
        }
        start_pos = 4;
    }
    for ( var i = start_pos; i < arguments.length; i = i + 2 ) {
        url += ("&" + arguments[i] + "=" + myescape(arguments[i + 1]) );
    }

    if( confirm(msg_export))
    {
        window.location=url;
    }
}

function confirm_clearall(msg_clearall, url)
{
    if( confirm(msg_clearall))
    {
        window.location=url;
    }
}

function confirm_resetall(msg_resetall, url)
{
    if( confirm(msg_resetall))
    {
        window.location=url;
    }
}

function sort_column(sortFieldName, sortDirection)
{
    document.forms[0].sortDirection.value = sortDirection;
    document.forms[0].sortFieldName.value = sortFieldName;
    document.forms[0].submit();
}

function doPageAction(actionNumber) 
{
	if (document.forms[0].submitFlag) 
		return false; 
   re = /(.+pg)(\\.gif)/;
   switch (actionNumber) 
    {
        case -1 : 
          document.forms[0].startRow.value -= document.forms[0].rowNumber.value; 
          if ( parseInt(document.forms[0].startRow.value) < 1 ) 
            document.forms[0].startRow.value = 1; 
          if ( document.forms[0].startRow.value == 1 ) 
          {
               chkimg = document.getElementById('imgFirst');
               chkimg.src = chkimg.src.replace(re, "$1_d$2");
               chkimg = document.getElementById('imgPre');
               chkimg.src = chkimg.src.replace(re, "$1_d$2");

	  }
          break;
        case 1 : 
          var intStartRowValue = parseInt(document.forms[0].startRow.value);
          var intRowNumberValue = parseInt(document.forms[0].rowNumber.value);
          var intTotalRowValue = parseInt(document.forms[0].totalRow.value);
          if ( intStartRowValue+intRowNumberValue <= intTotalRowValue )
          {
            document.forms[0].startRow.value = ( intStartRowValue + intRowNumberValue );
          } else {
               chkimg = document.getElementById('imgLast');
               chkimg.src = chkimg.src.replace(re, "$1_d$2");
               chkimg = document.getElementById('imgNext');
               chkimg.src = chkimg.src.replace(re, "$1_d$2");
          }
          break;
        case 2 :    //first Page
            document.forms[0].startRow.value = 1; 
               chkimg = document.getElementById('imgFirst');
               chkimg.src = chkimg.src.replace(re, "$1_d$2");
               chkimg = document.getElementById('imgPre');
               chkimg.src = chkimg.src.replace(re, "$1_d$2");
          break;
        case 3 :    //last Page
          var intRowNumberValue = parseInt(document.forms[0].rowNumber.value);
          var intTotalRowValue = parseInt(document.forms[0].totalRow.value);
          document.forms[0].startRow.value =intTotalRowValue-document.forms[0].rowNumber.value+1; 
          if ( parseInt(document.forms[0].startRow.value) < 1 ) 
            			document.forms[0].startRow.value = 1; 
               chkimg = document.getElementById('imgLast');
               chkimg.src = chkimg.src.replace(re, "$1_d$2");
               chkimg = document.getElementById('imgNext');
               chkimg.src = chkimg.src.replace(re, "$1_d$2");
          break;
    }
	document.forms[0].submitFlag = true;
    document.forms[0].submit();
}

function setCookie(key, value, expiry, noPath)
{
	var expiryString = expiry ? ("expires=" + expiry + ";") : "";
	var pathname = location.pathname.substring(0, location.pathname.lastIndexOf('/')) + '/';
	if(typeof noPath != "undefined")
		pathname ='/';	

	document.cookie = key + "=" + escape(value) + ";" + expiryString + "path=" + pathname + ";";
}

function getCookie(key)
{
	// cookies are separated by semicolons
	var aCookie = document.cookie.split("; ");
	for (var i = 0; i < aCookie.length; i++) {
		// a name/value pair (a crumb) is separated by an equal sign
		var aCrumb = aCookie[i].split("=");
		if (key == aCrumb[0]) 
		return unescape(aCrumb[1]);
	}

	// a cookie with the requested name does not exist
	return null;
}

function serializeArray(inputArray) {
	var arrayString = "";

	if (!inputArray) return arrayString;

	for (var i = 0; i < inputArray.length; i++) {
		if (typeof(inputArray[i]) == "object") {
			arrayString += escape(serializeArray(inputArray[i])) + "&";
		} else {
			arrayString += escape(inputArray[i]) + "&";
		}
	}
	return arrayString;
}

function deserializeArray(arrayString) {
	var stringArray = arrayString.split("&");
	var elementString;

	stringArray.length -= 1;
	for (var i = 0; i < (stringArray.length); i++) {
		elementString = unescape(stringArray[i]);		

		if (elementString.indexOf("&") < 0) {
			stringArray[i] = unescape(elementString);
			if (elementString.indexOf("=") >= 0) {
				var fieldArray = elementString.split("=");
				stringArray[fieldArray[0]] = fieldArray[1];
			}
		} else {
			stringArray[i] = deserializeArray(elementString);
		}
	}
	return stringArray;
}

// <select> field functions ---------------------------------------------------------------
function removeOptions(field) {
	var removedOptions = document.createElement("select");
	var i;
	var j = 0;

	for (i = 0; i < field.options.length; i++) {
		if (field.options[i].selected) {
			removedOptions.options[j] = new Option();
			removedOptions.options[j].text = field.options[i].text;
			removedOptions.options[j].value = field.options[i].value;
			removedOptions.options[j].selected = true;

			field.options[i] = null;
			i--;
			j++;
		}
	}

	return removedOptions;
}

function moveOptionField(fromField, toField) {
	var insertIndex = toField.options.length;
	var selectedOptions;
	var insertNumber = 0;
	var i;

	// find insertion point in destination field
	for (i = 0; i < toField.options.length; i ++) {
		if (toField.options[i].selected) {
				insertIndex = i + 1;
				toField.options[i].selected = false;
		}
	}

	// remove options from fromField
	selectedOptions = removeOptions(fromField);

	// add empty options by increasing length
	toField.options.length += selectedOptions.options.length;

	// shift old entries down
	for (i = (toField.options.length - 1); i >= (insertIndex + selectedOptions.options.length); i --) {
		toField.options[i].text = toField.options[i - selectedOptions.options.length].text;
		toField.options[i].value = toField.options[i - selectedOptions.options.length].value;
	}

	// insert new entries
	for (i = 0; i < selectedOptions.options.length; i ++, insertIndex ++) {
		toField.options[insertIndex].text = selectedOptions.options[i].text;
		toField.options[insertIndex].value = selectedOptions.options[i].value;
		toField.options[insertIndex].selected = true;
	}
}

function moveOptionUp(selectField) {
	var i;
	var oOption = new Option();
	var length = selectField.options.length;
	
	if (length == 0 || selectField.options[0].selected) {
		return 0;
	}
	
	for (i = 1; i < length; i ++) {
		if (selectField.options[i].selected) {
			oOption.text = selectField.options[i - 1].text;
			oOption.value = selectField.options[i - 1].value;

			selectField.options[i - 1].text = selectField.options[i].text;
			selectField.options[i - 1].value = selectField.options[i].value;
			selectField.options[i - 1].selected = true;

			selectField.options[i].text = oOption.text;
			selectField.options[i].value = oOption.value;
			selectField.options[i].selected = false;
		}
	}
}

function moveOptionDown(selectField) {
	var i;
	var oOption = new Option();
	var length = selectField.options.length;

	if (length == 0 || selectField.options[length - 1].selected) {
		return 0;
	}
	
	for (i = length - 1; i >= 0; i --) {
		if (selectField.options[i].selected) {
			oOption.text = selectField.options[i + 1].text;
			oOption.value = selectField.options[i + 1].value;

			selectField.options[i + 1].text = selectField.options[i].text;
			selectField.options[i + 1].value = selectField.options[i].value;
			selectField.options[i + 1].selected = true;

			selectField.options[i].text = oOption.text;
			selectField.options[i].value = oOption.value;
			selectField.options[i].selected = false;
		}
	}
}

function selectOptions(selectObj, optionArray, mode) {
	var numberSelected = 0;
	for (var i = 0; i < selectObj.length; i ++) {
		switch (mode) {
		case 0 : // deselect
			for (var j = 0; j < optionArray.length; j++) {
				if (selectObj[i].value == optionArray[j].value) {
					selectObj[i].selected = false;
					numberSelected++;
					break;
				}
			}
			break; 
		case 1 : // select only
			for (var j = 0; j < optionArray.length; j++) {
				if (selectObj[i].value == optionArray[j].value) {
					selectObj[i].selected = true;
					numberSelected++;
					selectObj[i].scrollIntoView();
					break;
				}
				selectObj[i].selected = false;
			}
			break;
		case 2 : // add selection
		default :
			for (var j = 0; j < optionArray.length; j++) {
				if (selectObj[i].value == optionArray[j].value) {
					selectObj[i].selected = true;
					numberSelected++;
					selectObj[i].scrollIntoView();
					break;
				}
			}
		}
	}
	return numberSelected;
}

function moveOptions(fromObj, toObj) {
	var optionArray = new Array();
	
	optionArray = optionsToArray(fromObj, 1, 1);
	insertOptions(toObj, optionArray, toObj.selectedIndex + 1);

}
function moveOptionsSort(fromObj, toObj) {
	var optionArray = new Array();
	
	optionArray = optionsToArray(fromObj, 1, 1);
	insertOptions(toObj, optionArray, toObj.selectedIndex + 1);
	sortOptions(toObj, compareObjTextString);
}
function insertOptions(selectObj, optionArray, index) {
	var resultArray;
	resultArray = optionsToArray(selectObj, 2, 1);
        arrayToOptions(selectObj, resultArray.splice(0, index).concat(optionArray).concat(resultArray));
	//selectOptions(selectObj, optionArray, 1);
}

function new_insertOptions(selectObj, optionArray, index) {
        var resultArray;
        resultArray = optionsToArray(selectObj, 2, 1);
        arrayToOptions(selectObj, resultArray.splice(0, index).concat(optionArray).concat(resultArray));
}

function optionsToArray(selectObj, mode, remove) {
	var optionArray = new Array();
	var i = 0;

	while (i < selectObj.length) {
		switch (mode) {
		case 0 :
			if (!selectObj[i].selected) {
				optionArray[optionArray.length] = selectObj[i];
				if (remove) {
					selectObj.removeChild(selectObj[i]);
					break;
				}
			}
			i++;
			break; 
		case 1 :
			if (selectObj[i].selected) {
				optionArray[optionArray.length] = selectObj[i];
				if (remove == 1) {
					selectObj.removeChild(selectObj[i]);
					break;
				}
			}
			i++;
			break;
		case 2 :
		default :
			optionArray[optionArray.length] = selectObj[i];
			if (remove == 1) {
				selectObj.removeChild(selectObj[i]);
				break;
			}
			i++;
		}
	}
	return optionArray;
}

function arrayToOptions(selectObj, optionArray) {
	for (var i = 0; i < optionArray.length; i++) {
		selectObj.options[selectObj.options.length] = new Option(optionArray[i].text, optionArray[i].value, optionArray[i].selected);
		selectObj.options[selectObj.options.length - 1].selected = optionArray[i].selected;
	}
}

function stringToOption(stringArray) {
	for (var i = 0; i < stringArray.length; i++) {
		stringArray[i] = new Option(stringArray[i], stringArray[i]);
	}
	return stringArray;
}

function optionToString(optionArray) {
	for (var i = 0; i < optionArray.length; i++) {
		optionArray[i] = optionArray[i].value;
	}
	return optionArray;
}

function sortOptions(selectObj, compareFn) {
	var optionArray = optionsToArray(selectObj, 2, 1);
	optionArray.sort(compareFn);
	arrayToOptions(selectObj, optionArray);
}

function compareObjTextString(a, b) {
	if (a.text < b.text) return -1;
	if (a.text > b.text) return 1;
	return 0;
}
function compareObjValueString(a, b) {
	if (a.value < b.value) return -1;
	if (a.value > b.value) return 1;
	return 0;
}

function compareObjValueInt(a, b) {
	if (parseInt(a.value) < parseInt(b.value)) return -1;
	if (parseInt(a.value) > parseInt(b.value)) return 1;
	return 0;
}
// array functions ----------------------------------------------------------------

function uniquefyArray(array1) {
	var array2 = new Array();
	var found = 0;
	
	for (var i = 0; i < array1.length; i++) {
		found = 0;
		for (var j = 0; j < array2.length; j++) {
			if (array1[i] == array2[j]) {
				found = 1;
				break;
			}
		}
		if (!found) {
			array2[array2.length] = array1[i];
		}
	}
	return array2;
}

function removeFromArray(array1, array2) {
	var array3 = new Array();
	var found = 0;
	
	for (var i = 0; i < array1.length; i++) {
		found = 0;
		for (var j = 0; j < array2.length; j++) {
			if (array1[i] == array2[j]) {
				found = 1;
				break;
			}
		}
		if (!found) {
			array3[array3.length] = array1[i];
		}
	}
	return array3;
}

function matchArray(array1, array2) {
	var array3 = new Array();

	for (var i = 0; i < array1.length; i++) {
		for (var j = 0; j < array2.length; j++) {
			if (array1[i] == array2[j]) {
				array3[array3.length] = array1[i];
			}
		}
	}
	return array3;
}
Util.popupWindow = null;
function popup(link, windowName, width, height,resizable) {

	var screen_width = screen.width;
	var screen_height = screen.height;
	if(screen_width < 900)	screen_width = 900;
	if(screen_height < 600)	screen_height = 600;
	var x = (screen_width - width)/2;
	var y = (screen_height - height)/2;

	Util.popupWindow = window.open(link, windowName, 'toolbar=0,menubar=0,location=0,status=0,dependent=yes,scrollbars=yes,resizable='+resizable+',width=' + width + ',height=' + height + ',top=' + y + ',left=' + x + ',screenX=' + x + ',screenY=' + y);
	
	Util.popupWindow.resizeTo(width, height);
	Util.popupWindow.moveTo(x, y);
	Util.popupWindow.focus();
	
	return Util.popupWindow;
}

function implodeField(field, separator, onlySelected) {
	var i;
	var str = "";
	for (i = 0; i < field.length; i ++) {
		if (onlySelected) {
			if (field[i].selected) {
				if (str.length > 0) {
					str += separator;
				}
				str += field[i].value;
			}
		} else {
			if (str.length > 0) {
				str += separator;
			}
			str += field[i].value;
		}
	}
	return str;
}

function insertOption(selectField, oOption, compareFn, selectOption) {

        // selectField - <select> field to insert option
        // oOption - <option> field to insert
        // comparFn - comparative function to find index to insert at
        // selectOption - select option upon insertion

        var i = selectField.length;
        if (compareFn) {
                for (i = 0; i < selectField.length; i++) {
                        if (compareFn(oOption, selectField.options[i]) < 0) {
                                break;
                        }
                }
        }
        try {
		selectField.add(oOption, selectField.options[i]); // FireFox
	}
	catch (e) {
        	selectField.add(oOption, i); // IE
	}
        if (selectOption) {
                selectField.options[i].selected = true;
        }
	return i;
}

function getPasswdStr(len)
{
	var str='';
	for(var i=0; i<len; ++i )
		str += '*';
	return str;		
}

function getUrlParam(strHref, strParamName)
{
  var strReturn = "";
  if ( strHref.indexOf("?") > -1 ){
    var strQueryString = strHref.substr(strHref.indexOf("?")+1).toLowerCase();
    var tmpStrParamName = strParamName.toLowerCase();
    var aQueryString = strQueryString.split("&");
    for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
      if ( aQueryString[iParam].indexOf(tmpStrParamName + "=") > -1 ){
        var aParam = aQueryString[iParam].split("=");
        strReturn = aParam[1];
        break;
      }
    }
  }
  return strReturn;
} 
/*
//those two are duplicated, search RegExpCommon in this file for details
function RegExpCommon() {
	this.EMAIL_ADDRESS = /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]$/;
	this.IP_HOST = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
	this.IP_MASK = /^(((255|254|252|248|240|224|192|128|0)\.0\.0\.0)|(255\.(255|254|252|248|240|224|192|128)\.0\.0)|(255\.255\.(255|254|252|248|240|224|192|128)\.0)|(255\.255\.255\.(255|254|252|248|240|224|192|128|0)))$/;
	this.IP_RANGE = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(-(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])|-((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])|\/(3[0-2]|[1-2][0-9]|[0-9]))?$/;
	this.MAC_ADDRESS = /^[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}$/;
	this.IP_SUBNET = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/((((255|254|252|248|240|224|192|128|0)\.0\.0\.0)|(255\.(254|252|248|240|224|192|128)\.0\.0)|(255\.255\.(254|252|248|240|224|192|128)\.0)|(255\.255\.255\.(255|254|252|248|240|224|192|128|0))|(3[0-2]|2[0-9]|1[0-9]|[0-9])))$/;
	this.INTEGER = /^[0-9]+$/;
	this.NAME = /^[^<>#()"'$]+$/;
}

function checkFieldExp(field, regExpTest, errorMessage) {
	var re = regExpTest; //new RegExp(regexpString);

	if (!re.test(field.value.toString())) {
		alert(errorMessage);
		field.focus();
		field.select();
		return false;
	}
	return true;
}
*/

function cat_members(obj_sel, obj_mem)
{
    var len = obj_sel.options.length;
    var i;
    var members = '';

    if (len >0) {
        members = obj_sel.options[0].text;
        for (i = 1; i < len; i++) {
            members=members + ','+obj_sel.options[i].text;
        }
        obj_mem.value = members;
    }
}

function validateFieldRange(fieldObj, minValue, maxValue, errorMessage) {
	var fieldValue = parseInt(fieldObj.value);

	if (!isNaN(fieldValue) && (fieldValue >= minValue && fieldValue <= maxValue)) {
		return true;
	}

	alert(errorMessage);
	fieldObj.focus();
	fieldObj.select();
	return false;
}

function get_xmlhttp() {
    return window.XMLHttpRequest || !window.ActiveXObject ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
}              
    
function send_request(str_url, str_body) {
        var xmlhttp = get_xmlhttp();
        var str_method = str_body ? "POST" : "GET";

        xmlhttp.open(str_method, str_url, false);
        xmlhttp.send(str_body);
               
        return xmlhttp.responseText;
}              

function checkByName(nameExp, values) {
	var i, j;
	var re = new RegExp(nameExp);
	var objElementArray = document.getElementsByTagName("input");

	for (i = 0, j = 0; i < objElementArray.length; i++) {
		if (re.test(objElementArray[i].name)) {
			if (objElementArray[i].type == "checkbox") {
				setProperty(objElementArray[i], "checked", (values[j] == 1) ? true : false);
				objElementArray[i].value = values[j];
			} else {
				setCheckboxValue(objElementArray[i], parseInt(values[j]));
			}
			if (values[j + 1]) j++;
		}
	}
}

// Tri-state checkbox functions ----------------------------------------------------------------------
function setCheckboxValue(obj, value) {
	obj.value = value;

	switch (value) {
	case 0 : obj.className = "checkbox_off"; break;
	case 1 : obj.className = "checkbox_on"; break;
	case 2 : obj.className = "checkbox_tri"; break;
	}
}

function doCheck(obj) {
        var value;
        var isTristate;
        var old_value;

        if (obj.type == "checkbox") {
                value = obj.checked ? 1 : 0;
        } else {
                value = parseInt(obj.value);
                if (value != 0 && value != 1) {
                        old_value = value;
                        value = 2;
                }

                isTristate = ((value == 2) || (obj.getAttribute("tristate") ? true : false));

                // save child values
                if (value == 2) {
                        obj.setAttribute("childValues", getValuesByName("^" + obj.name + "_").toString());
                        obj.setAttribute("tristate", old_value);
                }

                value = (value + 1) % (isTristate ? 3 : 2);

                if (value == 2) {
                        value = parseInt(obj.getAttribute("tristate"));
                }

                setCheckboxValue(obj, value);
        }
        switch (value) {
        case 0 : checkByName("^" + obj.name + "_", [0]); break;
        case 1 : checkByName("^" + obj.name + "_", [1]); break;
        default : checkByName("^" + obj.name + "_", obj.getAttribute("childValues").split(",")); break;
        }

        var re = obj.name.substring(0, obj.name.lastIndexOf("_"));

        if (re.length > 0) {
                checkByName("^" + re + "$", [evalTristate(getValuesByName("^" + obj.name.substring(0, obj.name.lastIndexOf("_") + 1), true))]);
        }
}

function getValuesByName(nameExp, includeAll) {
        var i;
        var re = new RegExp(nameExp);
        var objElementArray = document.getElementsByTagName("input");
        var values = new Array();

        for (i = 0; i < objElementArray.length; i++) {
                if (re.test(objElementArray[i].name)) {
                        if (objElementArray[i].type == "checkbox") {
                if (!includeAll && !objElementArray[i].checked) continue;

                if (includeAll && !objElementArray[i].checked) {
                    values[values.length] = 0;
                    continue;
                }

                                if (objElementArray[i].value == "on") {
                    values[values.length] = 1;
                }
                else {
                    values[values.length] = objElementArray[i].value;
                }
                        } else {
                                values[values.length] = objElementArray[i].value;
                        }
                }
        }
        return values;
}

function evalTristate(values) {
	var zero, one, two = false;
	var csv = values.toString();

	if (csv.indexOf("0") > -1) zero = true;
	if (csv.indexOf("1") > -1) one = true;
	if (csv.indexOf("2") > -1) two = true;
	
	if (two || (zero && one)) return 2;
	if (zero) return 0;
	return 1;
}

function getElement(psID) {
	if(document.all) {
		return document.all[psID];
	} else {
		return document.getElementById(psID);
	}
}

function appendFormField(thisForm, name, value) {
	var obj;
	if(!thisForm) return;

	obj = document.createElement("input");
	obj.type = "hidden";
	obj.name = name;
	obj.id = name;
	obj.value = value;
	var obj0 = document.getElementById(name);
	//if obj exist, then delete it first
	if(obj0 != null) thisForm.removeChild(obj0);
	thisForm.appendChild(obj);
}

function nodeToString(nodeArray, attributeName) {
	for (var i = 0; i < nodeArray.length; i++) {
		nodeArray[i] = nodeArray[i].getAttribute(attributeName);
	}
	return nodeArray;
}

function findInArray(thisArray, elementToFind) {
	var index = -1;

	for (var i = 0; i < thisArray.length; i++) {
		if (thisArray[i] == elementToFind) {
			index = i;
			break;
		}
	}
	return index;
}
var dtCh= "-";
var minYear=1900;

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isFormattedDate(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	
	if (pos1 == -1 || pos2 == -1){
		alert(YAHOO.FMG.GlobalText.date_format);
		return false
	}
		
	var arrayTemp= dtStr.split("-");
	
	if (arrayTemp[0].length!=4 || arrayTemp[1].length!=2 || arrayTemp[2].length!=2){
		alert(YAHOO.FMG.GlobalText.date_format);
		return false;
	}
	
	var strYr=arrayTemp[0]
	var strMonth=arrayTemp[1]
	var strDay=arrayTemp[2]
	
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1);
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1);
	
	var month=parseInt(strMonth);
	var day=parseInt(strDay);
	var year=parseInt(strYr);
	
	if (strYr.length != 4 || year==0 || year<minYear ){
		alert(YAHOO.FMG.GlobalText.date_format_year + minYear + "." );
		return false;
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert(YAHOO.FMG.GlobalText.date_format_month);
		return false;
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert(YAHOO.FMG.GlobalText.date_format_day);
		return false;
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert(YAHOO.FMG.GlobalText.date_invalid);
		return false;
	}
	return true
}

function isDate(dtStr,errStrFormat,errStrMon,errStrDay,errStrYear,errStrWhole){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strYr=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strDay=dtStr.substring(pos2+1)
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	var month=parseInt(strMonth)
	var day=parseInt(strDay)
	var year=parseInt(strYr)
	if (pos1 == -1 || pos2 == -1){
	// YYYY-MM-DD
		alert(errStrFormat)
		return false
	}
	if (strYr.length != 4 || year==0 || year<minYear ){
		alert(errStrYear +' > ' + minYear)
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert(errStrMon)
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert(errStrDay)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert(errStrWhole)
		return false
	}
	return true
}
function set_list_member_datas(f_select, f_member)                                                          
{                                                                                                      
    var i;                                                                                             
    var len = f_select.length;                                                                         
    var members = '';                                                                                  
    if (len >=1 ) {                                                                                    
	    for (i=0; i < len; i++)                                                                            
	    {   
	            if (members!='') members+=',';                                                             
	            members += f_select.options[i].value;
	    } // end for                                                                                       
	    f_member.value = members;                                                                          
    } //end if                                                                                         
}              

 function s_escape(str) 
{
    var tmp;
    tmp = str.replace("'", "\\'");
    return tmp;
}              

var RegExpCommon = new function RegExpCommon() {
	// E-mail address (ie. username@host)
	this.EMAIL_ADDRESS = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 

	// domain (ie. mydomain.com)
	this.DOMAIN = /^([a-zA-Z0-9\-])+\.+([a-zA-Z0-9]{2,4})+$/; 

	// Host (ie. 1.2.3.4)
	this.IP_HOST = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;

	// Mask (ie. 255.255.255.0)
	this.IP_MASK = /^(((255|254|252|248|240|224|192|128|0)\.0\.0\.0)|(255\.(255|254|252|248|240|224|192|128)\.0\.0)|(255\.255\.(255|254|252|248|240|224|192|128)\.0)|(255\.255\.255\.(255|254|252|248|240|224|192|128|0)))$/;

	// Range (IP_HOST-IP_HOST)
	this.IP_RANGE = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(-(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])|-((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])|\/(3[0-2]|[1-2][0-9]|[0-9]))?$/;

	// MAC address (ie. xx:xx:xx:xx:xx:xx)
	this.MAC_ADDRESS = /^[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}$/;

	// IP subnet (ie. 172.16.79.19/24 or 172.16.79.19/255.255.255.0)
	this.IP_SUBNET = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/((((254|252|248|240|224|192|128|0)\.0\.0\.0)|(255\.(254|252|248|240|224|192|128|0)\.0\.0)|(255\.255\.(254|252|248|240|224|192|128|0)\.0)|(255\.255\.255\.(255|254|252|248|240|224|192|128|0))|(3[0-2]|2[0-9]|1[0-9]|[0-9])))$/;

	// IP & port (ie. 172.16.79.19:65535)
	this.IP_PORT = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]):[0-9]+$/;
	
	// integer (0-9)
	this.INTEGER = /^[-]?[0-9]+$/;

        // hex integer (0-F/0-f)
        this.HEX_INTEGER = /^[0-9A-Fa-f]+$/;

	// name (no invalid characters)
	this.NAME = /^[^<>#()"']+$/;

	// restrict name (no invalid characters)
	this.RESTRICT_NAME = /^[0-9a-zA-Z_-]+$/;
	
	this.RESTRICT_NAME_INCLUDE_SPACE = /^[0-9 a-zA-Z_-]+$/;

	this.RESTRICT_NAME_INCLUDE_SPACE_SLASH = /^[0-9 a-zA-Z_\-\/]+$/;

	// cross scripting characters 
	this.XSS = /^[^<>()#'"]*$/;

	// integer range
	this.RANGE_INT = /^[0-9]*-[0-9]+$|^([0-9]+-?)$/;

	// time
	this.TIME = /^(([0-1]?[0-9]|[2][0-3]):([0-5]?[0-9]):([0-5]?[0-9]))?$/;

	// date
	this.DATE = /^([0-9]{4}-([0]?[0-9]|[1][0-2])-([0-2]?[0-9]|3[0-1]))?$/;
}


function matchFieldExp(str, regExpTestArray) {
    for (var i = 0; i < regExpTestArray.length; i++) {
	if (regExpTestArray[i].test(str)) {
	    return i;
	}
    }
    return -1;
}

function checkFieldExp(field, regExpTestArray, errorMessage) {
	if (matchFieldExp(field.value.toString(), regExpTestArray) < 0) {
		if(errorMessage){
			alert(errorMessage);
		}
		if(typeof field.focus === 'function') {
			field.focus();
		}
		if(typeof field.select === 'function') {
			field.select();
		}
		return false;
	}

	return true;
}

// validate html field (usually is input/select element) by regular expression
function checkFieldByRegExp(field, regExpTest, errorMessage) {
	if(field == null) return true;
	var re = regExpTest; //new RegExp(regexpString);

	if (!re.test(field.value.toString())) {
		if(errorMessage){
			alert(errorMessage);
		}
		if(typeof field.focus === 'function') {
			field.focus();
		}
		if(typeof field.select === 'function') {
			field.select();
		}
		return false;
	}
	return true;
}

// validate a value by regular expression
function checkValueByRegExp(theValue, regExpTest, errorMessage) {
	var re = regExpTest; //new RegExp(regexpString);

	if (!re.test(theValue.toString())) {
		alert(errorMessage);
		return false;
	}
	return true;
}

function theFormFieldOnchange(obj)
{
   if(obj == null) return;
   obj.setAttribute('ischanged',1);
}

// as long as input element has 'verify' attribute in following format
// desc|canblank(1/0)|verify type|min|max|default value (min/max if the verify type is range)
// e.g. port range|0|intrange|0|65535
// verify type can be:
//   int
//   intrange
//   name
//   ip
//   ipmask
//   email
//   pswd (the length of the password, shoud be specified)
function theFormValidation()
{
	var allInput = document.getElementsByTagName('input');
	var param = new Array;
	var elementDesc = "";
	var canBlank = 1;
	var verifyType = 'int';
	var errmsg = "";
	var verifyAttr = "";
	var isChanged = null;
	for(var ii=0; ii<allInput.length; ii++){
	  
		if(allInput[ii]==null || allInput[ii].type == 'radio'
		  || allInput[ii].type == 'checkbox' 
		  || allInput[ii].disabled == true) continue;

		isChanged = allInput[ii].getAttribute('ischanged');
		if(isChanged != null && parseInt(isChanged)!=1) continue;
		
		verifyAttr = allInput[ii].getAttribute('verify');
		if(verifyAttr == null || verifyAttr.length <=0 ) continue;
		
		
		param = verifyAttr.split("|");
		if(param.length < 3 ) continue;
		elementDesc = param[0] + " ";
		canBlank = parseInt(param[1]);
		verifyType = param[2];
		
		if(canBlank == 0){
			if(allInput[ii].value.length<=0){
				alert(elementDesc + YAHOO.FMG.GlobalText.fc_blank);
				return false;
			}
		}
		else {
			if(allInput[ii].value.length<=0) continue;
		}
		
		switch(verifyType){
		  case "int":
		    errmsg = elementDesc + YAHOO.FMG.GlobalText.fc_int;
		    if(false == checkFieldByRegExp(allInput[ii], RegExpCommon.INTEGER, errmsg)) return false;
		    break;
		  case "intrange":
		    if(param.length >4){
			errmsg = elementDesc + YAHOO.FMG.GlobalText.fc_within +" (" + param[3] + "," + param[4] + ")";
			if(param.length>5 && (parseInt(allInput[ii].value) == parseInt(param[5])) ){
				//donothing
				errmsg = errmsg;
			}
			//else if(param.length>5 && parseInt(param[5]) ==0){
				//do nothing
			//	errmsg = errmsg;
			//}
			else {
			   if(false == validateFieldRange(allInput[ii], parseInt(param[3]), parseInt(param[4]), errmsg)) return false;
			}
		    }
		    break;
		  case "ip4":
		    errmsg = elementDesc + YAHOO.FMG.GlobalText.fc_ip1;
		    if(false == checkFieldByRegExp(allInput[ii], RegExpCommon.IP_HOST, errmsg)) return false;
		    break;
		  case "ipmask4":
		    errmsg = elementDesc + YAHOO.FMG.GlobalText.fc_ip2;
		    if(false == checkFieldByRegExp(allInput[ii], RegExpCommon.IP_SUBNET, errmsg)) return false;
		    break;
		  case "ipport":
		    errmsg = elementDesc + YAHOO.FMG.GlobalText.fc_ipport;
		    if(false == checkFieldByRegExp(allInput[ii], RegExpCommon.IP_PORT, errmsg)) return false;
		    else {
			  var parser = new Array;
			  parser = allInput[ii].value.split(':');
			  if(parseInt(parser[1]) > 65535 || parseInt(parser[1]) < 1){
			      alert(elementDesc + YAHOO.FMG.GlobalText.fc_port);
			      return false;
			  }
		    }
		    break;
		  case "pswd":
		    if(param.length >3){
			errmsg = elementDesc + YAHOO.FMG.GlobalText.fc_length + " " + param[3];
			if(allInput[ii].value.length< param[3]){
			    alert(errmsg);
			    return false;
			}
		    }
		    break;
		  case "email":
		    errmsg = elementDesc + YAHOO.FMG.GlobalText.fc_email;
		    if(false == checkFieldByRegExp(allInput[ii], RegExpCommon.EMAIL_ADDRESS, errmsg)) return false;
		    break;
		  case "name":
		    errmsg = elementDesc + YAHOO.FMG.GlobalText.fc_invalidchar;
		    if(false == checkFieldByRegExp(allInput[ii], RegExpCommon.NAME, errmsg)) return false;
		    break;
		  case "restrictname":
		    errmsg = elementDesc + YAHOO.FMG.GlobalText.fc_invalidchar;
		    if(false == checkFieldByRegExp(allInput[ii], RegExpCommon.RESTRICT_NAME, errmsg)) return false;
		    break;
		}
		
	}
	
	return true;
}

function convertMaskDot2Num(mask) {
    var bitmask = 0;
    var mask_array;

    if (matchFieldExp(mask, [RegExpCommon.IP_MASK]) < 0) {
        return -1;
    }
	
    mask_array = mask.split(".");
	
    for (var i = 0; i < mask_array.length; i++) {
		
        for (; mask_array[i] > 0; mask_array[i] >>>= 1) {
            if (mask_array[i] & 0x1) bitmask++;
        }
    }

    return bitmask;
}

function List(id, form, size) {
    this.id = id;
    this.list = new Array();
    this.max_size = size;
    this.form = form;
    this.fields = new Array();

    this.find = function (key) {
        for (var i = 0; i < this.list.length; i++) {
            if (key == this.list[i][0]) return i;
        }
        return -1;
    };

    this.addEntry = function (valueArray) {
        if (this.list.length >= this.max_size) throw new Error(YAHOO.FMG.GlobalText.list_maxsize);
        if (this.find(valueArray[0]) >= 0) throw new Error(YAHOO.FMG.GlobalText.list_dup);

        this.list.push(valueArray);

        var tr = this.createListEntry(this.list.length - 1);
        document.getElementById(this.id).tBodies.item(0).appendChild(tr);
        return true;
    };

    this.editEntry = function (index, valueArray) {
        if ((index < 0) && (this.list.length >= this.max_size)) throw new Error(YAHOO.FMG.GlobalText.list_maxsize);
        if (this.find(valueArray[0]) >= 0 && this.find(valueArray[0]) != index) throw new Error(YAHOO.FMG.GlobalText.list_dup);

        if (index < 0) {
            this.list.push(valueArray);
            var tr = this.createListEntry(this.list.length - 1);
            document.getElementById(this.id).tBodies.item(0).appendChild(tr);
        }
        else {
            this.list[index] = valueArray;
            this.displayList();

        }
        return true;
    };

    this.deleteEntry = function (index) {
        this.list.splice(index, 1);
        this.displayList();
    };

    this.toForm = function () {
        for (var i = 0; i < this.list.length; i++) {
            for (var j = 0; j < this.fields.length; j++) {
                appendFormField(this.form, this.id + "_" + this.fields[j], this.list[i][j]);
            }
        }
    };

    this.displayList = function () {
        var tbl, tbody, tr, i;
        tbl = document.getElementById(this.id);
        tbody = tbl.tBodies.item(0);
        tbl.removeChild(tbody);
        tbody = document.createElement("TBODY");
        tbl.insertBefore(tbody, null);
        for (var i = 0; i < this.list.length; i++) {
            tr = this.createListEntry(i);
            tbody.insertBefore(tr, null);
        }
    }

    this.createListEntry = function (index) {
        var tr, td, text, a, img, access_text;
        tr = document.createElement("TR");
        td = document.createElement("TD");
        text = document.createTextNode(index + 1);
        tr.insertBefore(td, null);
        td.insertBefore(text, null);
        for (var i = 0; i < this.list[index].length; i++) {
            td = document.createElement("TD");
            text = document.createTextNode(this.list[index][i]);
            tr.insertBefore(td, null);
            td.insertBefore(text, null);
        }
        td = document.createElement("TD");
        a = document.createElement("A");
        a.href = "javascript: if (confirm('"+ YAHOO.FMG.GlobalText.list_msg +"')) deleteEntry(" + index + ");";
        img = document.createElement("IMG");
        img.setAttribute("src", "/resource/images/delete.gif");
        tr.insertBefore(td, null);
        td.insertBefore(a, null);
        a.insertBefore(img, null);
        return tr;
    }
}

function getRadioValue(theObj) {
	for (var i=0; i<theObj.length; i++) {
		if (theObj[i].checked) { return theObj[i].value;}
	}
	return "";
}
   
function htmlEncode(str){
        str=str.replace("&","&amp;");
        str=str.replace("<","&lt;");
        str=str.replace(">","&gt;");
        str=str.replace("\"","&quot;");
        return str;
}

function disabledOneOption(select) {
	select.onfocus = function(){ window.select_current[this.id] = this.selectedIndex; }
	select.onchange = function(){ restore(this); }
	emulate(select);
}

function restore(e) {
	if (e.options[e.selectedIndex].disabled) {
		e.selectedIndex = window.select_current[e.id];
	}
}

function emulate(e) {
	for (var i=0, option; option = e.options[i]; i++) {
		if (option.disabled) {
			option.style.color = "graytext";
		}
		else {
			option.style.color = "menutext";
		}
	}
}
function showFieldHelper(el)
{
    if (el && !el.value.length) {
        el.style.color = '#C0C0C0';
        el.value = el.title;
    }
}

function resetFieldValue(el)
{
    if (el && el.style.color != '' )
    {
        el.value = '';
        el.style.color = '';
    }
}
function cancel_onclick(cancelurl)
{
	if (! (window.focus && window.opener)) document.location=cancelurl;
	else{
		window.opener.focus();
		window.close();
	}
}
function checkMRVersion(el)
{
	var members =  el;
	var SplitName = members.value.split(','); 
	if(SplitName.length > 1) {
		for( var i=0; i< SplitName.length;i++) { 
			var iStart=SplitName[i].indexOf('(');
			var iEnd=SplitName[i].indexOf(')');
			if (iStart != -1 && iEnd !=-1) {
				SplitName[i] = SplitName[i].slice(iStart+1,iEnd); 
			} else  return false;
        }
		for( var i=0; i< SplitName.length;i++) { 
			for( var j=i+1; j< SplitName.length;j++) { 
				if (SplitName[j].indexOf(SplitName[i])==-1) return true;
			}         
		}         
	}         
	return false;  
}         

function addEvent(obj, type, fn)
{
    if (obj.addEventListener)
	obj.addEventListener( type, fn, false );
    else if (obj.attachEvent) {
	obj["e" + type + fn] = fn;
	obj[type + fn] = function() { 
	    obj["e" + type + fn]( window.event );
	}
	obj.attachEvent( "on" + type, obj[type + fn] );
    }
}

function removeEvent(obj, type, fn)
{
    if (obj.removeEventListener)
	obj.removeEventListener( type, fn, false );
    else if (obj.detachEvent) {
	obj.detachEvent( "on" + type, obj[type  +fn] );
	obj[type + fn] = null;
	obj["e" + type + fn] = null;
    }
}

function arrHasDuplicate( A )
{
 // finds any duplicate array elements using the fewest possible comparison, it is not the best one, n**2 algorithm,OK for small array size
        var i, j, n;
        n=A.length;
        for (i=0; i<n; i++)
        {
                // outer loop uses each item i at 0 through n
                for (j=i+1; j<n; j++)
                {
                      // inner loop only compares items j at i+1 to n
                        if (A[i]==A[j])
                        {
                                error_index=j;
                                return true;
                        }
                }
        }
        return false;
}



/***********************************************************************************
 * From now on, we are going to clean up the js utility functions
 * Please use the following functions as your first choice,
 * if the following function can not satify your requirement and the function is 
 * in use in a lot pages, please add your JS function below and please add comments
 * thank you.
 * Jerry Zhang May 22, 2008
*************************************************************************************/

// Parameter:
//     sInString is string type,
//
// return:
//     this function will return trimed string
function trimString(sInString) 
{
	if(sInString==null || sInString.length<=0) return "";
	sInString = sInString.replace( /^\s+/g, "" );	// strip leading
	return sInString.replace( /\s+$/g, "" );	// strip trailing
}

function getRealEscapedString(sInString) 
{
	if(sInString==null || sInString.length<=0) return "";
	sInString = escape(sInString);
	return sInString.replace( /\+/g, "%2B" );
}

// Parameter:
//     nameString is string type to specify a name
//     errmsg is the error message which will be alerted when the nameString is invalid.
// return:
//     this function will return true if valid, false if invalid
function validateName(nameString, errmsg)
{
	if(null == nameString) return false;
	nameString = trimString(nameString);
	return checkValueByRegExp(nameString, RegExpCommon.RESTRICT_NAME, errmsg);

}
function validateNameIncludeSpace(nameString, errmsg)
{
	if(null == nameString) return false;
	nameString = trimString(nameString);
	return checkValueByRegExp(nameString, RegExpCommon.RESTRICT_NAME_INCLUDE_SPACE, errmsg);

}
function validateNameIncludeSpaceSlash(nameString, errmsg)
{
	if(null == nameString) return false;
	nameString = trimString(nameString);
	return checkValueByRegExp(nameString, RegExpCommon.RESTRICT_NAME_INCLUDE_SPACE_SLASH, errmsg);

}


function cloneSelectionObj(srcOptObj, dstOptObj)
{
	for(var ii=0; ii<srcOptObj.options.length; ii++){
		aOpt = new Option(srcOptObj.options[ii].text, srcOptObj.options[ii].value);
		dstOptObj.options[dstOptObj.options.length] = aOpt;
	}
}

function setSelectedOption(selectObj, aValue)
{
	if(selectObj == null) return;
	for(var ii=0; ii<selectObj.options.length; ii++){
		if(selectObj.options[ii].value==aValue){
			selectObj.options[ii].selected = true;
			break;
		}
	}
}

// this function is used for disable/enable given objects
// Parameter:
//    objCtrlArray contains all document.element objects
//    flag shows disable those objects or enable those objects.
function disableOrEnableObjects(objCtrlArray, flag)
{
	for(var ii=0; ii<objCtrlArray.length; ii++){

		if(objCtrlArray[ii])objCtrlArray[ii].disabled=flag;

	}
}

// this function is used for display/hidden given objects
// Parameter:
//    objCtrlArray contains all document.element objects
//    flag shows display those objects or hidden those objects.
function displayOrHiddenObjects(objCtrlArray, flag)
{
	var status = "none";
	if(flag) status = "";

	for(var ii=0; ii<objCtrlArray.length; ii++){

		if(objCtrlArray[ii])objCtrlArray[ii].style.display=status;

	}
}

// this function is used to set focus and selection of given object
// Parameter:
//    obj to be set focus and selected
// better to use this for Input/textarea elements
function setObjFocusAndSelected(obj)
{
	if(obj){
		obj.focus();
		obj.select();
	}
}
// Parameter:
//     obj is text box object
//     errmsg is error msg
//
// return:
//     return true when the value is blank
function isBlank(obj, errmsg) 
{
	if(obj == null ) {
		alert(errmsg);	
		return true;
	}
	obj.value = trimString(obj.value);
	if(obj.value != null && obj.value.length <= 0){
		obj.focus();
		alert(errmsg);	
		return true;
	}
	return false;	
}

// this function is to add a new entry (option) to certain select elements
// usually it is used by popup dialog for dropdown list such as address select in policy
// the HTML render out happens on PageGlobal.h-> Page_redirect()
// Parameter:
//    theValue is the value attribute of option element
//    theText is the text attribute of option element
//    flag is extra, use for future
Util.theSelectElementId = "";
Util.theInsertPoint = -1;
Util.actionAfterAddingOption = null;
Util.dynAddOptionToSelection = function(theValue, theText, flag)
{
	if(Util.theSelectElementId.length <=0 ) return;
	if(Util.theInsertPoint < 0 ) return;
	var theSelect = document.getElementById(Util.theSelectElementId);
	if(theSelect == null) return;

	var newOpt = new Option(theText, theValue);
	newOpt.selected = true;
	if(Util.theInsertPoint >= theSelect.options.length){
		try
		{
			theSelect.add(newOpt,null); // standards compliant
		}
		catch(ex)
		{
			theSelect.add(newOpt); // IE only
		}
	}
	else {
		try
		{
			theSelect.add(newOpt,theSelect.options[Util.theInsertPoint+1]); // standards compliant
		}
		catch(ex)
		{
			theSelect.add(newOpt, (Util.theInsertPoint+1)); // IE only
		}
	}
	// reset it
	Util.theSelectElementId = "";
	Util.theInsertPoint = -1;

	if(typeof(Util.actionAfterAddingOption) == 'function'){
		Util.actionAfterAddingOption();
		Util.actionAfterAddingOption = null;
	}
}
Util.PAGINATION_COOKIE_NAME = "PAGINATION";
Util.setPaginationCookie = function (theId, thePage, theRowsPerPage)
{
	if(thePage == null || theRowsPerPage == null || theRowsPerPage === 0) return;
	
	//cookie format: rows:page:category#   (e.g 50:2:181#100:1:182#)
	var allCookieValue = getCookie(Util.PAGINATION_COOKIE_NAME);
	
	if(allCookieValue == null) {
		allCookieValue = "";
	}

	var cookieKey = ":" + theId + "#";
	var newSecCookie = theRowsPerPage + ":" + thePage + cookieKey;

	var pos = allCookieValue.indexOf(cookieKey);
	if( pos >0 ){
		var suffixCookie = allCookieValue.substr(pos+cookieKey.length);
		while(pos>=0 && allCookieValue.charAt(pos) != "#") {
			pos = pos -1;
		}
		var prefixCookie = allCookieValue.substr(0, pos+1);
		allCookieValue = prefixCookie + newSecCookie + suffixCookie;
	}
	else {
		allCookieValue += newSecCookie;
	}
	
	setCookie(Util.PAGINATION_COOKIE_NAME, allCookieValue, null, 1);

}


Util.getPaginationCookie = function (theId, defPageSettings)
{
	//cookie format: rows:page:category#   (e.g 50:2:181#100:1:182#)
	var allCookieValue = getCookie(Util.PAGINATION_COOKIE_NAME);
	
	if(allCookieValue == null) return defPageSettings;

	var cookieKey = ":" + theId + "#";

	var pos = allCookieValue.indexOf(cookieKey);
	if( pos < 0 ) return defPageSettings;
	
	var startpos = pos;
	while(startpos>=0 && allCookieValue.charAt(startpos) != "#") {
		startpos = startpos -1;
	}
	var pageSettingsStr = allCookieValue.substr(startpos+1, pos-startpos);
	var pageSettingsArray = pageSettingsStr.split(":");
	if(pageSettingsArray.length < 2) return defPageSettings;
	
	var retPageSettings = {rowsPerPage:parseInt(pageSettingsArray[0]), page:parseInt(pageSettingsArray[1])};
	
	if(retPageSettings.rowsPerPage == NaN || retPageSettings.page == NaN || retPageSettings.rowsPerPage === 0 ){
		retPageSettings = defPageSettings;
	}
	
	return retPageSettings;
}

Util.limitFieldLength = function (obj, len, msg){
	if(obj.value.length >len){
		var messg = msg ? msg : "The length of the description must not exceed 63 characters.";
		alert(messg);
		obj.value = obj.value.substring(0, len);
		return false;
	}
}


// this function is used to add a row for multi-entry table
// such as VPN proposal (encrypt&auth) table
// param: idstr means the table id
//        maxRows means max number of the entries was allowed
//        extraFuncName: is a string represents a extend js function
//                       some times you need to initialize the value of element in each row
//                       then define a js function and plug to here. this function will take a
//                       row object as an input parameter
function addTableRowAction(idstr, maxRows, extraFuncName)
{
	var aTable = document.getElementById(idstr);
	if(aTable == null ) return;

	if(maxRows == null) maxRows = 9999;

	var rowIndex = aTable.rows.length;
	aTable.insertRow(rowIndex);

	var ii = 0;	
	var colIndex = aTable.rows[0].cells.length - 1;
	for(; ii<colIndex; ii++){
		aTable.rows[rowIndex].insertCell(ii);
		aTable.rows[rowIndex].cells[ii].style.padding = aTable.rows[0].cells[ii].style.padding;
		aTable.rows[rowIndex].cells[ii].innerHTML = aTable.rows[0].cells[ii].innerHTML;
	}
	aTable.rows[rowIndex].insertCell(colIndex);

	// since index start from zero, minus one here
	if(rowIndex < maxRows-1){
		aTable.rows[rowIndex].cells[colIndex].innerHTML = "<nobr><a href=\"#\" onclick=\"addTableRowAction('"+idstr+"',"+maxRows+",'"+extraFuncName+"');\" ><img alt='add' title='add'  src='/resource/images/addprop.gif'></a>&nbsp;&nbsp;&nbsp;";
	}

	aTable.rows[rowIndex].cells[colIndex].innerHTML += "<a href=\"#\" onclick=\"delTableRowAction('"+idstr+"',"+maxRows+",'"+extraFuncName+"');\" ><img alt='delete' title='delete' src='/resource/images/fdscomp_delete.gif'></a></nobr>";

	if(rowIndex-1>=0)aTable.rows[rowIndex-1].cells[colIndex].innerHTML = "";
	
	if(extraFuncName != null ){
		var theFunc = eval(extraFuncName);
		if(typeof theFunc == 'function'){
			theFunc(aTable.rows[rowIndex]);
		}
	}
}
	
// this function is used to delete a row for multi-entry table
// such as VPN proposal (encrypt&auth) table
// param: idstr means the table id
//        maxRows means max number of the entries was allowed
//        extraFuncName: is a string represents a extend js function
//                       some times you need to initialize the value of element in each row
//                       then define a js function and plug to here. this function will take a
//                       row object as an input parameter
function delTableRowAction(idstr, maxRows, extraFuncName)
{
	var aTable = document.getElementById(idstr);
	if(aTable == null ) return;

	if(maxRows == null) maxRows = 9999;

	var rowIndex = aTable.rows.length-1;
	
	if(rowIndex <= 0)return;
	
	aTable.deleteRow(rowIndex);
	rowIndex = rowIndex -1;
	
	var colIndex = aTable.rows[rowIndex].cells.length-1;
	if(rowIndex == 0){
		aTable.rows[rowIndex].cells[colIndex].innerHTML = "<a href=\"#\" onclick=\"addTableRowAction('"+idstr+"',"+maxRows+",'"+extraFuncName+"');\" ><img alt='add' title='add'  src='/resource/images/addprop.gif'></a>";
	}
	else {
		aTable.rows[rowIndex].cells[colIndex].innerHTML = "<nobr><a href=\"#\" onclick=\"addTableRowAction('"+idstr+"',"+maxRows+",'"+extraFuncName+"');\" ><img alt='add' title='add'  src='/resource/images/addprop.gif'></a>&nbsp;&nbsp;&nbsp;";

		aTable.rows[rowIndex].cells[colIndex].innerHTML += "<a href=\"#\" onclick=\"delTableRowAction('"+idstr+"',"+maxRows+",'"+extraFuncName+"');\" ><img alt='delete' title='delete' src='/resource/images/fdscomp_delete.gif'></a></nobr>";
	}
	
}

function getTableValues(idstr)
{
	var aTable = document.getElementById(idstr);
	if(aTable == null) return "";
	
	var allValues = "";
	for(var ii=0; ii<aTable.rows.length; ii++)
	{
		var aRow = aTable.rows[ii];
		if(allValues.length>0) allValues +="#";
		
		var aRowValue = "";
		for(var kk=0; kk<aRow.cells.length; kk++)
		{
			var aCell = aRow.cells[kk];
			var aElem = new Array();
			
			aElem = aCell.getElementsByTagName("select");
			if(aElem != null && aElem.length>0){
				if(aRowValue.length>0) aRowValue +=":";
				aRowValue += aElem[0].value;
			}
			else {
				aElem = aCell.getElementsByTagName("input");
				if(aElem != null && aElem.length>0){
					if(aRowValue.length>0) aRowValue +=":";
					aRowValue += aElem[0].value;
				}
				
			}//else
			
		}//inner for
		
		allValues += aRowValue;
	}//outter for
	
	return allValues;
}


// This function is used to render html progressbar by JavaScript:
// Parameter:
//    percentage mean the percentage
//
// return:
//     this function will return HTML string
function renderProgressBarHTML(percentage, position)
{
	if(percentage==null ) return "";
	if(percentage<0 ) percentage = 0;
	if(percentage > 100 ) percentage = 100;

	if(position == null) position = "center";

	var htmlStr='';
	htmlStr += "<table align=\""+position+"\" style=\"width:150px; border:0px; padding:0;\" cellspacing=\"0\">";
	htmlStr += "<tr><td style=\"border:0px; padding:0;\">";
	htmlStr += "<table class=\"graph\" width=\"100\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>";
	htmlStr += "<td style=\"padding:0px 0px 0px 0px; height:10px;\" width='" + percentage + "%' background=\"/resource/images/bar_bg.gif\">";

	//htmlStr += "<img src=\"/resource/images/shim.gif\"></td>";
	htmlStr += "<td style=\"padding:0px 0px 0px 0px; height:10px;\" width='" + (100-percentage) + "%' >";

	htmlStr += "</td></tr></table></td>";
	htmlStr += "<td style=\"border:0px; padding:0;\">" + percentage + "%</td></tr></table>";

	return htmlStr;
}

// This function is used to render image button html :
// Parameter:
//    isVisible= true means be shown, false means be hidden, 
//               null/by default be shown
//
// return:
//     this function will return HTML string
function renderIconButtonHTML(imgURL, imgTitle, imgwidth, imgheight, actionURL, onclickAction, isVisible)
{
	var visibilityTag = true;

	if(isVisible != null){
		visibilityTag = isVisible;
	}

	var htmlStr='';
	htmlStr += "<a href='" +actionURL+ "' onclick='" + onclickAction + ";' ";
	if(visibilityTag){
		htmlStr += " >";
	}else
	{
		htmlStr += " style='display:none;' >";
	}
	htmlStr += "<img title='" + imgTitle + "' ";

	if(imgwidth && imgwidth>0)
		htmlStr += "width='" + imgwidth +"' ";

	if(imgheight && imgheight>0)
		htmlStr += "height='" + imgheight + "' ";

	htmlStr += "src='" + imgURL + "'></a>";

	return htmlStr;
}


// xml format:
// <dataList>
//   <status>disabled</status> //means disable this combox
//   <pair>
//     <key>...</key> // which is the option.text
//     <value>...</value> // which is the option.value
//     <id>...</id> // which is the option.id
//     <name>...</name> // which is the option.name
//   </pair>
//   <pair>
//     ......
//   </pair>
// </dataList>

// thisSelect is the object of combox component
// loading is the loading label object
// initValue is pre-selected item
// xmlObj is the this.req.responseXML of net object

function ajax_fill_combox_handler(thisSelect, loadingLabel, initValue, xmlObj, isDisabled)
{
	if(loadingLabel)loadingLabel.style.display="none";
	if(thisSelect == null) return;

	var xmlDoc=xmlObj;
	var elDocRoot=xmlDoc.getElementsByTagName("dataList")[0];
	if (elDocRoot){
		var statusNode = elDocRoot.getElementsByTagName("status")[0];
		if(statusNode){
			status = statusNode.firstChild.data;
			if(status =="disabled"){
				thisSelect.disabled = true;
			}else{
				thisSelect.disabled = false;
			}
		}//if

		var pairList = elDocRoot.getElementsByTagName("pair");
		thisSelect.options.length = 0;
		if(pairList){
			for(var ii=0; ii<pairList.length; ii++){
				var keyList = pairList[ii].getElementsByTagName("key");
				var valueList = pairList[ii].getElementsByTagName("value");
				var idList = pairList[ii].getElementsByTagName("id");
				var nameList = pairList[ii].getElementsByTagName("name");

				if(keyList && keyList.length>0 && valueList && valueList.length>0){
					var key = keyList[0].firstChild.data;
					var value = valueList[0].firstChild.data;
					var aOption = new Option(key, value);
					if(idList && idList.length>0) aOption.id = idList[0].firstChild.data;
					if(nameList && nameList.length>0) aOption.name = nameList[0].firstChild.data;
					if(initValue && initValue==value)aOption.selected=true;
					thisSelect.options[thisSelect.options.length] = aOption;
				}//if
			}//for

		}//if
	}//if (elDocRoot)

	if(isDisabled!=null && isDisabled==true){
		thisSelect.disabled = true;
	}
}


//Ajax table
function callbackFunctionClass(tagName, functionPTR)
{
	this.tag = '';
	this.func = null;

	if(tagName && tagName.length>0)
		this.tag = tagName;

	if(functionPTR != null)
		this.func = functionPTR;
}
function registeredCallbackFuncs()
{
	this.callbackFuncs = new Array();

	this.getCallbackFunc = function(tagName)
	{
		for(var ii=0; ii<this.callbackFuncs.length; ii++)
		{
			if(this.callbackFuncs[ii].tag == tagName)
				return this.callbackFuncs[ii].func;
		}
		return null;
	};
	this.getCallbackFuncIndex = function(tagName)
	{
		for(var ii=0; ii<this.callbackFuncs.length; ii++)
		{
			if(this.callbackFuncs[ii].tag == tagName)
				return ii;
		}
		return -1;
	};

	this.addCallbackFunc = function(tagName, functionPTR)
	{
		//check if already in the list
		var idx = this.getCallbackFuncIndex(tagName);
		if(idx>=0){
			this.callbackFuncs[idx].func = functionPTR;
		}
		else 
		{
			this.callbackFuncs.push(new callbackFunctionClass(tagName, functionPTR));
		}
	};

	this.removeCallbackFuncByTagName = function(tagName)
	{
		for(var ii=0; ii<this.callbackFuncs.length; ii++)
		{
			if(callbackFuncs[ii].tag == tagName){
				this.callbackFuncs.splice(ii,1);//remove
				return;
			}
		}
	};

}

/// new functions
function tableRenderClass(tableObj, loadinglabel, columnRenders, rowActionRender, needpaging)
{
	this.table = tableObj;
	this.loading = loadinglabel;
	this.colRender = columnRenders;
	this.rowActions = rowActionRender;
	this.needpaging = needpaging;
	this.toString = function(){
		var retStr = "";
		retStr += (this.table)?this.table.id:" " + "|!|";
		retStr += (this.loading)? this.loading.id:" " + "|!|";
		retStr += (this.colRender)? this.colRender.name:"null" + "|!|";
		retStr += (this.rowActions)? this.rowActions.name:"null" + "|!|";
		if(this.needpaging == true)
			retStr += 'true';
		else 
			retStr += 'false';
		return retStr;
	}

	this.genObject = function(serializedStr){
		var params = new Array();
		params = serializedStr.split("|!|");
		if(params.length!=5) return null;
		this.table = document.getElementById(params[0]);
		this.loading = document.getElementById(params[1]);
		this.colRender = eval(params[2]);
		this.rowActions = eval(params[3]);
		this.needpaging = eval(params[4]);
		return this;
	}
}

function queryClass(url, actionId, param, isAsync, startpage, numOfRowsPerPage)
{
	this.url = url;
	this.actionId = actionId;
	this.param = param;
	this.isAsync = isAsync;
	this.startp = 1;
	this.rowsPerPage = 50;
	this.totalNum = 0;

	if(startpage) this.startp = startpage;
	if(numOfRowsPerPage) this.rowsPerPage = numOfRowsPerPage;

	this.toString = function(){
		var retStr = "";
		retStr += this.url + "|!|";
		retStr += this.actionId + "|!|";
		retStr += this.param + "|!|";

		if(this.isAsync){
			retStr += 'true' + "|!|";
		}
		else
		{
			retStr += 'false' + "|!|";
		}

		retStr += this.startp + "|!|";
		retStr += this.rowsPerPage + "|!|";
		retStr += this.totalNum;
		
		return retStr;
	}

	this.genObject = function(serializedStr){
		var params = new Array();
		params = serializedStr.split("|!|");
		if(params.length!=7) return null;
		this.url = params[0];
		this.actionId = params[1];
		this.param = params[2];
		this.isAsync = eval(params[3]);
		this.startp = eval(params[4]);
		this.rowsPerPage = eval(params[5]);
		this.totalNum = eval(params[6]);
		return this;
	}

}
function flipPageAction( changes, serializedTableRender, serializedQuery)
{
	var query = new queryClass();
	query = query.genObject(serializedQuery);

	var startp = query.startp;
	var numOfRowsPerPage = query.rowsPerPage;
	var totalpage = Math.ceil(query.totalNum/numOfRowsPerPage);

	if(startp==1 || startp==totalpage) return;

	if(startp<=0) startp = 1;
	if(startp>totalpage) startp=totalpage;
	query.startp = startp;

	var tableRender = new tableRenderClass();
	var updateTable = new queryTable(tableRender.genObject(serializedTableRender), query);
	updateTable.startQuery();
}

function renderPaginationHTML(titleStr, tableRenderObj,  queryObj)
{
	var startp = queryObj.startp;
	var numOfRowsPerPage = queryObj.rowsPerPage;
	var totalRows = queryObj.totalNum;

	var colRenderName = "";
	if(tableRenderObj.colRender) colRenderName = tableRenderObj.colRender.name;

	var rowActionRenderName = "";
	if(tableRenderObj.rowActions) rowActionRenderName = tableRenderObj.rowActions.name;

	var tableId = tableRenderObj.table.id;
	var theUrl = queryObj.url;
	var theActionId = queryObj.actionId;
	var theParam = queryObj.param;

	var titleText = "&nbsp;";
	if(titleStr) titleText = titleStr;

	var numOfRows = 50;
	if(numOfRowsPerPage) numOfRows = parseInt(numOfRowsPerPage);
	if(numOfRows <= 0) numOfRows = 50;

	var totalpage = 0;
	if(totalRows) totalpage = Math.ceil(totalRows/numOfRows);

	var startpage = 1;
	if(startp) startpage = parseInt(startp);
	if(startpage <=0) startpage = 1;
	if(totalpage <= 0) startpage = 0;

	var retHTMLStr = "<table width=100% cellspacing='0' cellpadding='0' border='0'>";
	retHTMLStr +="<tr><td style='text-align:left;'>" + titleText + "</td>";
	retHTMLStr +="<td style='text-align:right;' valign=center>";

	retHTMLStr +="<img src=\"/resource/images/firstpg_d.gif\" style=\"cursor: pointer\" ";
	retHTMLStr +="alt=" + YAHOO.FMG.GlobalText.gb_firstpage;
	retHTMLStr +="title=" + YAHOO.FMG.GlobalText.gb_firstpage;
	retHTMLStr +="onclick=\"flipPageAction(-90000,'" +tableRenderObj.toString() +"','"+ queryObj.toString()+"');\">&nbsp;&nbsp;";

	retHTMLStr +="<img id='imgPre' src=\"/resource/images/prevpg_d.gif\" style=\"cursor: pointer\" ";
	retHTMLStr +="alt=" + YAHOO.FMG.GlobalText.gb_prepage;
	retHTMLStr +="title=" + YAHOO.FMG.GlobalText.gb_prepage;
	retHTMLStr +="onclick=\"flipPageAction(-1,'" +tableRenderObj.toString() +"','"+ queryObj.toString()+"');\">&nbsp;&nbsp;";
	retHTMLStr +="<span >" + startpage + "</span>/";
	retHTMLStr +="<span >" + totalpage + "</span>";


	retHTMLStr +="<img id='imgNext' src=\"/resource/images/nextpg_d.gif\" style=\"cursor: pointer\" ";
	retHTMLStr +="alt=" + YAHOO.FMG.GlobalText.gb_nextpage;
	retHTMLStr +="title=" + YAHOO.FMG.GlobalText.gb_nextpage;
	retHTMLStr +="onclick=\"flipPageAction(1, '" +tableRenderObj.toString() +"','"+ queryObj.toString()+"');\">&nbsp;&nbsp;";

	retHTMLStr +="<img id='imgLast' src=\"/resource/images/lastpg_d.gif\" style=\"cursor: pointer\" ";
	retHTMLStr +="alt=" + YAHOO.FMG.GlobalText.gb_lastpage;
	retHTMLStr +="title=" + YAHOO.FMG.GlobalText.gb_lastpage;
	retHTMLStr +="onclick=\"flipPageAction(90000, '" +tableRenderObj.toString() +"', '"+ queryObj.toString()+"');\">";

	retHTMLStr += "</td></tr></table>";
	return retHTMLStr;

}
function ajax_Fill_aRow_to_Table(aRowXML, parentKeys, tableRenderObj, isHeader)
{
	if(aRowXML == null || tableRenderObj == null || tableRenderObj.table == null) return;

	var indexRow = tableRenderObj.table.rows.length;
	var numOfCols = 0;

	tableRenderObj.table.insertRow(indexRow);

	var rowId = aRowXML.getElementsByTagName("id");
	var styleClass = aRowXML.getElementsByTagName("class");
	var styleStr = aRowXML.getElementsByTagName("style");

	if(rowId && rowId.length>0 && rowId[0].firstChild) 
		tableRenderObj.table.rows[indexRow].setAttribute('id', rowId[0].firstChild.data);

	if(styleClass && styleClass.length>0 && styleClass[0].firstChild) 
		tableRenderObj.table.rows[indexRow].setAttribute('class', styleClass[0].firstChild.data);

	if(styleStr && styleStr.length>0 && styleStr[0].firstChild) 
		tableRenderObj.table.rows[indexRow].setAttribute('style', styleStr[0].firstChild.data);


	// row keys
	var rowActionKeys = new Array();
	if(parentKeys){
		for(var kk=0; kk<parentKeys.length; kk++){
			rowActionKeys[kk] = parentKeys[kk];
		}
	}

	var rowKeys = aRowXML.getElementsByTagName("key");
	if(rowKeys)
	{
		for(var ii=0; ii<rowKeys.length; ii++)
		{
			if(rowKeys[ii] && rowKeys[ii].firstChild)
				rowActionKeys.push(rowKeys[ii].firstChild.data);
		}
	}

	var columnsXML = aRowXML.getElementsByTagName("col");
	if(columnsXML == null) return;

	for(numOfCols=0; numOfCols<columnsXML.length; numOfCols++)
	{
		tableRenderObj.table.rows[indexRow].insertCell(numOfCols);

		// column id
		var col_Id = columnsXML[numOfCols].getElementsByTagName("id");
		if(col_Id.length>0 && col_Id[0].firstChild) 
			tableRenderObj.table.rows[indexRow].cells[numOfCols].setAttribute('id',col_Id[0].firstChild.data);

		// column class
		var col_class = columnsXML[numOfCols].getElementsByTagName("class");
		if(col_class.length>0 && col_class[0].firstChild) 
			tableRenderObj.table.rows[indexRow].cells[numOfCols].setAttribute('class', col_class[0].firstChild.data);

		// column style
		var col_style = columnsXML[numOfCols].getElementsByTagName("style");
		if(col_style.length>0 && col_style[0].firstChild) 
			tableRenderObj.table.rows[indexRow].cells[numOfCols].setAttribute('style', unescape(col_style[0].firstChild.data) );

		// column content
		var col_content = columnsXML[numOfCols].getElementsByTagName("content");
		var contentValue = '';
		if(col_content.length>0 && col_content[0].firstChild) 
			contentValue = unescape(col_content[0].firstChild.data);


		// call back function tag
		var col_func_tag = columnsXML[numOfCols].getElementsByTagName("tag");
		if(col_func_tag.length>0 && col_func_tag[0].firstChild && colRenders)
		{
			var colRenderFunc = tableRenderObj.colRender.getCallbackFunc(col_func_tag[0].firstChild.data);
			if(colRenderFunc)
			{
				tableRenderObj.table.rows[indexRow].cells[numOfCols].innerHTML = colRenderFunc(rowId, rowActionKeys, contentValue);
			} else {
				tableRenderObj.table.rows[indexRow].cells[numOfCols].innerHTML = contentValue;
			}
				
		} else {
			tableRenderObj.table.rows[indexRow].cells[numOfCols].innerHTML = contentValue;
		}

	}


	// if row action render exist then add action column
	if(tableRenderObj.rowActions == null) return;
	tableRenderObj.table.rows[indexRow].insertCell(numOfCols);

	// row action
	var rowPermit = aRowXML.getElementsByTagName("permit");

	var permit = true;
	if(rowPermit.length>0 && rowPermit[0].firstChild && rowPermit[0].firstChild.data == '0'){
		permit = false;
	}

	// this will use the callback function rowActionRender to get the table action
	// the callback should take the rowActionKeys  array as parameter
	// permit mean if it can be deleted.
	tableRenderObj.table.rows[indexRow].cells[numOfCols].innerHTML = tableRenderObj.rowActions(rowActionKeys, permit, isHeader);
	rowActionKeys = null;
}

function ajax_Render_Table_Handler(xmlObj, tableRenderObj, queryObj)
{
	if(tableRenderObj.loading)tableRenderObj.loading.style.display="none";
	if(tableRenderObj == null || tableRenderObj.table == null) return;

	var xmlDoc=xmlObj;
	var elDocRoot=xmlDoc.getElementsByTagName("dataList")[0];
	if (elDocRoot){
		var statusNode = elDocRoot.getElementsByTagName("status")[0];
		if(statusNode){
			status = statusNode.firstChild.data;
			if(status !="success"){
				return;
			}
		}//if

		var tableKeyStr = "";
		var tableKeys = elDocRoot.getElementsByTagName("tkey");
		var parentKeys = new Array();
		if(tableKeys)
		{
			for(var ii=0; ii<tableKeys.length; ii++)
			{
				if(tableKeys[ii] && tableKeys[ii].firstChild){
					parentKeys.push(tableKeys[ii].firstChild.data);
					tableKeyStr +="_" + tableKeys[ii].firstChild.data;
				}
			}
		}

		tableRenderObj.table.innerHTML = "";
		if(tableRenderObj.needpaging)
		{
			var tabletitle = elDocRoot.getElementsByTagName("tabletitle")[0];
			var totalrows = elDocRoot.getElementsByTagName("totalrows")[0];
			var totalcols = elDocRoot.getElementsByTagName("totalcols")[0];
			var currentpage = elDocRoot.getElementsByTagName("currentpage")[0];

			var theTitle = (tabletitle && tabletitle.firstChild)? tabletitle.firstChild.data : "";
			queryObj.startp = (currentpage && currentpage.firstChild)? currentpage.firstChild.data : 0;
			queryObj.totalNum = (totalrows && totalrows.firstChild)? totalrows.firstChild.data : 0;

			if(parseInt(queryObj.totalNum) >0){
				tableRenderObj.table.insertRow(0);
				tableRenderObj.table.rows[0].setAttribute('id', "page"+tableKeyStr);
				tableRenderObj.table.rows[0].setAttribute('class', "dark");
				tableRenderObj.table.rows[0].setAttribute('style', "padding:0 0 0 0;");

				tableRenderObj.table.rows[0].insertCell(0);
				tableRenderObj.table.rows[0].cells[0].setAttribute('colspan', "99");
				tableRenderObj.table.rows[0].cells[0].setAttribute('style', "padding:0 0 0 0;");
				tableRenderObj.table.rows[0].cells[0].innerHTML = renderPaginationHTML(theTitle, tableRenderObj, queryObj);
			}
		}

		// table header
		var header = elDocRoot.getElementsByTagName("header")[0];
		ajax_Fill_aRow_to_Table(header, parentKeys, tableRenderObj, true);

		// table rows
		var aRow = elDocRoot.getElementsByTagName("arow");
		if(aRow){
			for(var kk=0; kk<aRow.length; kk++)
				ajax_Fill_aRow_to_Table(aRow[kk], parentKeys, tableRenderObj, false);
		}
	}//if (elDocRoot)

}

function queryTable(tableRenderObj, queryObj)
{
	this.ajaxHandler = function(){
		this.tableRender = tableRenderObj;
		this.query = queryObj;
		var xmlDoc=this.req.responseXML;
		ajax_Render_Table_Handler(xmlDoc, this.tableRender, this.query);
	};

	this.startQuery = function(){
		var strParams="action="+queryObj.actionId + queryObj.param;
		strParams += '&startpage='+queryObj.startp + '&rowspp=' + queryObj.rowsPerPage;

		var loader = new net.ContentLoader(queryObj.url, this.ajaxHandler, null, "POST", strParams, null, queryObj.isAsync);

	};
}

function check_hex(value)
{
	var i,s;
	for (i=0; i < value.length; i++)
	{
		s = value.charAt(i);
		s=s.toLowerCase();
		if ((s > 'f') || (s < '0')) { return false; }
	}
	return true;
}
    
//hide Monitor panel some time, such as HA-Slave, hardcode- id now, 1-for monitor moudle
function hide_panelbar_some_case(panel_id)
{
	var id="panelbar_"+panel_id;
	var s_moudle = top.document.getElementById(id);
        if(s_moudle != null)
               s_moudle.style.display='none';
}
function processCmd(action,name,key)
{
           var numargs = arguments.length;
           var thisForm=document.forms[0];
           if (thisForm.actionevent)
               thisForm.actionevent.value=action;
           else
               appendFormField(thisForm, "actionevent", action);
               for (var i=1;i<numargs;i=i+2)
                   appendFormField(thisForm,arguments[i] ,arguments[i+1]);
               thisForm.submit();
}

// filter functions from FOS

function FilterDisplay(fieldName, filterType, enable, negate, contains, value) {
        this.fieldName = fieldName;
        this.filterType = filterType;
        this.enable = enable;
        this.contains = contains;
        this.negate = negate;
        this.value = value;
        this.toArray = function toArray() {
                var filterArray = new Array(this.fieldName, this.enable, this.negate, this.contains, this.value);
                return filterArray;
        }
}

function getFilterDisplay(filterArray, fieldName) {
        for (var i = 0; i < filterArray.length; i++) {
                if (filterArray[i][0] == fieldName) {
                        return new FilterDisplay(fieldName, filterArray[i][1], filterArray[i][2], filterArray[i][3], filterArray[i][4]);
                }
        }
        return new FilterDisplay(fieldName, 1, 0, 0, null);
}
function setFilterDisplay(filterCookieArray, filter) {
        if (!filter) return filterCookieArray;
        if (!filterCookieArray) {
                filterCookieArray = [];
        }
        for (var i = 0; i < filterCookieArray.length; i++) {
                if (filterCookieArray[i][0] == filter.fieldName) {
                        filterCookieArray[i] = filter.toArray();
                        return filterCookieArray;
                }
        }
        filterCookieArray[filterCookieArray.length] = filter.toArray();
        return filterCookieArray;
}

function removeFilterDisplay(filterCookieArray, fieldName) {
        if (!filterCookieArray) {
                filterCookieArray = [];
        }
        for (var i = 0; i < filterCookieArray.length; i++) {
                if (filterCookieArray[i][0] == fieldName) {
                        filterCookieArray.splice(i, 1);
                        break;
                }
        }
        return filterCookieArray;
}
function popupdlg(obj, link, width, height) {
    window.inputcontainer = obj;
    popup(link, null, width, height,'yes');
}

function dlgButtonClick(link)
{
    if (window.opener) {
	if (opener.inputcontainer) opener.inputcontainer = null;
	if (opener.newObj) opener.newObj = null;
        window.close();
	return;
    }
    if (link && link.length > 0) document.location = link;
    else history.back();
}

function dlgSubmitClick(val) {
    if (window.opener) {
	if(opener.inputcontainer)
	        opener.inputcontainer(val.value);
	if (opener.newObj)
	    opener.newObj.value = typeof(val) == "String" ? val : val.value;
	if (val.form)
	    appendFormField(val.form, 'retval', typeof(val) == "String" ? val : val.value);
   }
}

function popupDetachedWindow(link, windowName, width, height,x,y) {

	Util.popupWindow = window.open(link, windowName, 'directories=no,dependent=yes,resizable=yes,scrollbars=no,menubar=no,toolbar=no,status=no,location=no,width=' + width + ',height=' + height + ',top=' + y + ',left=' + x + ',screenX=' + x + ',screenY=' + y);
	Util.popupWindow.resizeTo(width, height);
	Util.popupWindow.moveTo(x, y);
	Util.popupWindow.focus();
	
	return Util.popupWindow;
}
//button with image 
function setButtonDisable(obj, flag)
{
        if(!obj) return;
        var bImg=document.getElementById(obj.get("id") +'_img');
        if(flag)
        {
                if(bImg)bImg.style.opacity="0.3";
                if(bImg)bImg.style.filter="alpha(opacity=30)";
                obj.set("disabled", true);
        }
        else
        {
                if(bImg)bImg.style.opacity="1";
                if(bImg)bImg.style.filter="alpha(opacity=100)";
                obj.set("disabled", false);
        }
}

//new_win() is created to control only one pop-up opened for FortiOS webUI.
function new_win(url, id, width, height) {
        close_popup();
        set_popup_RefID(window.open(url, id, 'scrollbars,resizable,width='+width+',height='+height));
        return;
}

function set_popup_RefID(id) {
        if (id) {
                new NewPopup();
                NewPopup.ref_id = id;
                NewPopup.ref_id.focus();
        }
        return;
}

function close_popup() {
        if (NewPopup.ref_id && !NewPopup.ref_id.closed) {
                NewPopup.ref_id.close();
                NewPopup.ref_id = 0;
        }
        return;
}

function NewPopup() {}

function openHelp(param)
{
         var newURL='http://help.fortinet.com/fmgr/fmgr-admin/wwhelp/wwhimpl/js/html/wwhelp.htm';
		 if(param) newURL += param;
         var newwindow=window.open(newURL,'fmghelp',',resizable=yes,scrollbars=yes,menubar=no,toolbar=no,status=yes,location=no,width=600,height=400,top=0,left=400');
         if(newwindow.focus)
          newwindow.focus();
}

