function checkBounds(field, minNumber, maxNumber) {
	if (field.value.length == 0) {
		return true;
	}
	
	if (parseFloat(field.value) < minNumber) {
		alert("The minimum valued allowed for this field is " + minNumber + ".");
		field.focus();
		field.select();
		return false;
	}
	if (parseFloat(field.value) > maxNumber) {
		alert("The maximum valued allowed for this field is " + maxNumber + ".");
		field.focus();
		field.select();
		return false;
	}

	return true;
}

function formatCurrency(field, dp) {
	var start = 0;
	
	if (field.lastvalue != field.value && field.value.length > 0) {
	
		if (field.value.substr(0, 1) == "-") {
			start = 1;
		}
			
		if (dp > 0 && field.value.indexOf(".") == -1) {
			field.value += ".";
		}
		
		if (field.value.substr(start, 1) == ".") {
			field.value = field.value.substr(0, start) + "0" + field.value.substr(start, field.value.length - start);
		}
		
		while (field.value.length - field.value.indexOf(".") - 1 < dp) {
			field.value += "0";
		}
		
		field.lastvalue = field.value;
	}
}

function decimalPlaces(field, dp){
	var endRange;

	if (dp == 0 && window.event.keyCode == 46){
		window.event.returnValue = false;
		return;
	}
	
	// CATCH INVALID CHARACTERS
	if ((window.event.keyCode < 47 || window.event.keyCode > 57) && window.event.keyCode != 45 && window.event.keyCode != 46) {
		window.event.returnValue = false;
		return;
	}	
	
	if (document.selection.type == "None") {
		// WHEN TEXT NOT SELECTED
		
		endRange = document.selection.createRange();
		endRange.moveEnd("textedit");

		// CATCH MULTIPLE -'S
		if (window.event.keyCode == 45 && (field.value.indexOf("-") != -1 || (field.value.length - endRange.text.length) != 0)) {
			window.event.returnValue = false;
			return;
		}
		
		if (dp != 0) {	
		
			// CATCH DECIMAL POINTS 
			if (window.event.keyCode == 46 && (field.value.indexOf(".") != -1 || endRange.text.length > dp)) {
				window.event.returnValue = false;
				return;
			}	

			// CATCH DECIMAL PLACES 
			if (window.event.keyCode != 45 && window.event.keyCode != 46 && endRange.text.indexOf(".") == -1 && getDecimalPlaces(field.value) >= dp) {
				window.event.returnValue = false;
				return;
			}
		}
		
	} else if (document.selection.type == "Text"){
		// WHEN TEXT SELECTED
	
		endRange = document.selection.createRange();	

		// CATCH MULTIPLE -'S
		if (window.event.keyCode == 45 && (field.value.indexOf(endRange.text) > 0) || (endRange.text.indexOf("-") == -1 && field.value.indexOf("-") != -1)) {
			window.event.returnValue = false;
			return;
		}
		
		if (dp != 0) {
		
			// CATCH DECIMAL POINTS 
			if (window.event.keyCode == 46 && endRange.text.indexOf(".") == -1 && field.value.indexOf(".") != -1) {
				window.event.returnValue = false;
				return;
			}	
					
		}
	}
}

function decimalPlaces_v2(field, dp, e) {
    var endRange;
    var keyCode;

    if (!e) var e = window.event;

    if (e.keyCode)
        keyCode = e.keyCode;
    else if (e.which)
        keyCode = e.which;

    if (keyCode == 9 || keyCode == 8) {  // TAB 
        return;
    }

    if (e.ctrlKey == true) // ALLOW COPY PASTE FUNCTIONS
    {
        return;
    }

    if (dp == 0 && keyCode == 46) {
        preventEventDefault(e);
        return;
    }

    // CATCH INVALID CHARACTERS
    if ((keyCode < 47 || keyCode > 57) && keyCode != 45 && keyCode != 46) {
        preventEventDefault(e);
        return;
    }

    if (document.selection && document.selection.type == "None") {
        // WHEN TEXT NOT SELECTED

        endRange = document.selection.createRange();
        endRange.moveEnd("textedit");

        // CATCH MULTIPLE -'S
        if (keyCode == 45 && (field.value.indexOf("-") != -1 || (field.value.length - endRange.text.length) != 0)) {
            preventEventDefault(e);
            return;
        }

        if (dp != 0) {

            // CATCH DECIMAL POINTS 
            if (keyCode == 46 && (field.value.indexOf(".") != -1 || endRange.text.length > dp)) {
                preventEventDefault(e);
                return;
            }

            // CATCH DECIMAL PLACES 
            if (keyCode != 45 && keyCode != 46 && endRange.text.indexOf(".") == -1 && getDecimalPlaces(field.value) >= dp) {
                preventEventDefault(e);
                return;
            }
        }

    } else if (document.selection && document.selection.type == "Text") {
        // WHEN TEXT SELECTED

        endRange = document.selection.createRange();

        // CATCH MULTIPLE -'S
        if (keyCode == 45 && (field.value.indexOf(endRange.text) > 0) || (endRange.text.indexOf("-") == -1 && field.value.indexOf("-") != -1)) {
            preventEventDefault(e);
            return;
        }

        if (dp != 0) {

            // CATCH DECIMAL POINTS 
            if (keyCode == 46 && endRange.text.indexOf(".") == -1 && field.value.indexOf(".") != -1) {
                preventEventDefault(e);
                return;
            }
        }
    }
}

function getDecimalPlaces(num) {
	if (num.indexOf(".") == -1) {
		return 0;
	} else {
		return num.length - num.indexOf(".") - 1;
	}
}

function isDecimal(s, allowDecimal)
{   
	var i;
	var foundDecimal = false;
	if (!allowDecimal) foundDecimal = true;
	
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) {
			if (c == ".") {
				if (foundDecimal) {
					return false;
				} else {
					foundDecimal = true;
				}
			} else {
				return false;
			}
		}
		
    }
    // All characters are numbers.
    return true;
}

function hide(elementID) {
    var element = document.getElementById(elementID);
    element.style.display = "none";
}


function show(elementID){
    var element = document.getElementById(elementID);
	element.style.display = "block";
}

function getSelectTextValue(list) {
    return list.options[list.selectedIndex].text;
}

function getSelectValue(list) {
    return list.options[list.selectedIndex].value;
}

function getSelectObject(list) {
    return list.options[list.selectedIndex];
}

function nz(val, rtn) {
    return cnull(val, rtn);
}

function cnull(val, rtn) {
    if (val == null || val == 'null' || val == 'undefined' || typeof (val) == 'undefined')
        return rtn;
    else
        return val;
}

function formatHTML(str) {
    if (str == null)
        return str;

    str = new String(str);

    str = str.replace(/"/g, "&quot;");
    //str = str.replace(/ /g, "&nbsp;");
    str = str.replace(/</g, "&lt;");
    str = str.replace(/>/g, "&gt;");
    str = str.replace(/\r\n/g, "<br>");

    return str;
}

function setRowEvents(table, evt, func, start) {
    for (var i = start; i < table.rows.length; i++)
        eval("table.rows[" + i + "]." + evt + " = " + func + ";");
}

function enableControl(control, disabled) {
    if (disabled) {
        document.getElementById("lbl_" + control.id).className = "Disabled";
        control.disabled = true;
    } else {
        document.getElementById("lbl_" + control.id).className = "Enabled";
        control.disabled = false;

        if (control.tab != null) {
            var tdTab = document.getElementsByName(control.tab);
            tdTab[0].style.fontWeight = "bold";
        }
    }
}

function openWindow(page, pagename, width, height, windowfeatures) {
    if (windowfeatures != "") {
        windowfeatures = "," + windowfeatures;
    }

    var left = screen.availWidth / 2 - width / 2;
    var top = screen.availHeight / 2 - height / 2;

    pagename = pagename.toString().replace(/[\s-&.]/g, "");

    var w = window.open(page, pagename, "LEFT=" + left + ",TOP=" + top + ",HEIGHT=" + height + ",WIDTH=" + width + windowfeatures);
    var browser = browserSniff();

    if (browser != "NS" && browser != "OPR") {
        eval("try {w.focus();} catch(e) {}");
    }

    return w;
}

function browserSniff() {
    if (document.layers) {
        return "NS";
    }
    if (document.all) {
        var agt = navigator.userAgent.toLowerCase();
        var is_opera = (agt.indexOf("opera") != -1);

        if (is_opera) {
            return "OPR";
        } else {
            return "IE";
        }
    }
    if (document.getElementById) {
        return "MOZ";
    }
    return "OTHER";
}

/*
' ------------------------------------------------------------------------------
' |		P A R A M E T E R  O B J E C T
' ------------------------------------------------------------------------------
*/

// Constructor
function Parameter(parameterType, name, dataType, value) {
    this.ParameterType = parameterType;
    this.Name = name;
    this.DataType = dataType;
    this.Value = value;
}


/*
' ------------------------------------------------------------------------------
' |		F U N C T I O N O B J E C T  O B J E C T
' ------------------------------------------------------------------------------
*/

// Constructor
function FunctionObject(name) {
    this.Name = (arguments.length > 0) ? name : '';
    this.Parameters = new Array();
}

// Adds a new parameter to the Parameters collection
FunctionObject.prototype.addParameter = function(parameterType, name, dataType, value) {
    this.Parameters[this.Parameters.length++] = new Parameter(parameterType, name, dataType, value);
}

// Returns the XML representation of the FunctionObject
FunctionObject.prototype.toXml = function() {
    var parameter;
    var xml = '<FunctionObject Name="' + this.Name + '">';

    for (var i = 0; i < this.Parameters.length; i++) {
        parameter = this.Parameters[i];
        xml += '<Parameter ParameterType="' + parameter.ParameterType + '" Name="' + parameter.Name + '" DataType="' + parameter.DataType + '" Value="' + parameter.Value + '" />';
    }

    xml += '</FunctionObject>'
    parameter = null;
    return xml;
}
