var g_FIELD_TYPE_INT        = "int";
var g_FIELD_TYPE_FLOAT      = "float";
var g_FIELD_TYPE_CURRENCY   = "currency";
var g_FIELD_TYPE_TEXT       = "text";
var g_FIELD_TYPE_DATE       = "date";
var g_FIELD_TYPE_PERC       = "percentage";
var g_FIELD_TYPE_BUTTON     = "button";
var g_FIELD_TYPE_HIDDEN     = "hidden";
var g_FIELD_NULL_VALUE      = "-";
var g_FIELD_ND_VALUE        = "ND";

var g_IESelectCurrent       = -1;

// Events
/*var formutils_onChange                  = new YAHOO.util.CustomEvent('formutils_onChange');
var formutils_onKeyPress                = new YAHOO.util.CustomEvent('formutils_onKeyPress');
var formutils_selectOnChange            = new YAHOO.util.CustomEvent('formutils_selectOnChange');
var formutils_numericInputOnBlur        = new YAHOO.util.CustomEvent('formutils_numericInputOnBlur');
var formutils_numericInputOnFocus       = new YAHOO.util.CustomEvent('formutils_numericInputOnFocus');*/


//
//	insertAtCursor
//
//	
//
////////////////////////////////////////////////////////////
function insertAtCursor(myField, myValue) 
{ 
	//IE support 
	if (document.selection) 
	{ 
		myField.focus();

		//in effect we are creating a text range with zero 
		//length at the cursor location and replacing it 
		//with myValue 
		sel = document.selection.createRange(); 
		sel.text = myValue; 
	}

	//Mozilla/Firefox/Netscape 7+ support 
	else if (myField.selectionStart || myField.selectionStart == '0') 
	{
		//Here we get the start and end points of the 
		//selection. Then we create substrings up to the 
		//start of the selection and from the end point 
		//of the selection to the end of the field value. 
		//Then we concatenate the first substring, myValue, 
		//and the second substring to get the new value. 
		var startPos = myField.selectionStart; 
		var endPos = myField.selectionEnd;
		 
		myField.value = myField.value.substring(0, startPos)+ myValue + 
						myField.value.substring(endPos, myField.value.length); 
	} 
	else 
	{ 
		myField.value += myValue; 
	} 
}


//
//	isValidEmail
//
//	
//
////////////////////////////////////////////////////////////
function isValidEmail(str)
{
   return (str.indexOf(".") > 0) && (str.indexOf("@") > 0);
}


//
//	appendOptionLast
//
//	
//
////////////////////////////////////////////////////////////
function appendOptionLast(idSel, text, value)
{
	var elOptNew = document.createElement('option');
	
  	elOptNew.text	= text;
  	elOptNew.value	= value;
  
  	var elSel = document.getElementById(idSel);

  	try 
  	{
    	elSel.add(elOptNew, null); // standards compliant; doesn't work in IE
  	}
  	catch(ex) 
  	{
    	elSel.add(elOptNew); // IE only
  	}
}


//
//	rolloverOver
//
//	
//
////////////////////////////////////////////////////////////
function rolloverOver(id, imgSource)
{
    var img = document.getElementById(id);
    
    if (img)
    {
        img.src = imgSource;
    }
}


//
//	rolloverOut
//
//	
//
////////////////////////////////////////////////////////////
function rolloverOut(id, imgSource)
{
    var img = document.getElementById(id);
    
    if (img)
    {
        img.src = imgSource;
    }
}


//
//	getElementsById
//
//	
//
////////////////////////////////////////////////////////////
/*function getElementsById(sId, bExact)
{
    var outArray = new Array();	

    if(typeof(sId)!='string' || !sId)
    {
        return outArray;
    }

    if(document.evaluate)
    {
        var xpathString = "//*[@id='" + sId.toString() + "']"
        var xpathResult = document.evaluate(xpathString, document, null, 0, null);
    
        while ((outArray[outArray.length] = xpathResult.iterateNext())) { }
        outArray.pop();
    }
    else if(document.all)
    {
        for(var i=0,j=document.all[sId].length;i<j;i+=1)
        {
            outArray[i] =  document.all[sId][i];
        }
    }
    else if(document.getElementsByTagName)
    {
        var aEl = document.getElementsByTagName( '*' );	
    
        for(var i=0,j=aEl.length;i<j;i+=1)
        {
            if(aEl[i].id == sId )
            {
                outArray.push(aEl[i]);
            }
        }
    }

    return outArray;
}*/
function getElementsById(id, bExact)
{
    var outArray    = new Array();	
    var aEl         = document.getElementsByTagName( '*' );	
    var bFound      = false;
    
    for (var i=0,j=aEl.length;i<j;i+=1)
    {
        if (bExact)
        {
            bFound = aEl[i].id == id;
        }
        else
        {
            bFound = aEl[i].id.indexOf(id) == 0;
        }
        
        if (bFound)
        {
            outArray.push(aEl[i]);
        }
    }

    return outArray;
}


//
//	getElementsById
//
//	
//
////////////////////////////////////////////////////////////
function getElementCountById(id, bExact)
{
    var nCount      = 0;
    var aEl         = document.getElementsByTagName( '*' );	
    var bFound      = false;
    
    for (var i=0,j=aEl.length;i<j;i+=1)
    {
        if (bExact)
        {
            bFound = aEl[i].id == id;
        }
        else
        {
            bFound = aEl[i].id.indexOf(id) == 0;
        }
        
        if (bFound)
        {
            nCount++;
        }
    }

    return nCount;
}
 
 
//
//	enableDropDownItem
//
//	
//
////////////////////////////////////////////////////////////
function enableDropDownItem(id, selectedItem, bEnabled)
{
    var obj = document.getElementById(id);
    
    if(obj)
    {
        if (obj.type.indexOf("select") == 0)
        {
            var nIndex = getSelectedIndexOfValue(obj, selectedItem);
            
            if (nIndex != -1)
            {
                obj.options[nIndex].disabled = !bEnabled;
            }
        }
    }
}


//
//	enableDropDownItem
//
//	
//
////////////////////////////////////////////////////////////
function enableDropDownItemWithIndex(id, nIndex, bEnabled)
{
    var obj = document.getElementById(id);
    
    if(obj)
    {
        if (nIndex != -1 && nIndex < obj.options.length)
        {
            obj.options[nIndex].disabled = !bEnabled;
        }
    }
}


//
//	getSelectedIndexOfValue
//
//	
//
////////////////////////////////////////////////////////////
function getSelectedIndexOfValue(obj, value)
{
    var nIndex  = -1;
    var i       = 0;
    
    if (obj.type.indexOf("select") == 0)
    {
        var nCount = obj.options.length;
        
        for (i=0;i<nCount;i++)
        {
            if (obj.options[i].value == value)
            {
                nIndex = i;
                break;
            }
        }
    }
    
    return nIndex;
}


//
//	enableFieldsWithCriteria
//
//	
//
////////////////////////////////////////////////////////////
function enableFieldsWithCriteria(criteria, bEnable)
{
    var elements    = getElementsById(criteria, false);
    var nCount      = elements.length;
    
    for (i=0;i<nCount;i++)
    {
        enableField(elements[i].id, bEnable);
    }
}


//
//	enableField
//
//	
//
////////////////////////////////////////////////////////////
function enableField(id, bEnable)
{
    if(document.getElementById(id))
    {
        document.getElementById(id).disabled = !bEnable;
    }
}


//
//	checkField
//
//	
//
////////////////////////////////////////////////////////////
function checkField(id, bChecked)
{
    if(document.getElementById(id))
    {
        document.getElementById(id).checked = bChecked;
    }
}


//
//	addOnChangeEventToSelect
//
//	
//
////////////////////////////////////////////////////////////
function addOnChangeEventToSelect()
{
    var forms = document.getElementsByTagName('form');

	for (var i=0;i < forms.length;i++) 
	{
        var selects = forms[i].getElementsByTagName('select');
    
        for (var j=0;j < selects.length;j++)
        {
            selects[j].onchange = function(e) {formutils_selectOnChange.fire(this);};
            
            // IE6 does not support disabled option items for the select object
            if (GetBrowserClient() == g_browserIE)
            {
                selects[j].onfocus  = function(){ g_IESelectCurrent = this.selectedIndex; IEEmulateDropdownDisable(this); }
                selects[j].onchange = function(){ IERestoreDropdownDisable(this); formutils_selectOnChange.fire(this); }
                IEEmulateDropdownDisable(selects[j]);
            }
        }
    }
}


//
//	toggleSubFieldsDisplay
//
//	
//
////////////////////////////////////////////////////////////
function toggleSubFieldsDisplay(parentObj, tag)
{
    if (parentObj)
    {
        var elements = parentObj.getElementsByTagName(tag);
        
        if (elements.length > 0)
        {
            var display = parentObj.style.display;
            var l       = elements.length;
            var i       = 0;
            
            for (i=0;i<l;i++)
            {
                elements[i].style.display = display;
            }
        }
    }
}


//
//	isNumFieldValid
//
//	
//
////////////////////////////////////////////////////////////
function isNumFieldValid(obj)
{
    var bValid = true;
    
    if (obj)
    {
        obj.style.backgroundColor = c_colNormal;
        
        if (!obj.disabled && (obj.value == "-" || obj.value == "0"))
        {
            obj.style.backgroundColor = c_colHighlight;
            bValid = false;
        }
    }
    
    return bValid;
}


//
//	enableSubFields
//
//	
//
////////////////////////////////////////////////////////////
function enableSubFields(parentObj, tag, bEnable)
{
    if (parentObj)
    {
        var elements = parentObj.getElementsByTagName(tag);
        
        if (elements.length > 0)
        {
            var l       = elements.length;
            var i       = 0;
            
            for (i=0;i<l;i++)
            {
                elements[i].disabled = !bEnable;
            }
        }
    }
}


//
//	appendDummy
//
//	appends a dummy node for stupid IE6
//
////////////////////////////////////////////////////////////
function appendDummy(id)
{
    if (document.getElementById(id))
    {
        var div = document.createElement("div");
                
        if (div)
        {
            div.id = "appendDummy" + Math.random();
            document.getElementById(id).appendChild(div);
        }
    }
}


//
//	addInputNumericFieldEvents
//
//	adds event functions to numeric fields
//
////////////////////////////////////////////////////////////
function addInputNumericFieldEvents()
{
	var forms = document.getElementsByTagName('form');

	for (var i=0;i < forms.length;i++) 
	{
		var inputs = forms[i].getElementsByTagName('input');

		for (var j=0;j < inputs.length;j++)
		{
            addInputNumericFieldEventsForObject(inputs[j]);
		}
	}
}


//
//	addInputNumericFieldEvents
//
//	adds event functions to numeric fields
//
////////////////////////////////////////////////////////////
function addInputNumericFieldEventsForObject(input)
{
    if (input.type != g_FIELD_TYPE_HIDDEN &&
        input.type != g_FIELD_TYPE_BUTTON)
    {
        if (input.alt == g_FIELD_TYPE_INT ||
             input.alt == g_FIELD_TYPE_FLOAT ||
             input.alt == g_FIELD_TYPE_CURRENCY ||
             input.alt == g_FIELD_TYPE_PERC )
        {
            input.onblur		= function(e) {formutils_numericInputOnBlur.fire(this);setNumericFormatForField(this.name);};
            input.onfocus       = function(e) {formutils_numericInputOnFocus.fire(this);removeNumericFormatForField(this.name)};
            
            if (input.alt == g_FIELD_TYPE_INT/* ||
                input.alt == g_FIELD_TYPE_CURRENCY*/)
            {
                // No float values for int /*and currency*/
                input.onkeypress 	= function(e) {formutils_onKeyPress.fire(this); return isNumericKey(e)};
            }
            else
            {
                //Allows float values
                input.onkeypress 	= function(e) {formutils_onKeyPress.fire(this); return isNumericKeyEx(e)};
            }
        }
        else if (input.alt == g_FIELD_TYPE_DATE)
        {
            //Make the control read-only
            input.onkeypress 	= function(e) {return false};
        }
        
        input.onchange = function(e) {formutils_onChange.fire();}
    }
}


//
//	isNumericKey
//
//	checks if the typed key is numeric or not
//
////////////////////////////////////////////////////////////
function isNumericKey(e)
{
	var k;
	var bIsNumeric = false;
	var target     = null;

	if (GetBrowserClient() == g_browserIE)
	{
        target  = window.event.srcElement;
        k       = window.event.keyCode;	
	}
	else
	{
	   target = e.target;
	   document.all ? k = e.keyCode : k = e.which;
    }

    if (k == 78 || k == 110)
    {
        target.value = "N";
    }
    else if (target.value == "N")
    {
        if (k == 68 || k == 100)
        {
            target.value = "ND";
        }
    }
    
    bIsNumeric = ((k > 47 && k < 58) || k == 8 || k == 0 || k == 45);

    if (bIsNumeric && 
        (target.value == "N" || target.value == "NA"))
    {
        target.value = "";
    }
    
    // Tab fix for Safari and IE
    else if (k == 9)
    {
        bIsNumeric = true;
    }
    
	return bIsNumeric;
}


//
//	isNumericKeyEx
//
//	checks if the typed key is numeric or not. checks also
//	for other characters like -, ., etc.
//
////////////////////////////////////////////////////////////
function isNumericKeyEx(e)
{
	var k;
	document.all ? k = e.keyCode : k = e.which;
	return ((k > 47 && k < 58) || k == 8 || k == 0 || k == 46 || k == 45);
}


//
//	formatAllNumericFormat
//
//	formats all fields
//
////////////////////////////////////////////////////////////
function formatAllNumericFormat()
{
    var forms = document.getElementsByTagName('form');

    for (var i=0;i < forms.length;i++) 
    {
        var inputs = forms[i].getElementsByTagName('input');

        for (var j=0;j < inputs.length;j++)
		{
            formatObject(inputs[j]);
		}
    }
}


//
//	formatObject
//
//	formats field
//
////////////////////////////////////////////////////////////
function formatObject(input)
{
    if (input.alt != g_FIELD_TYPE_TEXT &&
        input.alt != g_FIELD_TYPE_DATE &&
        input.type != g_FIELD_TYPE_BUTTON &&
        input.type != g_FIELD_TYPE_HIDDEN && 
        input.value != g_FIELD_NULL_VALUE &&
        input.value != g_FIELD_ND_VALUE)
    {
        input.value = formatNumericField(input.value, input.alt);
    }
}


//
//	setNumericFormatForField
//
//	formats a number to a float or int value, along with spaces
//
//////////////////////////////////////////////////////////////////
function setNumericFormatForField(id) 
{
    if (document.getElementById(id))
    {
        if (document.getElementById(id).value == "")
        {
            document.getElementById(id).value = g_FIELD_NULL_VALUE;
        }
        else if (document.getElementById(id).value != g_FIELD_NULL_VALUE &&
                    document.getElementById(id).value != g_FIELD_ND_VALUE)
        {
            document.getElementById(id).value = formatNumericField(document.getElementById(id).value, document.getElementById(id).alt);
        }
    }
}


//
//	formatNumericField
//
//	formats a number to a float or int value, along with spaces
//
//////////////////////////////////////////////////////////////////
function formatNumericField(num, type) 
{
    var strDot = ".";
    num = num.toString().replace(/\$|\,/g,'');

    if (isNaN(num))
    {
        num = "0";
    }    
    
    sign    = (num == (num = Math.abs(num)));
    num     = Math.floor(num*100+0.50000000001);
    cents   = num%100;
    num     = Math.floor(num/100).toString();

    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
    {
        num = num.substring(0,num.length-(4*i+3))+' '+num.substring(num.length-(4*i+3));
    }
    
    switch (type)
    {
        case g_FIELD_TYPE_INT:
            strDot  = "";
            cents   = "";
            break;
            
        case g_FIELD_TYPE_FLOAT:
        case g_FIELD_TYPE_PERC:
            //Do nothing for now
            break;
            
        case g_FIELD_TYPE_CURRENCY:
            if (cents < 10)
            {
                cents = "0" + cents;
            }
            //strDot  = "";
            //cents   = "";
            break;
    }
    
    return (((sign)?'':'-') + num + strDot + cents);
}


//
//	removeAllNumericFormat
//
//	removes the numeric format from all fields
//
////////////////////////////////////////////////////////////
function removeAllNumericFormat()
{
    var forms = document.getElementsByTagName('form');

    for (var i=0;i < forms.length;i++) 
    {
        var inputs = forms[i].getElementsByTagName('input');

        for (var j=0;j < inputs.length;j++)
		{
            if (inputs[j].alt != g_FIELD_TYPE_TEXT &&
                inputs[j].type != g_FIELD_TYPE_HIDDEN &&
                inputs[j].type != g_FIELD_TYPE_BUTTON)
            {
                inputs[j].value = removeNumericFormat(inputs[j].value);
            }
		}
    }
}


//
//	removeNumericFormatForField
//
//	removes the format from a field
//
////////////////////////////////////////////////////////////
function removeNumericFormatForField(id)
{
    if (document.getElementById(id))
    {
        document.getElementById(id).value = removeNumericFormat(document.getElementById(id).value);
    }
}


//
//	removeNumericFormat
//
//	removes the format from a number
//
////////////////////////////////////////////////////////////
function removeNumericFormat(num)
{
    return num.toString().replace(/\$|\s/g, "");
}


//
//	restoreDropdownDisable
//
//	
//
////////////////////////////////////////////////////////////
function IERestoreDropdownDisable(e) 
{
	if (e.options[e.selectedIndex].disabled) 
	{
		e.selectedIndex = g_IESelectCurrent;
	}
}


//
//	removeSpaces
//
//	
//
////////////////////////////////////////////////////////////
function removeSpaces(string) 
{
	var tstring = "";
	string = '' + string;
	splitstring = string.split(" ");
	for(i = 0; i < splitstring.length; i++)
	tstring += splitstring[i];
	return tstring;
}


//
//	emulateDropdownDisable
//
//	
//
////////////////////////////////////////////////////////////
function IEEmulateDropdownDisable(e) 
{
	for (var i=0, option; option = e.options[i]; i++) 
	{
		if (option.disabled) 
		{
			option.style.color = "graytext";
		}
		else 
		{
			option.style.color = "menutext";
		}
	}
}