
//////////////////////////////
// FOR DEBUGGING ONLY
var debug = false;
function dumpFormFields(formName)
{
    theForm = document.forms[formName];
    for ( idx = 0; idx < theForm.elements.length; ++idx )
        alert ( theForm.elements[idx].name + " - " + theForm.elements[idx].value );
}

//////////////////////////////
// GLOBAL VAR
var needURLEncode = false;  // only need to do url encode in java
var promptPrefix = "promptex-";
var CR_NULL = "_crNULL_";
var CR_USE_VALUE = "_crUseValue_";
var promptMinValue = "_minValue";
var promptMaxValue = "_maxValue";
var warningMaxValue = "_warnMSG";

var _bver    = parseInt(navigator.appVersion);
var Nav4     = ((navigator.appName == "Netscape") && _bver==4);
var Nav4plus = ((navigator.appName == "Netscape") && _bver >= 4);
var IE4plus  = ((navigator.userAgent.indexOf("MSIE") != -1) && _bver>4);

if (Nav4plus)
    var userLanguage = (navigator.language.substr(0, 2));
else
    var userLanguage = (navigator.browserLanguage.substr(0, 2));

///////////////////////////////
// substitue range string
function ConstructRangeDisplayString(rangeStr, param0, param1)
{
	var newString = rangeStr.replace("{0}", param0);
	newString = newString.replace("{1}", param1);
	return newString;
}

///////////////////////////////
// Display string for range value in ListBox
function GetRangeValueDisplayText(rangeStr, param0, param1, paramType)
{
	if (paramType == "dt" || paramType == "d" || paramType == "t")
	{
		if (param0.length != 0)
		{
			if (this.formatJsDate)
				param0 = formatJsDate(NeutralDT2Date(param0));
			else
				param0 = NeutralDT2D(param0);
		}

		if (param1.length != 0)
		{
			if (this.formatJsDate)
				param1 = formatJsDate(NeutralDT2Date(param1));
			else
				param1 = NeutralDT2D(param1);
		}
	}

	return ConstructRangeDisplayString(rangeStr, param0, param1);
}

///////////////////////////////
// properly encode prompt values
function encodePrompt (prompt)
{
    if (needURLEncode)
    {
        return encodeURIComponent(prompt);
    }
    else
    {
        return prompt;
    }
}

function clickSetNullCheckBox(inForm, paramName, suffix)
{
    var nullCtrl = inForm[paramName + "NULL"];
    var textCtrl = inForm[paramName + suffix];
    var hiddenCtrl = inForm[paramName + suffix + "Hidden"];
    var hourCtrl = inForm[paramName + suffix + "Hour"];
    var minuteCtrl = inForm[paramName + suffix + "Minute"];
    var secondCtrl = inForm[paramName + suffix + "Second"];
    var ampmCtrl = inForm[paramName + suffix + "AMPM"];
    if (nullCtrl.checked)
    {
        if (textCtrl != null) textCtrl.disabled = true;
        if (hourCtrl != null) hourCtrl.disabled = true;
        if (minuteCtrl != null) minuteCtrl.disabled = true;
        if (secondCtrl != null) secondCtrl.disabled = true;
        if (ampmCtrl != null) ampmCtrl.disabled = true;
    }
    else
    {
        if (textCtrl != null) textCtrl.disabled = false;
        if (hourCtrl != null) hourCtrl.disabled = false;
        if (minuteCtrl != null) minuteCtrl.disabled = false;
        if (secondCtrl != null) secondCtrl.disabled = false;
        if (ampmCtrl != null) ampmCtrl.disabled = false;
        
    }
}

function ClearListBoxAndSetNULL(theList)
{
    // delete everything in the listbox, add _crNULL_ as an item
    promptEntry = new Option(L_NoValue, CR_NULL,false,false);
    for ( var idx = 0; idx < theList.options.length; )
    {
        theList.options[0] = null;
        idx++;
    }

    theList.options[0] = promptEntry;
    return;
}

////////////////////////////////
// add number, currency, string from dropdown/textbox to list box
// where multiple prompt values are supported
function DateTimePromptValueHelper(type, hiddenCtrl, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl)
{
    var promptValue = "";

    var year;
    var month;
    var day;
    if ((type == "dt") || (type == "d"))
    {
        var d = hiddenCtrl.value;
        if (d.length == 0)
        {
          alert(L_NoDateEntered);
          return "";
        }
        var leftIndex = d.indexOf("(");
        var rightIndex = d.indexOf(")");
        d = d.substr(leftIndex + 1, rightIndex - leftIndex - 1);
        var dArray = d.split(",");
        year = dArray[0];
        month = dArray[1];
        day = dArray[2];
    }

    if (type == "dt")
    {
        promptValue = "DateTime(";
        promptValue += year;
        promptValue += ",";
        promptValue += month;
        promptValue += ",";
        promptValue += day;
        promptValue += ",";

	var hour = 0;
	if (ampmCtrl != undefined)
	{
  	    var i = 0;
	    if (ampmCtrl.selectedIndex == 1)
	        i = 1;
	    hour = hourCtrl.selectedIndex + 1 + i * 12;
	    if (hour == 12) hour = 0;
	    else if (hour == 24) hour = 12;
        }
        else
        {
	    hour = hourCtrl.selectedIndex;
        }
            
        promptValue += hour;
        promptValue += ",";
        promptValue += minuteCtrl.selectedIndex;
        promptValue += ",";
        promptValue += secondCtrl.selectedIndex;

        promptValue += ")";
    }
    else if (type == "d")
    {
        promptValue = "Date(";
        promptValue += year;
        promptValue += ",";
        promptValue += month;
        promptValue += ",";
        promptValue += day;
        promptValue += ")";
        
    }
    else if (type == "t")
    {
        promptValue = "Time(" 

	var hour = 0;
	if (ampmCtrl != undefined)
	{
  	    var i = 0;
	    if (ampmCtrl.selectedIndex == 1)
	        i = 1;
	    hour = hourCtrl.selectedIndex + 1 + i * 12;
	    if (hour == 12) hour = 0;
	    else if (hour == 24) hour = 12;
        }
        else
        {
	    hour = hourCtrl.selectedIndex;
        }
       
            
        promptValue += hour;
        promptValue += ",";
        promptValue += minuteCtrl.selectedIndex;
        promptValue += ",";
        promptValue += secondCtrl.selectedIndex;
        promptValue += ")";
    }

    return promptValue;
}


function DateTimeDisplayStringHelper(type, hiddenCtrl, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl)
{
    var neutralstring = DateTimePromptValueHelper(type, hiddenCtrl, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl);
    if (type == "d" && this.formatJsDate)
      return formatJsDate(NeutralDT2Date(neutralstring));
    else if (type == "t" && this.formatJsTime)
      return formatJsTime(NeutralDT2Date(neutralstring));
    else if (type == "dt" && this.formatJsDate && this.formatJsTime)
      return formatJsDate(NeutralDT2Date(neutralstring)) + ' ' + formatJsTime(NeutralDT2Date(neutralstring));
    else
      return NeutralDT2D(neutralstring);
}


function addPromptDiscreteValueHelper(inForm, type, paramName, suffix)
{
    theList = inForm[paramName + "ListBox"];

    // if there is a NULL checkbox and it is set
    if ( inForm[paramName + "NULL"] != null && inForm[paramName + "NULL"].checked )
    {
        // delete everything in the listbox, add _crNULL_ as an item
        ClearListBoxAndSetNULL(theList);
        return;
    }

    // if the listbox already has a NULL value in it, don't do anything, unless user removes NULl value from the listbox
    if (theList.options.length > 0 && theList.options[0].value == CR_NULL)
    {
        alert(L_NoValueAlready);
        return;
    }

    // if defaultdropdownlist selected item is _crNULL_, put it into multiple listbox
    var dropDownListName = "";
    if (suffix == "DiscreteValue")
        dropDownListName = paramName + "SelectValue";
    else
        dropDownListName = paramName + "SelectLowerBound";
    var dropDownListCtrl = inForm[dropDownListName];
    if (dropDownListCtrl != null)
    {
        if (dropDownListCtrl.options[dropDownListCtrl.selectedIndex].value  == CR_NULL)
        {
            // delete everything in the listbox, add _crNULL_ as an item
            ClearListBoxAndSetNULL(theList);
            return;
        }
    }
    
    var textCtrl = inForm[paramName + suffix];
    var hiddenCtrl = inForm[paramName + suffix + "Hidden"];
    var hourCtrl = inForm[paramName + suffix + "Hour"];
    var minuteCtrl = inForm[paramName + suffix + "Minute"];
    var secondCtrl = inForm[paramName + suffix + "Second"];
    var ampmCtrl = inForm[paramName + suffix + "AMPM"];

    var obj;
    var editables = true;

    if (textCtrl == undefined && hourCtrl == undefined)
    {
        //select box not a textbox, hour, minute, and second, ampm dropdown are not there either
        editables = false;
        obj = dropDownListCtrl;
        obj = obj.options[obj.selectedIndex];
    }
    else
    {
        if (type == "t")
            obj = hourCtrl;
        else
            obj = textCtrl;
    }

    if (type == "dt" || type == "d" || type == "t")
    {   
        promptValue = DateTimePromptValueHelper(type, hiddenCtrl, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl);
        if (promptValue.length == 0) return false;
        
        if (editables)
            displayString = DateTimeDisplayStringHelper(type, hiddenCtrl, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl);   
        else
            displayString = DateTimeDisplayStringHelper(type, obj.text, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl); 
    }
    else
    {
        promptValue =  encodePrompt(obj.value);
        displayString = ( obj.text ) ? obj.text : obj.value;
    }

    if ( ! checkSingleValue (promptValue, type ) )
    {
        return false;
    }

    promptEntry = new Option(displayString,promptValue,false,false);
    theList.options[theList.length] = promptEntry;
}

function addPromptDiscreteValueHelperWithChecking(inForm, type, paramName, suffix, minValue, maxValue, errorMessage )
{
    theList = inForm[paramName + "ListBox"];

    // if there is a NULL checkbox and it is set
    if ( inForm[paramName + "NULL"] != null && inForm[paramName + "NULL"].checked )
    {
        // delete everything in the listbox, add _crNULL_ as an item
        ClearListBoxAndSetNULL(theList);
        return;
    }

    // if the listbox already has a NULL value in it, don't do anything, unless user removes NULl value from the listbox
    if (theList.options.length > 0 && theList.options[0].value == CR_NULL)
    {
        alert(L_NoValueAlready);
        return;
    }

    // if defaultdropdownlist selected item is _crNULL_, put it into multiple listbox
    var dropDownListName = "";
    if (suffix == "DiscreteValue")
        dropDownListName = paramName + "SelectValue";
    else
        dropDownListName = paramName + "SelectLowerBound";
    var dropDownListCtrl = inForm[dropDownListName];
    if (dropDownListCtrl != null)
    {
        if (dropDownListCtrl.options[dropDownListCtrl.selectedIndex].value  == CR_NULL)
        {
            // delete everything in the listbox, add _crNULL_ as an item
            ClearListBoxAndSetNULL(theList);
            return;
        }
    }
    
    var textCtrl = inForm[paramName + suffix];
    var hiddenCtrl = inForm[paramName + suffix + "Hidden"];
    var hourCtrl = inForm[paramName + suffix + "Hour"];
    var minuteCtrl = inForm[paramName + suffix + "Minute"];
    var secondCtrl = inForm[paramName + suffix + "Second"];
    var ampmCtrl = inForm[paramName + suffix + "AMPM"];

    var obj;
    var editables = true;

    if (textCtrl == undefined && hourCtrl == undefined)
    {
        //select box not a textbox, hour, minute, and second, ampm dropdown are not there either
        editables = false;
        obj = dropDownListCtrl;
        obj = obj.options[obj.selectedIndex];
    }
    else
    {
        if (type == "t")
            obj = hourCtrl;
        else
            obj = textCtrl;
    }

    if (type == "dt" || type == "d" || type == "t")
    {   
        promptValue = DateTimePromptValueHelper(type, hiddenCtrl, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl);
        if (promptValue.length == 0) return false;
        
        if (editables)
            displayString = DateTimeDisplayStringHelper(type, hiddenCtrl, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl);   
        else
            displayString = DateTimeDisplayStringHelper(type, obj.text, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl); 
    }
    else
    {
        promptValue =  encodePrompt(obj.value);
        displayString = ( obj.text ) ? obj.text : obj.value;
    }

    if ( ! checkSingleValueWithMinMax (promptValue, type, minValue, maxValue, errorMessage ) )
    {
        return false;
    }

    promptEntry = new Option(displayString,promptValue,false,false);
    theList.options[theList.length] = promptEntry;
}

function addPromptDiscreteValue ( inForm, type , paramName)
{
    addPromptDiscreteValueHelper(inForm, type, paramName, "DiscreteValue");
}

function addPromptDiscreteValueWithChecking ( inForm, type , paramName, minValue, maxValue, errorMessage )
{
    addPromptDiscreteValueHelperWithChecking(inForm, type, paramName, "DiscreteValue", minValue, maxValue, errorMessage);
}

////////////////////////////////////
// adds Range prompt to listbox where multiple values are supported
function addPromptDiscreteRangeValue ( inForm, type , paramName )
{
    lowerOption = inForm[paramName + "SelectLowerOptions"];

    // exactly
    if (lowerOption.selectedIndex == 1)
    {
        // add discrete
        addPromptDiscreteValueHelper(inForm, type, paramName, "LowerBound");
    }
    else
    {
       // add range
       addPromptRangeValue(inForm, type, paramName);
    }
}

// adds Range prompt with Checking to listbox where multiple values are supported
function addPromptDiscreteRangeValueWithChecking ( inForm, type , paramName, minValue, maxValue, errorMessage )
{
    lowerOption = inForm[paramName + "SelectLowerOptions"];

    // exactly
    if (lowerOption.selectedIndex == 1)
    {
        // add discrete
        addPromptDiscreteValueHelperWithChecking(inForm, type, paramName, "LowerBound", minValue, maxValue, errorMessage);
    }
    else
    {
       // add range
       addPromptRangeValueWithChecking(inForm, type, paramName, minValue, maxValue, errorMessage);
    }
}

////////////////////////////////////
// adds Range prompt to listbox where multiple values are supported
function addPromptRangeValue ( inForm, type , paramName )
{

    theList = inForm[paramName + "ListBox"];

    // if there is a NULL checkbox and it is set
    if ( inForm[paramName + "NULL"] != null && inForm[paramName + "NULL"].checked )
    {
        // delete everything in the listbox, add _crNULL_ as an item
        ClearListBoxAndSetNULL(theList);
        return;
    }

    // if the listbox already has a NULL value in it, don't do anything, unless user removed NULl value from the listbox
    if (theList.options.length > 0 && theList.options[0].value == CR_NULL)
    {
        alert(L_NoValueAlready);
        return;
    }

    // if both defaultdropdownlists selected item is _crNULL_, put it into multiple listbox
    // if one of them is _crNULL_, it is not a valid option, do nothing
    var lowerDropDownListName = paramName + "SelectLowerBound";
    var upperDropDownListName = paramName + "SelectUpperBound";
    var lowerDropDownListCtrl = inForm[lowerDropDownListName];
    var upperDropDownListCtrl = inForm[upperDropDownListName];
    if (lowerDropDownListCtrl != null && upperDropDownListCtrl != null)
    {
        if (lowerDropDownListCtrl.options[lowerDropDownListCtrl.selectedIndex].value  == CR_NULL
            && upperDropDownListCtrl.options[upperDropDownListCtrl.selectedIndex].value  == CR_NULL)
        {
            // delete everything in the listbox, add _crNULL_ as an item
            ClearListBoxAndSetNULL(theList);
            return;
        }
        else if (lowerDropDownListCtrl.options[lowerDropDownListCtrl.selectedIndex].value  == CR_NULL
            || upperDropDownListCtrl.options[upperDropDownListCtrl.selectedIndex].value  == CR_NULL)
        {
           alert(L_BadValue);
           return;
        }
    }

    lowerOption = inForm[paramName + "SelectLowerOptions"];
    upperOption = inForm[paramName + "SelectUpperOptions"];

    lowerBound = inForm[paramName + "LowerBound"];
    upperBound = inForm[paramName + "UpperBound"];

    lowerBoundHidden = inForm[paramName + "LowerBoundHidden"];
    upperBoundHidden = inForm[paramName + "UpperBoundHidden"];

    var lhourCtrl = inForm[paramName+"LowerBound" + "Hour"];
    var lminuteCtrl = inForm[paramName + "LowerBound" + "Minute"];
    var lsecondCtrl = inForm[paramName + "LowerBound" + "Second"];
    var lampmCtrl = inForm[paramName + "LowerBound" + "AMPM"];

    var uhourCtrl = inForm[paramName+"UpperBound" + "Hour"];
    var uminuteCtrl = inForm[paramName + "UpperBound" + "Minute"];
    var usecondCtrl = inForm[paramName + "UpperBound" + "Second"];
    var uampmCtrl = inForm[paramName + "UpperBound" + "AMPM"];

    var editable = true;

    //handle select box, not text box case
    if ( lowerBound == undefined && lhourCtrl == undefined)//either upper or lower, doesn't matter
    {
        editable = false;
        
        lowerBound = inForm[paramName + "SelectLowerBound"];
        upperBound = inForm[paramName + "SelectUpperBound"];
        lowerBound = lowerBound.options[lowerBound.selectedIndex];
        upperBound = upperBound.options[upperBound.selectedIndex];
    }

    lowerUnBounded = (inForm[paramName+"SelectLowerOptions"].selectedIndex == (inForm[paramName + "SelectLowerOptions"].options.length - 1));
    upperUnBounded = (inForm[paramName+"SelectUpperOptions"].selectedIndex == (inForm[paramName + "SelectUpperOptions"].options.length - 1));


    lvalue = uvalue = "";

    if ( ! lowerUnBounded )
    {
        if ((type == "dt" || type == "d" || type == "t") && (editable))
        {   
            lvalue = DateTimePromptValueHelper(type, lowerBoundHidden, lhourCtrl, lminuteCtrl, lsecondCtrl, lampmCtrl);
            if (lvalue.length == 0) return false;
        }
        else
            lvalue = lowerBound.value;

        if ( ! checkSingleValue ( lvalue, type ) ) {
            if ( lowerBound.focus && lowerBound.type.toLowerCase () != "hidden")
                lowerBound.focus ();
            return false;
        }
    }
    if ( ! upperUnBounded )
    {
        if ((type == "dt" || type == "d" || type == "t") && (editable))
        {   
            uvalue = DateTimePromptValueHelper(type, upperBoundHidden, uhourCtrl, uminuteCtrl, usecondCtrl, uampmCtrl);
            if (uvalue.length == 0) return false;
        }
        else
            uvalue = upperBound.value;

        if ( ! checkSingleValue ( uvalue, type ) ) {
            if ( upperBound.focus && upperBound.type.toLowerCase () != "hidden")
                upperBound.focus ();
            return false;
        }
    }

    var ldisplay = "";
    var udisplay = "";
    if ((type == "dt" || type == "d" || type == "t") && (editable))
    {
        if (!lowerUnBounded)
            ldisplay = DateTimeDisplayStringHelper(type, lowerBoundHidden, lhourCtrl, lminuteCtrl, lsecondCtrl, lampmCtrl);
        if (!upperUnBounded)
            udisplay = DateTimeDisplayStringHelper(type, upperBoundHidden, uhourCtrl, uminuteCtrl, usecondCtrl, uampmCtrl);
    }
    else
    {
        ldisplay = lvalue;
        udisplay = uvalue;
    }

    lowerChecked = (inForm[paramName+"SelectLowerOptions"].selectedIndex == 0);
    upperChecked = (inForm[paramName+"SelectUpperOptions"].selectedIndex == 0);
   
    value = lowerUnBounded ? "{" : lowerChecked ? "[" : "(";
    if ( ! lowerUnBounded ) //unbounded is empty string not quoted empty string (e.g not "_crEMPTY_")
        value += encodePrompt(lvalue);
    value += "_crRANGE_"
    if ( ! upperUnBounded )
        value += encodePrompt(uvalue);
    value += upperUnBounded ? "}" : upperChecked ? "]" : ")";
    if ( debug ) alert (value);

    if ( !lowerUnBounded && !upperUnBounded && !checkRangeValue(lvalue, uvalue, type))
    {
		return false;
    }

    var display = "";
    if (lowerChecked && upperUnBounded)
    {
		display = ConstructRangeDisplayString(L_FROM, ldisplay, "");
    }
    else if (lowerUnBounded && upperChecked)
    {
		display = ConstructRangeDisplayString(L_TO, udisplay, "");
    }
    else if (!lowerChecked && upperUnBounded)
    {
		display = ConstructRangeDisplayString(L_AFTER, ldisplay, "");
    }
    else if (lowerUnBounded && !upperChecked)
    {
		display = ConstructRangeDisplayString(L_BEFORE, udisplay, "");
    }
    else if (lowerChecked  && upperChecked)
    {
		display = ConstructRangeDisplayString(L_FROM_TO, ldisplay, udisplay);
    }
    else if (lowerChecked && !upperUnBounded && !upperChecked)
    {
		display = ConstructRangeDisplayString(L_FROM_BEFORE, ldisplay, udisplay);
    }
    else if (!lowerChecked && !lowerUnBounded && upperChecked)
    {
		display = ConstructRangeDisplayString(L_AFTER_TO, ldisplay, udisplay);
    }
    else if (!lowerChecked && !lowerUnBounded && !upperChecked && !upperUnBounded)
    {
		display = ConstructRangeDisplayString(L_AFTER_BEFORE, ldisplay, udisplay);
    }
   
    if ((!lowerUnBounded) || (!upperUnBounded))
    {
        promptEntry = new Option(display,value,false,false);
        theList.options[theList.length] = promptEntry;
    }
    else
    {
        alert(L_BadBound);
    }

}

////////////////////////////////////
// adds Range prompt with Checking to listbox where multiple values are supported
function addPromptRangeValueWithChecking ( inForm, type , paramName, minValue, maxValue, errorMessage )
{

    theList = inForm[paramName + "ListBox"];

    // if there is a NULL checkbox and it is set
    if ( inForm[paramName + "NULL"] != null && inForm[paramName + "NULL"].checked )
    {
        // delete everything in the listbox, add _crNULL_ as an item
        ClearListBoxAndSetNULL(theList);
        return;
    }

    // if the listbox already has a NULL value in it, don't do anything, unless user removed NULl value from the listbox
    if (theList.options.length > 0 && theList.options[0].value == CR_NULL)
    {
        alert(L_NoValueAlready);
        return;
    }

    // if both defaultdropdownlists selected item is _crNULL_, put it into multiple listbox
    // if one of them is _crNULL_, it is not a valid option, do nothing
    var lowerDropDownListName = paramName + "SelectLowerBound";
    var upperDropDownListName = paramName + "SelectUpperBound";
    var lowerDropDownListCtrl = inForm[lowerDropDownListName];
    var upperDropDownListCtrl = inForm[upperDropDownListName];
    if (lowerDropDownListCtrl != null && upperDropDownListCtrl != null)
    {
        if (lowerDropDownListCtrl.options[lowerDropDownListCtrl.selectedIndex].value  == CR_NULL
            && upperDropDownListCtrl.options[upperDropDownListCtrl.selectedIndex].value  == CR_NULL)
        {
            // delete everything in the listbox, add _crNULL_ as an item
            ClearListBoxAndSetNULL(theList);
            return;
        }
        else if (lowerDropDownListCtrl.options[lowerDropDownListCtrl.selectedIndex].value  == CR_NULL
            || upperDropDownListCtrl.options[upperDropDownListCtrl.selectedIndex].value  == CR_NULL)
        {
           alert(L_BadValue);
           return;
        }
    }

    lowerOption = inForm[paramName + "SelectLowerOptions"];
    upperOption = inForm[paramName + "SelectUpperOptions"];

    lowerBound = inForm[paramName + "LowerBound"];
    upperBound = inForm[paramName + "UpperBound"];

    lowerBoundHidden = inForm[paramName + "LowerBoundHidden"];
    upperBoundHidden = inForm[paramName + "UpperBoundHidden"];

    var lhourCtrl = inForm[paramName+"LowerBound" + "Hour"];
    var lminuteCtrl = inForm[paramName + "LowerBound" + "Minute"];
    var lsecondCtrl = inForm[paramName + "LowerBound" + "Second"];
    var lampmCtrl = inForm[paramName + "LowerBound" + "AMPM"];

    var uhourCtrl = inForm[paramName+"UpperBound" + "Hour"];
    var uminuteCtrl = inForm[paramName + "UpperBound" + "Minute"];
    var usecondCtrl = inForm[paramName + "UpperBound" + "Second"];
    var uampmCtrl = inForm[paramName + "UpperBound" + "AMPM"];

    var editable = true;

    //handle select box, not text box case
    if ( lowerBound == undefined && lhourCtrl == undefined)//either upper or lower, doesn't matter
    {
        editable = false;
        
        lowerBound = inForm[paramName + "SelectLowerBound"];
        upperBound = inForm[paramName + "SelectUpperBound"];
        lowerBound = lowerBound.options[lowerBound.selectedIndex];
        upperBound = upperBound.options[upperBound.selectedIndex];
    }

    lowerUnBounded = (inForm[paramName+"SelectLowerOptions"].selectedIndex == (inForm[paramName + "SelectLowerOptions"].options.length - 1));
    upperUnBounded = (inForm[paramName+"SelectUpperOptions"].selectedIndex == (inForm[paramName + "SelectUpperOptions"].options.length - 1));


    lvalue = uvalue = "";

    if ( ! lowerUnBounded )
    {
        if ((type == "dt" || type == "d" || type == "t") && (editable))
        {   
            lvalue = DateTimePromptValueHelper(type, lowerBoundHidden, lhourCtrl, lminuteCtrl, lsecondCtrl, lampmCtrl);
            if (lvalue.length == 0) return false;
        }
        else
            lvalue = lowerBound.value;

        if ( ! checkSingleValue ( lvalue, type ) ) {
            if ( lowerBound.focus && lowerBound.type.toLowerCase () != "hidden")
                lowerBound.focus ();
            return false;
        }
    }
    if ( ! upperUnBounded )
    {
        if ((type == "dt" || type == "d" || type == "t") && (editable))
        {   
            uvalue = DateTimePromptValueHelper(type, upperBoundHidden, uhourCtrl, uminuteCtrl, usecondCtrl, uampmCtrl);
            if (uvalue.length == 0) return false;
        }
        else
            uvalue = upperBound.value;

        if ( ! checkSingleValue ( uvalue, type ) ) {
            if ( upperBound.focus && upperBound.type.toLowerCase () != "hidden")
                upperBound.focus ();
            return false;
        }
    }

    var ldisplay = "";
    var udisplay = "";
    if ((type == "dt" || type == "d" || type == "t") && (editable))
    {
        if (!lowerUnBounded)
            ldisplay = DateTimeDisplayStringHelper(type, lowerBoundHidden, lhourCtrl, lminuteCtrl, lsecondCtrl, lampmCtrl);
        if (!upperUnBounded)
            udisplay = DateTimeDisplayStringHelper(type, upperBoundHidden, uhourCtrl, uminuteCtrl, usecondCtrl, uampmCtrl);
    }
    else
    {
        ldisplay = lvalue;
        udisplay = uvalue;
    }

    lowerChecked = (inForm[paramName+"SelectLowerOptions"].selectedIndex == 0);
    upperChecked = (inForm[paramName+"SelectUpperOptions"].selectedIndex == 0);
   
    value = lowerUnBounded ? "{" : lowerChecked ? "[" : "(";
    if ( ! lowerUnBounded ) //unbounded is empty string not quoted empty string (e.g not "_crEMPTY_")
        value += encodePrompt(lvalue);
    value += "_crRANGE_"
    if ( ! upperUnBounded )
        value += encodePrompt(uvalue);
    value += upperUnBounded ? "}" : upperChecked ? "]" : ")";
    if ( debug ) alert (value);

    if ( !lowerUnBounded && !upperUnBounded && !checkRangeValueWithMinMax(lvalue, uvalue, type, minValue, maxValue, errorMessage))
    {
		return false;
    }

    var display = "";
    if (lowerChecked && upperUnBounded)
    {
		display = ConstructRangeDisplayString(L_FROM, ldisplay, "");
    }
    else if (lowerUnBounded && upperChecked)
    {
		display = ConstructRangeDisplayString(L_TO, udisplay, "");
    }
    else if (!lowerChecked && upperUnBounded)
    {
		display = ConstructRangeDisplayString(L_AFTER, ldisplay, "");
    }
    else if (lowerUnBounded && !upperChecked)
    {
		display = ConstructRangeDisplayString(L_BEFORE, udisplay, "");
    }
    else if (lowerChecked  && upperChecked)
    {
		display = ConstructRangeDisplayString(L_FROM_TO, ldisplay, udisplay);
    }
    else if (lowerChecked && !upperUnBounded && !upperChecked)
    {
		display = ConstructRangeDisplayString(L_FROM_BEFORE, ldisplay, udisplay);
    }
    else if (!lowerChecked && !lowerUnBounded && upperChecked)
    {
		display = ConstructRangeDisplayString(L_AFTER_TO, ldisplay, udisplay);
    }
    else if (!lowerChecked && !lowerUnBounded && !upperChecked && !upperUnBounded)
    {
		display = ConstructRangeDisplayString(L_AFTER_BEFORE, ldisplay, udisplay);
    }
   
    if ((!lowerUnBounded) || (!upperUnBounded))
    {
        promptEntry = new Option(display,value,false,false);
        theList.options[theList.length] = promptEntry;
    }
    else
    {
        alert(L_BadBound);
    }

}

////////////////////////////////////
// disable check boxes based on user selection on the range parameters
function disableBoundCheck(lowOrUpBound, inform, paramName) {
    if (lowOrUpBound == 0) {
        if (inform[paramName + "NoLowerBoundCheck"].checked) {
            inform[paramName + "NoUpperBoundCheck"].disabled = true;
            inform[paramName + "LowerCheck"].disabled = true;
            inform[paramName + "LowerBound"].disabled = true;
        }
        else {
            inform[paramName + "NoUpperBoundCheck"].disabled = false;
            inform[paramName + "LowerCheck"].disabled = false;
            inform[paramName + "LowerBound"].disabled = false;
        }
    } else if (lowOrUpBound == 1) {
        if (inform[paramName + "NoUpperBoundCheck"].checked) {
            inform[paramName + "NoLowerBoundCheck"].disabled = true;
            inform[paramName + "UpperCheck"].disabled = true;
            inform[paramName + "UpperBound"].disabled = true;
        } else {
            inform[paramName + "NoLowerBoundCheck"].disabled = false;
            inform[paramName + "UpperCheck"].disabled = false;
            inform[paramName + "UpperBound"].disabled = false;
        }
    }
}

////////////////////////////////////
// puts "select" value into text box for an editable prompt which also has defaults
function setSelectedValue (inForm, selectCtrlName, textCtrlName, type, namePlusFix)
{
    var textCtrl = inForm[textCtrlName];
    var selectCtrl = inForm[selectCtrlName];
    var hiddenCtrl = inForm[namePlusFix+"Hidden"];
    var hourCtrl = inForm[namePlusFix+"Hour"];
    var minuteCtrl = inForm[namePlusFix+"Minute"];
    var secondCtrl = inForm[namePlusFix+"Second"];
    var ampmCtrl = inForm[namePlusFix+"AMPM"];

    // if no editable input fields are there, return, do nothing;
    if (textCtrl == null && hourCtrl == null)
        return;

    // if selectedItem is UseValue,do nothing, and return
    if (selectCtrl.options[selectCtrl.selectedIndex].value == CR_USE_VALUE)
    {
       return;
    }

    if (selectCtrl.options[selectCtrl.selectedIndex].value == CR_NULL)
    {
       if (textCtrl != null) textCtrl.disabled = true;
       if (hourCtrl != null) hourCtrl.disabled = true;
       if (minuteCtrl != null) minuteCtrl.disabled = true;
       if (secondCtrl != null) secondCtrl.disabled = true;
       if (ampmCtrl != null) ampmCtrl.disabled = true;
       return;
    }
    else
    {
       if (textCtrl != null) textCtrl.disabled = false;
       if (hourCtrl != null) hourCtrl.disabled = false;
       if (minuteCtrl != null) minuteCtrl.disabled = false;
       if (secondCtrl != null) secondCtrl.disabled = false;
       if (ampmCtrl != null) ampmCtrl.disabled = false;
    }

    var year, month, day;
    var hour, minute, second;
    if (type == "dt" || type == "d" || type == "t")
    {
        var sDateTime = selectCtrl.options[selectCtrl.selectedIndex].value;
        if (sDateTime.length == 0)
            return;

        var leftIndex = sDateTime.indexOf("(");
        sDateTime = sDateTime.substr(leftIndex+1, sDateTime.length - leftIndex);
        var rightIndex = sDateTime.indexOf(")");
        sDateTime = sDateTime.substr(0, rightIndex);
        var a = sDateTime.split(",");

        if (type == "dt")
        {
            year = a[0];
            month = a[1];
            day = a[2];

            hour = parseInt(a[3]);
            minute = parseInt(a[4]);
            second = parseInt(a[5]);
        }
        else if (type == "d")
        {
            year = a[0];
            month = a[1];
            day = a[2];
        }
        else if (type == "t")
        {   
            hour = parseInt(a[0]);
            minute = parseInt(a[1]);
            second = parseInt(a[2]);
        }
    }

    selectedOption = selectCtrl.options[selectCtrl.selectedIndex];
    if (type == "dt")
    {
        var dt = new Date(year, month - 1, day, hour, minute, second);
        if (this.formatJsDate)
            textCtrl.value = formatJsDate(dt);
        else
            textCtrl.value = GLDT(dt,true, false);
        hiddenCtrl.value = "Date(";
        hiddenCtrl.value += year;
        hiddenCtrl.value += ",";
        hiddenCtrl.value += month;
        hiddenCtrl.value += ",";
        hiddenCtrl.value += day;
        hiddenCtrl.value += ")";

        if (ampmCtrl != undefined)
        {
            if (hour == 0 || hour == 12)
                hourCtrl.selectedIndex = 11;
            else if (hour > 12)
                hourCtrl.selectedIndex = hour - 12 - 1;
            else
                hourCtrl.selectedIndex = hour - 1;
        }
        else
            hourCtrl.selectedIndex = hour;
        minuteCtrl.selectedIndex = minute;
        secondCtrl.selectedIndex = second;
        if (ampmCtrl != null)
        { 
            if ( hour >= 12)
                ampmCtrl.selectedIndex = 1;
            else
                ampmCtrl.selectedIndex = 0;
        }
    }
    else if (type == "d")
    {
        var dt = new Date(year, month - 1, day, 0, 0, 0);
        if (this.formatJsDate)
            textCtrl.value = formatJsDate(dt);
        else
            textCtrl.value = GLDT(dt,true, false);
        hiddenCtrl.value = "Date(";
        hiddenCtrl.value += year;
        hiddenCtrl.value += ",";
        hiddenCtrl.value += month;
        hiddenCtrl.value += ",";
        hiddenCtrl.value += day;
        hiddenCtrl.value += ")";
    }
    else if (type == "t")
    {
        if (ampmCtrl != null)
        {
            if (hour == 0 || hour == 12)
                hourCtrl.selectedIndex = 11;
            else if (hour > 12)
                hourCtrl.selectedIndex = hour - 12 - 1;
            else
                hourCtrl.selectedIndex = hour - 1;
        }
        else
            hourCtrl.selectedIndex = hour;
        minuteCtrl.selectedIndex = minute;
        secondCtrl.selectedIndex = second;
        if (ampmCtrl != null)
        { 
            if ( hour >= 12)
                ampmCtrl.selectedIndex = 1;
            else
                ampmCtrl.selectedIndex = 0;
        }
    }
    else
    {
        textCtrl.value = selectedOption.value;
    }

    if (selectCtrl.options[0].value == CR_USE_VALUE)
    {
        // always show USE_VALUE as selectedItem for the dropdownlist
        selectCtrl.selectedIndex = 0;
    }
}

///////////////////////////////////
// remove value from listbox where multiple value prompts are supported
function removeFromListBox ( inForm, paramName )
{
    lbox = inForm[paramName + "ListBox"];
    for ( var idx = 0; idx < lbox.options.length; )
    {
        if ( lbox.options[idx].selected )
            lbox.options[idx] = null;
        else
            idx++;
    }
}

/////////////////////////////////////
// sets prompt value into the hidden form field in proper format so that it can be submitted
function setPromptSingleValue (inform, type, paramName)
{
    //alert("SetPromptSingleValue");
    hiddenField = inform[promptPrefix + paramName];
    var hiddenMinValue = "";
    var hiddenMaxValue = "";
    var hiddenWarnMsg = "";
    if (typeof(inform[promptPrefix + paramName + promptMinValue]) != "undefined")
    	hiddenMinValue = (inform[promptPrefix + paramName + promptMinValue]).value;
    if (typeof(inform[promptPrefix + paramName + promptMaxValue])!= "undefined")
    	hiddenMaxValue = (inform[promptPrefix + paramName + promptMaxValue]).value;
    if (typeof(inform[promptPrefix + paramName + warningMaxValue]) != "undefined")
    	hiddenWarnMsg = (inform[promptPrefix + paramName + warningMaxValue]).value;
    value = "";
    if ( inform[paramName + "NULL"] != null && inform[paramName + "NULL"].checked )
    {
        value = CR_NULL; //NULL is a literal for, uhmm.. a NULL
        hiddenField.value = value;
        return true;
    }

    // if defaultdropdownlist selected item is _crNULL_, put it into multiple listbox
    var dropDownListName = paramName + "SelectValue";
    var dropDownListCtrl = inform[dropDownListName];
    if (dropDownListCtrl != null)
    {
        if (dropDownListCtrl.options[dropDownListCtrl.selectedIndex].value  == CR_NULL)
        {
            hiddenField.value = CR_NULL;
            return true;
        }
    }

        
    discreteVal = inform[paramName + "DiscreteValue"];
    if (discreteVal != undefined || inform[paramName + "DiscreteValueHour"] != undefined)
    { // editable
          
        if ( type == "dt" || type == "d" || type == "t")
        {
           var hiddenCtrl = inform[paramName+"DiscreteValueHidden"];
           var hourCtrl = inform[paramName+"DiscreteValueHour"];
           var minuteCtrl = inform[paramName + "DiscreteValueMinute"];
           var secondCtrl = inform[paramName + "DiscreteValueSecond"];
           var ampmCtrl = inform[paramName + "DiscreteValueAMPM"];
           value = DateTimePromptValueHelper(type, hiddenCtrl, hourCtrl, minuteCtrl, secondCtrl, ampmCtrl);
           if (value.length == 0) return false;
        }
        else
           value = discreteVal.value;
    }
    else
    {
        // not editable
        discreteVal = inform[paramName+"SelectValue"];
        value = discreteVal.options[discreteVal.selectedIndex].value;
        //alert(value);
    }
    if ( (hiddenMinValue.length==0 && hiddenMaxValue.length==0 && hiddenWarnMsg.length==0) && ! checkSingleValue ( value, type ) ) {
        if (discreteVal.focus && discreteVal.type.toLowerCase ())
           discreteVal.focus ();
        return false;
    }
    else if ( (hiddenMinValue.length>0 && hiddenMaxValue.length>0 && hiddenWarnMsg.length>0) && ! checkSingleValueWithMinMax ( value, type, hiddenMinValue, hiddenMaxValue, hiddenWarnMsg ) ) {
        if (typeof(discreteVal)!="undefined" && discreteVal.focus && discreteVal.type.toLowerCase ())
           discreteVal.focus ();
        return false;
    }
    else
        value = encodePrompt(value);

    hiddenField.value = value;
    return true;
}

/////////////////////////////////////
// sets prompt value for a range into the hidden form field in proper format so that it can be submitted
function setPromptRangeValue (inform, type, paramName)
{

    hiddenField = inform[promptPrefix + paramName];
    var hiddenMinValue = "";
    var hiddenMaxValue = "";
    var hiddenWarnMsg = "";
    if (typeof(inform[promptPrefix + paramName + promptMinValue]) != "undefined")
    	hiddenMinValue = (inform[promptPrefix + paramName + promptMinValue]).value;
    if (typeof(inform[promptPrefix + paramName + promptMaxValue])!= "undefined")
    	hiddenMaxValue = (inform[promptPrefix + paramName + promptMaxValue]).value;
    if (typeof(inform[promptPrefix + paramName + warningMaxValue]) != "undefined")
    	hiddenWarnMsg = (inform[promptPrefix + paramName + warningMaxValue]).value;

    if ( inform[paramName + "NULL"] != null && inform[paramName + "NULL"].checked )
    {
        value = CR_NULL; //NULL is a literal for, uhmm.. a NULL
        hiddenField.value = value;
        return true;
    }

        // if both defaultdropdownlists selected item is _crNULL_, put it into hiddenfield
    // if one of them is _crNULL_, it is not a valid option, do nothing
    var lowerDropDownListName = paramName + "SelectLowerBound";
    var upperDropDownListName = paramName + "SelectUpperBound";
    var lowerDropDownListCtrl = inform[lowerDropDownListName];
    var upperDropDownListCtrl = inform[upperDropDownListName];
    if (lowerDropDownListCtrl != null && upperDropDownListCtrl != null)
    {
        if (lowerDropDownListCtrl.options[lowerDropDownListCtrl.selectedIndex].value  == CR_NULL
            && upperDropDownListCtrl.options[upperDropDownListCtrl.selectedIndex].value  == CR_NULL)
        {
            hiddenField.value = "_crNULL_";
            return true;
        }
        else if (lowerDropDownListCtrl.options[lowerDropDownListCtrl.selectedIndex].value  == CR_NULL
            || upperDropDownListCtrl.options[upperDropDownListCtrl.selectedIndex].value  == CR_NULL)
        {
            alert(L_BadValue);
            return false;
        }
    }

    lowerOptions = inform[paramName + "SelectLowerOptions"];
    upperOptions = inform[paramName + "SelectUpperOptions"];

    lowerBound = inform[paramName + "LowerBound"];
    upperBound = inform[paramName + "UpperBound"];

    lowerBoundHidden = inform[paramName + "LowerBoundHidden"];
    upperBoundHidden = inform[paramName + "UpperBoundHidden"];

    lowerBoundDropdown = inform[paramName + "SelectLowerBound"];
    upperBoundDropdown = inform[paramName + "SelectUpperBound"];

    var editables = true;

    //handle select box, not text box case
    if (lowerBound == undefined && inform[paramName + "LowerBound" + "Hour"] == undefined)
    {
        editables = false;
        lowerBound = lowerBoundDropdown;
        upperBound = upperBoundDropdown;
        lowerBound = lowerBound.options[lowerBound.selectedIndex];
        upperBound = upperBound.options[upperBound.selectedIndex];
    }

    lowerUnBounded = (lowerOptions.selectedIndex == (lowerOptions.length - 1));
    upperUnBounded = (upperOptions.selectedIndex == (upperOptions.length - 1));

    lowerChecked = (lowerOptions.selectedIndex == 0);
    upperChecked = (upperOptions.selectedIndex == 0);

    uvalue = lvalue = "";

    if ( ! lowerUnBounded )
    {
        if ( (type == "dt" || type == "d" || type == "t") && (editables))
        {
            var lhourCtrl = inform[paramName+"LowerBound" + "Hour"];
            var lminuteCtrl = inform[paramName + "LowerBound" + "Minute"];
            var lsecondCtrl = inform[paramName + "LowerBound" + "Second"];
            var lampmCtrl = inform[paramName + "LowerBound" + "AMPM"];
            lvalue = DateTimePromptValueHelper(type, lowerBoundHidden, lhourCtrl, lminuteCtrl, lsecondCtrl, lampmCtrl);
            if (lvalue.length == 0) return false;
        }
        else
            lvalue = lowerBound.value;

        if ( ! checkSingleValue ( lvalue, type ) ) {
            if (lowerBound != undefined && lowerBound.focus)
                lowerBound.focus();
            return false;
        }
    }
    if ( ! upperUnBounded )
    {
        if (( type == "dt" || type == "d" || type == "t") &&  (editables))
        {
            var uhourCtrl = inform[paramName+"UpperBound" + "Hour"];
            var uminuteCtrl = inform[paramName + "UpperBound" + "Minute"];
            var usecondCtrl = inform[paramName + "UpperBound" + "Second"];
            var uampmCtrl = inform[paramName + "UpperBound" + "AMPM"];
            uvalue = DateTimePromptValueHelper(type, upperBoundHidden, uhourCtrl, uminuteCtrl, usecondCtrl, uampmCtrl);
            if (uvalue.length == 0) return false;
        }
        else
            uvalue = upperBound.value;

        if ( ! checkSingleValue ( uvalue, type ) ) {
            if (upperBound != undefined && upperBound.focus)
                upperBound.focus();
            return false;
        }
    }
    
    value = lowerUnBounded ? "{" : lowerChecked ? "[" : "(";
    if ( ! lowerUnBounded )
        value += encodePrompt(lvalue);
    value += "_crRANGE_"
    if ( ! upperUnBounded )
        value += encodePrompt(uvalue);
    value += upperUnBounded ? "}" : upperChecked ? "]" : ")";
    if ( debug )
        alert (value);

    if (lowerUnBounded && upperUnBounded)
    {
        alert(L_BadBound);
        return false;
    }

    if ((hiddenMinValue.length==0 && hiddenMaxValue.length==0 && hiddenWarnMsg.length==0) && !lowerUnBounded && !upperUnBounded && !checkRangeValue(lvalue, uvalue, type))
    {
	    return false;
    }
    else if ((hiddenMinValue.length>0 && hiddenMaxValue.length>0 && hiddenWarnMsg.length>0) && !lowerUnBounded && !upperUnBounded && !checkRangeValueWithMinMax(lvalue, uvalue, type, hiddenMinValue, hiddenMaxValue, hiddenWarnMsg))
    {
    	return false;
    }

    hiddenField.value = value;
    return true;
}

/////////////////////////////////////
// sets prompt value into the hidden form field in proper format so that it can be submitted
function setPromptMultipleValue (inform, type, paramName)
{
    hiddenField = inform[promptPrefix + paramName];
    values = inform[paramName + "ListBox"].options;

    if ( values.length == 0 )
    {
        value = "_crEMPTY_";     //if value is empty, set to empty string
    }
    else
    {
        value = "";
        for ( idx = 0; idx < values.length; ++idx )
        {
            // first value could be empty string, then chcking value.length != 0 could miss one empty string
            if ( idx != 0 )
                value += "_crMULT_"
            value += values[idx].value;
        }
    }
    
    if ( debug )
        alert (value);
    
    hiddenField.value = value;
    //NOTE: we'll always return true as the validation is done before values are added to select box
    return true;
}

///////////////////////////////////////
// check and alert user about any errors based on type of prompt
var regNumber    = /^(\+|-)?((\d+(\.|,| |\u00A0)?\d*)+|(\d*(\.|,| |\u00A0)?\d+)+)$/
var regCurrency  = regNumber;
var regDate  = /^(D|d)(A|a)(T|t)(E|e) *\( *\d{4} *, *(0?[1-9]|1[0-2]) *, *((0?[1-9]|[1-2]\d)|3(0|1)) *\)$/
var regDateTime  = /^(D|d)(A|a)(T|t)(E|e)(T|t)(I|i)(M|m)(E|e) *\( *\d{4} *, *(0?[1-9]|1[0-2]) *, *((0?[1-9]|[1-2]\d)|3(0|1)) *, *([0-1]?\d|2[0-3]) *, *[0-5]?\d *, *[0-5]?\d *\)$/
var regTime  = /^(T|t)(I|i)(M|m)(E|e) *\( *([0-1]?\d|2[0-3]) *, *[0-5]?\d *, *[0-5]?\d *\)$/

function checkSingleValue ( value, type )
{
    if ( type == 'n' && ! regNumber.test ( value ) )
    {
        alert ( L_BadNumber );
        return false;
    }
    else if ( type == 'c' && ! regCurrency.test ( value ) )
    {
        alert ( L_BadCurrency );
        return false;
    }
    /*else if ( type == 'd' && ! regDate.test ( value ) )
    {
        alert ( L_BadDate );
        return false;
    }
    else if ( type == "dt" && ! regDateTime.test ( value ) )
    {
        alert ( L_BadDateTime );
        return false;
    }
    else if ( type == 't' && ! regTime.test ( value ) )
    {
        alert ( L_BadTime );
        return false;
    }*/

    //by default let it go...
    return true;
}

function checkSingleValueWithMinMax ( value, type, minValue, maxValue, errorMessage )
{
    if ( type == 'n' )
    {
    	if (! regNumber.test ( value ) || isNaN(DelocalizeNum (value)) || isNaN(DelocalizeNum (minValue)) || isNaN(DelocalizeNum (maxValue)))
    	{
        	alert ( L_BadNumber );
        	return false;
        }
        if (minValue.length>0 && maxValue.length>0){
		    //check min and max
		    if (eval (DelocalizeNum (value)) < eval (DelocalizeNum (minValue)) || eval (DelocalizeNum (value)) > eval (DelocalizeNum (maxValue)))
		    {
		    	alert (errorMessage);
		    	return false;
		    }   
	    }     
    }
    else if ( type == 'c' )
    {
    	if (! regCurrency.test ( value ) || isNaN(DelocalizeNum (value)) || isNaN(DelocalizeNum (minValue)) || isNaN(DelocalizeNum (maxValue)))
    	{ 
	        alert ( L_BadCurrency );
	        return false;
        }
        if (minValue.length>0 && maxValue.length>0){
		    //check min and max
		    if (eval (DelocalizeNum (value)) < eval (DelocalizeNum (minValue)) || eval (DelocalizeNum (value)) > eval (DelocalizeNum (maxValue)))
		    {
		    	alert (errorMessage);
		    	return false;
		    } 
	    }       
    }
    else if ( type == 'd' )
    {
    	if (minValue.length>0 && maxValue.length>0){
	    	var comp = NeutralDT2Date(value);
			//check min and max
			var dMin = Date.parse(minValue);
			var dMax = Date.parse(maxValue);
			// since Date month as a value is from 0-11, the string represenatation as a value of 1-12, NeutralDT2Date handle it
			// The number of milliseconds after midnight January 1, 1970
			// Set to GMT for consistent comparison on the client side
			var offset = comp.getTimezoneOffset()*60*1000;
			var dComp = Date.parse(comp) - offset;
		    if (dComp < dMin || dComp > dMax)
		    {
		    	alert (errorMessage);
		    	return false;
		    }   
	    }
    }
    else if ( type == "dt" )
    {
    	if (minValue.length>0 && maxValue.length>0){
	    	var comp = NeutralDT2Date(value);
			//check min and max
			var dtMin = Date.parse(minValue);
			var dtMax = Date.parse(maxValue);
			// since Date month as a value is from 0-11, the string represenatation as a value of 1-12, NeutralDT2Date handle it
			// The number of milliseconds after midnight January 1, 1970
			// Set to GMT for consistent comparison on the client side
			var offset = comp.getTimezoneOffset()*60*1000;
			var dtComp = Date.parse(comp) - offset;
		    if (dtComp < dtMin || dtComp > dtMax)
		    {
		    	alert (errorMessage);
		    	return false;
		    }   
	    }
    }
    else if ( type == 't' )
    {
    	if (minValue.length>0 && maxValue.length>0){
	    	var comp = eval("new Date(0,0,0," + value.substring(value.indexOf('(') + 1, value.indexOf(')') + 1));
	    	//var comp = NeutralDT2Date(value);
			//check min and max
			//getTimeFromIETFFormat to remove the difference of the year, month and day components
			var tMinComponents = getTimeFromIETFFormat(minValue);
			var tMaxComponents = getTimeFromIETFFormat(maxValue);
			var tMinTEFT = eval("new Date(0,0,0," + tMinComponents[0] + "," + tMinComponents[1] + "," + tMinComponents[2] + ")");
			var tMaxTEFT = eval("new Date(0,0,0," + tMaxComponents[0] + "," + tMaxComponents[1] + "," + tMaxComponents[2] + ")");
			// check am or pm
			var index1 = minValue.indexOf(" PM ");
			if (index1>-1)
			{
				tMinTEFT.setTime(tMinTEFT.getTime()+(12*3600*1000));
			}
			var index2 = maxValue.indexOf(" PM ");
			if (index2>-1)
			{
				tMaxTEFT.setTime(tMaxTEFT.getTime()+(12*3600*1000));
			}
			var tMin = Date.parse(tMinTEFT);
			var tMax = Date.parse(tMaxTEFT);
			// Both new Date() make consistent comparison on the client side
			var tComp = Date.parse(comp);
		    if (tComp < tMin || tComp > tMax)
		    {
		    	alert (errorMessage);
		    	return false;
		    } 
	    }       
    }
	else if (type == "text" || type == 's')
    {
         // is a string
		//check min and max
	    if (value.length < eval (DelocalizeNum (minValue)) || value.length > eval (DelocalizeNum (maxValue)))
	    {
	    	alert (errorMessage);
	    	return false;
	    }        
    }
    //by default let it go...
    return true;
}
 
function checkRangeValue (fvalue, tvalue, type)
{
    // determine if the start is smaller than the end
    if ((type == "n") || (type == "c"))
    {
       // Is a number, or currency
        if (eval (DelocalizeNum (fvalue)) > eval (DelocalizeNum (tvalue)))
        {
            alert(L_RangeError);
            return false;
        }
    }
    else if (type == "d"){
        //Is a Date
        if (eval("new " + fvalue) > eval("new " + tvalue)){
            alert(L_RangeError);
            return false;
        }         
    }else if (type == "t"){
        //Is a Time
        var comp1 = eval("new Date(0,0,0," + fvalue.substring(fvalue.indexOf('(') + 1, fvalue.indexOf(')') + 1));
        var comp2 = eval("new Date(0,0,0," + tvalue.substring(tvalue.indexOf('(') + 1, tvalue.indexOf(')') + 1));
        if (comp1 > comp2){
            alert(L_RangeError);
            return false;
        }         
    }else if (type == "dt"){
        //Is a DateTime
        var comp1 = eval("new Date" + fvalue.substring(8, fvalue.length));
        var comp2 = eval("new Date" + tvalue.substring(8, tvalue.length));
        if (comp1 > comp2){
            alert(L_RangeError);
            return false;
        }         
    }
    else if (type == "text")
    {
         // is a string
         if (fvalue.toLowerCase() > tvalue.toLowerCase())
         {
            alert(L_RangeError);
            return false;
         }
    }
    // otherwise, let it go

	return true;
}

function checkRangeValueWithMinMax (fvalue, tvalue, type, minValue, maxValue, errorMessage)
{
    // determine if the start is smaller than the end
    if ((type == "n") || (type == "c"))
    {
    	// check invalid number
    	if (isNaN (DelocalizeNum(fvalue)) || isNaN(DelocalizeNum (minValue)) || isNaN(DelocalizeNum (tvalue)) || isNaN(DelocalizeNum (maxValue)))
    	{
        	alert ( L_BadNumber );
        	return false;
    	}
       // Is a number, or currency
        if (eval (DelocalizeNum (fvalue)) > eval (DelocalizeNum (tvalue)))
        {
            alert(L_RangeError);
            return false;
        }
        if (minValue.length>0 && maxValue.length>0){
		    //check min and max
		    if (eval (DelocalizeNum (fvalue)) < eval (DelocalizeNum (minValue)) || eval (DelocalizeNum (tvalue)) > eval (DelocalizeNum (maxValue)))
		    {
		    	alert (errorMessage);
		    	return false;
		    }     
	    }   
    }
    else if (type == "d"){
        //Is a Date
        var comp1 = NeutralDT2Date(fvalue);
        var comp2 = NeutralDT2Date(tvalue);
        if (comp1 > comp2){
            alert(L_RangeError);
            return false;
        } 
		//check min and max
		if (minValue.length>0 && maxValue.length>0){
			var dMin = Date.parse(minValue);
			var dMax = Date.parse(maxValue);
			// since Date month as a value is from 0-11, the string represenatation as a value of 1-12, NeutralDT2Date handle it
			// The number of milliseconds after midnight January 1, 1970
			// Set to GMT for consistent comparison on the client side
			var offset1 = comp1.getTimezoneOffset()*60*1000;
			var offset2 = comp2.getTimezoneOffset()*60*1000;
			var dComp1 = Date.parse(comp1) - offset1;
			var dComp2 = Date.parse(comp2) - offset2;
		    if (dComp1 < dMin || dComp2 > dMax)
		    {
		    	alert (errorMessage);
		    	return false;
		    } 
	    }            
    }else if (type == "t"){
        //Is a Time
        var comp1 = eval("new Date(0,0,0," + fvalue.substring(fvalue.indexOf('(') + 1, fvalue.indexOf(')') + 1));
        var comp2 = eval("new Date(0,0,0," + tvalue.substring(tvalue.indexOf('(') + 1, tvalue.indexOf(')') + 1));
        //var comp1 = NeutralDT2Date(fvalue);
        //var comp2 = NeutralDT2Date(tvalue);
        if (comp1 > comp2){
            alert(L_RangeError);
            return false;
        }   
		//check min and max
		if (minValue.length>0 && maxValue.length>0){
			//getTimeFromIETFFormat to remove the difference of the year, month and day components
			var tMinComponents = getTimeFromIETFFormat(minValue);
			var tMaxComponents = getTimeFromIETFFormat(maxValue);
			var tMinTEFT = eval("new Date(0,0,0," + tMinComponents[0] + "," + tMinComponents[1] + "," + tMinComponents[2] + ")");
			var tMaxTEFT = eval("new Date(0,0,0," + tMaxComponents[0] + "," + tMaxComponents[1] + "," + tMaxComponents[2] + ")");
			// check am or pm
			var index1 = minValue.indexOf(" PM ");
			if (index1>-1)
			{
				tMinTEFT.setTime(tMinTEFT.getTime()+(12*3600*1000));
			}
			var index2 = maxValue.indexOf(" PM ");
			if (index2>-1)
			{
				tMaxTEFT.setTime(tMaxTEFT.getTime()+(12*3600*1000));
			}
			var tMin = Date.parse(tMinTEFT);
			var tMax = Date.parse(tMaxTEFT);
			// Both new Date() make consistent comparison on the client side
			var tComp1 = Date.parse(comp1);
			var tComp2 = Date.parse(comp2);
		    if (tComp1 < tMin || tComp2 > tMax)
		    {
		    	alert (errorMessage);
		    	return false;
		    }  
	    }      
    }else if (type == "dt"){
        //Is a DateTime
        var comp1 = NeutralDT2Date(fvalue);
        var comp2 = NeutralDT2Date(tvalue);
        if (comp1 > comp2){
            alert(L_RangeError);
            return false;
        }         
		//check min and max
		if (minValue.length>0 && maxValue.length>0){
			var dtMin = Date.parse(minValue);
			var dtMax = Date.parse(maxValue);
			// since Date month as a value is from 0-11, the string represenatation as a value of 1-12, NeutralDT2Date handle it
			// The number of milliseconds after midnight January 1, 1970
			// Set to GMT for consistent comparison on the client side
			var offset1 = comp1.getTimezoneOffset()*60*1000;
			var offset2 = comp2.getTimezoneOffset()*60*1000;
			var dtComp1 = Date.parse(comp1) - offset1;
			var dtComp2 = Date.parse(comp2) - offset2;
		    if (dtComp1 < dtMin || dtComp2 > dtMax)
		    {
		    	alert (errorMessage);
		    	return false;
		    }   
	    }
    }
    else if (type == "text" || type == 's')
    {
         // is a string
         if (fvalue.toLowerCase() > tvalue.toLowerCase())
         {
            alert(L_RangeError);
            return false;
         }
         if (minValue.length>0 && maxValue.length>0){
			//check min and max
		    if (fvalue.length < eval (DelocalizeNum (minValue)) || fvalue.length > eval (DelocalizeNum(maxValue)) || tvalue.length > eval (DelocalizeNum (maxValue)) || tvalue.length < eval (DelocalizeNum (minValue)))
		    {
		    	alert (errorMessage);
		    	return false;
		    }  
	    }      
    }
    // otherwise, let it go

	return true;
}

function DelocalizeNum(value)
{
	// trim spaces first
	var numStr = value.replace(/\s/g, "");
		
	// get rid of grouping first	
	var tempStr = "";
	var index = numStr.indexOf(groupSep);
	
	while (index != -1)
	{
		tempStr += numStr.substr(0, index);
		numStr = numStr.substr(index + groupSep.length, numStr.length - index - groupSep.length);
		index = numStr.indexOf(groupSep);
	}
	
	tempStr += numStr;

	index = tempStr.indexOf(decimalSep);
	var neutralStr = "";
	if (index != -1)
	{	
		neutralStr += tempStr.substr(0, index);
		neutralStr += ".";
		neutralStr += tempStr.substr(index + decimalSep.length, tempStr.length - index - decimalSep.length);
	}
	else
	{
		neutralStr = tempStr;
	}

	return neutralStr;
}

// Disable enter key checking for multibyte languages since the enter key is used for committing characters
var isEnabledLanguage = (! ((userLanguage == "ja") || (userLanguage == "ko") || (userLanguage == "zh")) )

var isNav = (navigator.appName == "Netscape");
if (isEnabledLanguage)
{
    if(isNav) {
        document.captureEvents(Event.KEYUP);
    }
    document.onkeyup = checkValue;
}

function checkValue(evt) {
  var buttonVal = "";
  if (isNav) {
    if (evt.which == 13 && (evt.target.type == "text" || evt.target.type == "password")) {
        buttonVal = evt.target.value;
    }
  } else {
    if (window.event.keyCode == 13 && (window.event.srcElement.type == "text" || window.event.srcElement.type == "password")) {
        buttonVal = window.event.srcElement.value;
    }
  }

  if (buttonVal != "") {
    submitValues ();
  }
}

// To retrieve Time components of IETF format
function getTimeFromIETFFormat (strIETF) {	

	var components = strIETF.split(" ");
	for (var i=0; i<components.length; i++) {
		var y = components[i].split(":");
		if (y.length>1) {
			return y;
		}
	}
}
