//////////////////////////////
//	Requires 'strings.js'	// see below
//	Requires 'helper.js'	// see below
//////////////////////////////

// from helper.js

function getDaysInMonth(pMonth,pYear)
{
    var arrDaysInMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    var dd;
    var nmbdays;
    if (pMonth==2)
    {
        dd = (pYear/4);
        if (dd == parseInt(dd))
        {
            nmbdays = 29;
        }
        else
        {
            nmbdays = 28;
        }
    }
    else
    {
        nmbdays = arrDaysInMonth[pMonth-1];
    }
    return nmbdays;
}

// from strings.js

function stripCharsRight(pString,pChar)
{
	var iLength 	= pString.length;
    var ss 			= '';
	var bStripped 	= false;
    var cc;
    for (var ii = (iLength - 1); ii>=0; ii--)
    {
        cc = pString.charAt(ii);
		if ((bStripped) || (cc!=pChar))
		{
        	bStripped = true;
        	ss 		  = (cc + ss);
		}
    }
    return ss;
}

function stripCharsLeft(pString,pChar)
{
    var iLength		= pString.length;
    var ss 			= '';
	var bStripped 	= false;
    var cc;
    for (var ii = 0; ii<iLength; ii++)
    {
        cc = pString.charAt(ii);
		if ((bStripped) || (cc!=pChar))
		{
        	bStripped = true;
        	ss 		  = (ss + cc);
		}
    }
    return ss;
}

function stripChars(pString,pChar)
{
	return stripCharsLeft(stripCharsRight(pString,pChar),pChar);
}

function ReplaceString(pString,pSubStr,pReplaceWith)
{
    var ii,jj,iChar;
    var ss,cc;
    var iStrLen     = pString.length;
    var iSubStrLen  = pSubStr.length;
    ss    = '';
    iChar = 0;
    for (ii = 0; ii<iStrLen; ii++)
    {
        cc = pString.charAt(ii);
        if (cc==pSubStr.charAt(iChar))
        {
            iChar = iChar + 1;
            if (iChar==iSubStrLen)
            {
                ss = ss + pReplaceWith;
                iChar = 0;
            }
        }
        else
        {
            if (iChar==0)
            {
                ss = ss + cc;
            }
            else
            {
                ii = ii - iChar;
                ss = ss + pString.charAt(ii);
            }
            iChar = 0;
        }
    }
    return ss;
}

function GetRightOfDelim(pString,pDelim)
{
    var cc;
    var iStrLen = pString.length;
    var ss      = '';
    var ii      = (iStrLen - 1);
    while (ii>=0)
    {
        cc = pString.charAt(ii);
        if (cc==pDelim)
        {
            ii = 0;
        }
        else
        {
            ss = cc + ss;
        }
        ii = ii - 1;
    }
    return ss;
}

function splitString(pString,pDelim)
{
    var cc;
    var ii = 0;
    var jj = 0;
    var ss = '';
    var arrSubStr = new Array();
    while (ii<pString.length)
    {
        cc = pString.charAt(ii);
        if (cc==pDelim)
        {
            arrSubStr[jj] = ss;
            jj = jj + 1;
            ss = '';
        }
        else
        {
            ss  = ss + cc;
        }
        ii = ii + 1;
    }
    if ((ss>'') || (jj==0))
    {
        arrSubStr[jj] = ss;
    }

    return arrSubStr;
}

function rightOfString(pString,pIndex)
{
	var ss = '';
	for (var ii = pIndex; ii<pString.length; ii++)
	{
		ss = (ss + pString.charAt(ii));
	}
	return ss;
}

function leftOfString(pString,pIndex)
{
	var ss = '';
	for (var ii = pIndex; ii>=0; ii--)
	{
		ss = (pString.charAt(ii) + ss);
	}
	return ss;
}

//////////////////////////////

//	Textbox	//
var sOldTextBoxVal = '';

function enterTextBox(pSrc)
{
    sOldTextBoxVal = pSrc.value;
}

function formatTextBox(pSrc,pAllowedDisallowedChars,pMaxLength)
{
    var bValid 	= true;

	//	Get original value (set by enterTextBox()) incase we need to reset it
    var sOldVal = sOldTextBoxVal;

	//	Get new value
    var ss 		= pSrc.value;

    //	Trim it
    ss = stripChars(ss,' ');

    var iLength = ss.length;

    //	Check for Allowed/Disallowed Characters
    var sMessage;
    var cc;
    var bDisallowed = true;

    pAllowedDisallowedChars = ReplaceString(pAllowedDisallowedChars,"{quote}","'");
    pAllowedDisallowedChars = ReplaceString(pAllowedDisallowedChars,"{doublequote}",'"');
    pAllowedDisallowedChars = ReplaceString(pAllowedDisallowedChars,"{greaterthan}",">");
    pAllowedDisallowedChars = ReplaceString(pAllowedDisallowedChars,"{lessthan}","<");
    pAllowedDisallowedChars = ReplaceString(pAllowedDisallowedChars,"{backslash}","\\");
    if (pAllowedDisallowedChars=='')
    {
    	//	Use default
    	pAllowedDisallowedChars = '|';
    }

	cc = pAllowedDisallowedChars.charAt(0);
	if ((cc=='+') || (cc=='-'))
	{
		if (cc=='-')
		{
			bDisallowed = true;
		}
		else
		{
			bDisallowed = false;
		}
		pAllowedDisallowedChars = pAllowedDisallowedChars.substring(1);
	}

    var ii = 0;
	while ((ii<iLength) && (bValid))
	{
		cc = ss.charAt(ii);
		if (pAllowedDisallowedChars.indexOf(cc)>=0)
		{
			bValid = !bDisallowed;
		}
		else
		{
			bValid = bDisallowed;
		}

		ii = ii + 1;
	}

    if (!bValid)
    {
        sMessage = 'Invalid character, ' + cc;
    }
    else if ((pMaxLength>0) && (iLength>pMaxLength))
	{
		bValid	 = false;
		sMessage = 'Field is limited to ' + pMaxLength + ' characters.';
	}

    if (!bValid)
    {
        alert(sMessage);
        pSrc.value = sOldVal;
        pSrc.focus();
        pSrc.select();
    }
    else
    {
        pSrc.value = ss;
    }
}

//	Needs tidying up //
function formatDateTextBox(src,pseparator)
{
    var sOldVal = sOldTextBoxVal;
    var ss 		= src.value;
    if (ss!='')
    {
        var ii;
        var iLength;
        var iSeparators;
        var sDay;
        var sMonth;
        var sYear;
        var bValid;
        var cc;
        ii=0;
        iLength=ss.length;
        iSeparators = 0;
        sDay = '';
        sMonth = '';
        sYear = '';
        bValid=true;
        while ((ii<iLength) && bValid)
        {
            cc = ss.charAt(ii);
            if ((cc>='0') && (cc<='9'))
            {
                if (iSeparators==0)
                {
                    sDay = sDay + cc;
                }
                else if (iSeparators==1)
                {
                    sMonth = sMonth + cc;
                }
                else
                {
                    sYear = sYear + cc;
                }
            }
            else if ((cc=='/') || (cc=='-'))
            {
                iSeparators = iSeparators + 1;
                if (iSeparators==3)
                {
                    bValid = false;
                }
            }
            else
            {
                bValid = false;
            }
            ii = ii + 1;
        }

        if (bValid)
        {
            sDay = parseInt(stripCharsLeft(sDay,'0'));
            sMonth = parseInt(stripCharsLeft(sMonth,'0'));
            sYear = stripCharsLeft(sYear,'0');

            if (sYear=='')
            {
            	sYear = new Date().getFullYear();
            }
            sYear = parseInt(sYear);

            if (sMonth<=12)
            {
                if (sYear>=0)
                {
                        if (sYear<40)
                        {
                           	sYear = 2000 + sYear;
						}
						else if (sYear<100)
						{
                           	sYear = 1900 + sYear;
                        }

                        if ((sDay>0) && (sDay<=getDaysInMonth(sMonth,sYear)))
                        {
                            if (sDay<=9)
                            {
                                sDay='0' + sDay;
                            }
                            if (sMonth<=9)
                            {
                                sMonth='0' + sMonth;
                            }
                            src.value = sDay + pseparator + sMonth + pseparator + sYear;
                        }
                        else
                        {
                            bValid = false;
                        }
                }
                else
                {
                    bValid = false;
                }
            }
            else
            {
                bValid = false;
            }
        }
        if (!bValid)
        {
            alert('Invalid date. Format: dd/mm/yyyy');
            src.value = sOldVal;
            src.focus();
            src.select();
        }
    }
}

function formatTimeTextBox(src)
{
    var sOldVal = sOldTextBoxVal;
    var ss 	= src.value;

    if(ss.length == 4)
    {
    	ss		= ss.substring(0,2) + ':' + ss.substring(2,4);
    }

    if (ss!='')
    {
        var ii			= 0;
        var iLength		= ss.length;
        var iSeparators = 0;
        var sHours		= '';
        var sMinutes	= '';
        var sSeconds	= '';
        var bValid		= true;
        var cc;

        while ((ii<iLength) && bValid)
        {
            cc = ss.charAt(ii);
            if ((cc>='0') && (cc<='9'))
            {
                if (iSeparators==0)
                {
                    sHours = sHours + cc;
                }
                else if (iSeparators==1)
                {
                    sMinutes = sMinutes + cc;
                }
                else
                {
                    sSeconds = sSeconds + cc;
                }
            }
            else if (cc==':')
            {
                iSeparators = iSeparators + 1;
                if (iSeparators==3)
                {
                    bValid = false;
                }
            }
            else
            {
                bValid = false;
            }
            ii = ii + 1;
        }

        if (bValid)
        {
            sHours   = stripCharsLeft(sHours,'0');
			if (sHours == '')
			{
				sHours = 0;
			}
			sHours = parseInt(sHours);

            sMinutes = stripCharsLeft(sMinutes,'0');
			if (sMinutes == '')
			{
				sMinutes = 0;
			}
			sMinutes = parseInt(sMinutes);

            sSeconds = stripCharsLeft(sSeconds,'0');
			if (sSeconds == '')
			{
				sSeconds = 0;
			}
			sSeconds = parseInt(sSeconds);

            if (sHours<=23)
            {
                sHours = sHours + '';
                if (sHours.length==1)
                {
                    sHours = '0' + sHours;
                }
                if (sMinutes<=59)
                {
                    sMinutes = sMinutes + '';
                    if (sMinutes.length==1)
                    {
                        sMinutes = '0' + sMinutes;
                    }
                    if (sSeconds<=59)
                    {
	                    sSeconds = sSeconds + '';
	                    if (sSeconds.length==1)
	                    {
	                        sSeconds = '0' + sSeconds;
	                    }
                    }
                    src.value = sHours + ':' + sMinutes// + ':' + sSeconds;
                }
                else
                {
                    bValid = false;
                }
            }
            else
            {
                bValid = false;
            }
        }
        if (!bValid)
        {
            alert('Invalid time. Format: hh:mm');
            src.value = sOldVal;
            src.focus();
            src.select();
        }
    }
}

function formatNaturalTextBox(pSrc,pConvertBlankToZero)
{
    var bValid 	= true;

	//	Get original value (set by enterTextBox()) incase we need to reset it
    var sOldVal = sOldTextBoxVal;

	//	Get new value
    var ss 		= pSrc.value;

    //	Trim it
    ss = stripChars(ss,' ');

    //	Covert blank to zero if appropriate
    if (pConvertBlankToZero)
    {
    	if (ss=='')
    	{
    		ss = '0';
    	}
    }

    //	Strip leading zeros
    if (ss!='0')
    {
    	ss = stripCharsLeft(ss,'0');
    }

    //	Check format
    var iLength = ss.length;
    var ii 		= 0;
    var cc;
    while (ii<iLength)
    {
        cc = ss.charAt(ii);
        if (!((cc>='0') && (cc<='9')))
        {
            bValid 	= false;
            ii 		= iLength;
        }
        else
        {
        	ii = ii + 1;
        }
    }

    //	If invalid, raise an alert and reset
    if (!bValid)
    {
        alert('You must enter a positive whole number.');
        pSrc.value = sOldVal;
        pSrc.focus();
        pSrc.select();
    }
    else
    {
        pSrc.value = ss;
    }
}

function formatIntegerTextBox(pSrc,pConvertBlankToZero)
{
    var bValid 	= true;

	//	Get original value (set by enterTextBox()) incase we need to reset it
    var sOldVal = sOldTextBoxVal;

	//	Get new value
    var ss 		= pSrc.value;

    //	Trim it
    ss = stripChars(ss,' ');

	//	Check for a minus sign
	var sSign = '';
	if (ss!='')
	{
		if (ss.charAt(0)=='-')
		{
			sSign 	= '-';
			ss		= rightOfString(ss,1);
		}
	}

    //	Covert blank to zero if appropriate
    if (pConvertBlankToZero)
    {
    	if (ss=='')
    	{
    		ss = '0';
    	}
    }

    //	Strip leading zeros
    if (ss!='0')
    {
    	ss = stripCharsLeft(ss,'0');
    }

    //	Check format
    var iLength = ss.length;
    var ii 		= 0;
    var cc;
    while (ii<iLength)
    {
        cc = ss.charAt(ii);
        if ((cc>='0') && (cc<='9'))
        {
			//	ok
	        ii = ii + 1;
        }
        else
        {
        	bValid 	= false;
			ii 		= iLength;
        }
    }

    //	If invalid, raise an alert and reset
    if (!bValid)
    {
        alert('You must enter a whole number.');
        pSrc.value = sOldVal;
        pSrc.focus();
        pSrc.select();
    }
    else
    {
        if (ss!='0')
        {
        	ss = sSign + ss;
        }
        pSrc.value = ss;
    }
}

function formatFloatTextBox(pSrc,pConvertBlankToZero)
{
    var bValid 	= true;

	//	Get original value (set by enterTextBox()) incase we need to reset it
    var sOldVal = sOldTextBoxVal;

	//	Get new value
    var ss 		= pSrc.value;

    //	Trim it
    ss = stripChars(ss,' ');

	//	Check for a minus sign
	var sSign = '';
	if (ss!='')
	{
		if (ss.charAt(0)=='-')
		{
			sSign 	= '-';
			ss		= rightOfString(ss,1);
		}
	}

	if (ss=='')
	{
	    //	Covert blank to zero if appropriate
		if (pConvertBlankToZero)
		{
			ss = '0';
		}
	}
	else
    {
		//	Strip leading zeros
		ss = stripCharsLeft(ss,'0');
		if (ss=='')
		{
			ss = '0';
		}
	}

    //	Check format
    var iLength 	= ss.length;
    var ii 			= 0;
	var bFraction 	= false;
    var cc;
    while ((ii<iLength) && (bValid))
    {
        cc = ss.charAt(ii);
        if ((cc>='0') && (cc<='9'))
        {
			//	ok
	        ii = (ii + 1);
        }
		else if (cc=='.')
        {
			if (!bFraction)
			{
				//	ok
				bFraction = true;
				ii		  = (ii + 1);
			}
			else
			{
	        	bValid = false;
			}
        }
		else
        {
        	bValid = false;
        }
    }

    //	If invalid, raise an alert and reset
    if (!bValid)
    {
        alert('You must enter a valid number.');
        pSrc.value = sOldVal;
        pSrc.focus();
        pSrc.select();
    }
    else
    {
       	if (ss!='')
       	{
			var iIndex = ss.indexOf('.');

			if (iIndex==(ss.length - 1))
			{
				ss = ss + 0;
			}

			if (iIndex==0)
			{
				ss = 0 + ss;
			}

			var ss2 = parseFloat(ss);
			if (ss2==0)
			{
				ss = '0';
			}
			else
			{
				ss = sSign + ss;
			}
		}
        pSrc.value = ss;
    }
}

//	Selectbox	//
function moveSelectboxOption(pBox,pUp)
{
    var iOptions  = pBox.options.length;
    var iSelIndex = pBox.selectedIndex;
	var iNewIndex;

	if (pUp)
	{
		iNewIndex = (iSelIndex - 1);
	}
	else
	{
		iNewIndex = (iSelIndex + 1);
	}

	if ((iSelIndex>=0) && ((iNewIndex>=0) && (iNewIndex<iOptions)))
	{
		var tempVal  = pBox.options[iNewIndex].value;
		var tempText = pBox.options[iNewIndex].text;

		pBox.options[iNewIndex].value 	= pBox.options[iSelIndex].value;
		pBox.options[iNewIndex].text	= pBox.options[iSelIndex].text;
		pBox.options[iSelIndex].value	= tempVal;
		pBox.options[iSelIndex].text	= tempText;

		pBox.selectedIndex = iNewIndex;
	}
}

function transferSelectboxOptions(pFromBox,pToBox,pHiddenInput,pDuplicates,pOnChange)
{
    var iFromOptions    = pFromBox.options.length;
    var iToOptions      = pToBox.options.length;
    var ii              = 0;
    var jj              = 0;
    var bOk             = true;
	var bChanged		= false;

    for (jj = 0; jj<iFromOptions; jj++)
    {
        if (pFromBox.options[jj].selected)
        {
            bOk = true;
            if (!pDuplicates)
            {
                ii = 0;
                while ((ii<iToOptions) && (bOk))
                {
                    if (pToBox.options[ii].value==pFromBox.options[jj].value)
                    {
                        bOk = false;
                    }
                    ii = ii + 1;
                }
            }
            if (bOk)
            {
                pToBox.options[iToOptions] = new Option(pFromBox.options[jj].text,pFromBox.options[jj].value);
                iToOptions = iToOptions + 1;
            	if (!bChanged)
            	{
					pOnChange = ReplaceString(pOnChange,"{quote}","'");
            		setTimeout(pOnChange,1);
            		bChanged = true;
            	}
            }
        }
    }
    populateHiddenInputFromSelectbox(pHiddenInput,pToBox);
}

function removeSelectboxOptions(pBox,pHiddenInput,pOnChange)
{
    var iOptions = pBox.options.length;
    var ii;
	var bChanged = false;

    for (var ii = (iOptions - 1); ii>=0; ii--)
    {
        if (pBox.options[ii].selected)
        {
            pBox.options[ii] = null;
			if (!bChanged)
			{
				pOnChange = ReplaceString(pOnChange,"{quote}","'");
				setTimeout(pOnChange,1);
				bChanged = true;
			}
        }
    }
    populateHiddenInputFromSelectbox(pHiddenInput,pBox);
}

function populateHiddenInputFromSelectbox(pInput,pBox)
{
    var iOptions = pBox.options.length;
    var ss = '';
    for (var ii=0; ii<iOptions; ii++)
    {
        if (ss!='')
        {
        	ss = ss + '|';
        }
        ss = ss + pBox.options[ii].value;
    }
    pInput.value = ss;
}

function populateSelectboxFromHiddenInput(pFromBox,pToBox,pHiddenInput)
{
    var sInputVal = pHiddenInput.value;
    if (sInputVal!='')
    {
        var arrOptions = splitString(sInputVal,"|")
        var iOptions = arrOptions.length;
        var iFromBoxOptions = pFromBox.options.length;
        var jj;
        var ss;
        clearSelectbox(pToBox);
        for (var ii=0; ii<iOptions; ii++)
        {
            //  Get the corresponding display text from the FromBox
            jj = 0;
            ss = '';
            while (jj<iFromBoxOptions)
            {
                if (pFromBox.options[jj].value==arrOptions[ii])
                {
                    ss = pFromBox.options[jj].text;
                    jj = iFromBoxOptions;
                }
                jj = jj + 1;
            }
            if (jj==(iFromBoxOptions + 1))
            {
                addOptionToSelectbox(pToBox,arrOptions[ii],ss);
            }
        }
    }
}

function addOptionToSelectbox(pBox,pOptionValue,pOptionText)
{
    var iOptions = pBox.options.length;
    pBox.options[iOptions] = new Option(pOptionText,pOptionValue);
}

function clearSelectbox(pBox)
{
    var iOptions = pBox.options.length;
    for (var ii = iOptions; ii>=0; ii--)
    {
        pBox.options[ii] = null;
    }
}

function deselectAll(src)
{
    var ii;
    for (ii=0; ii<src.options.length; ii++)
    {
        src.options[ii].selected = false;
    }
}

function SpinnerFloatAdd(pField,pInc,pFunction)
{
	var dValue	= parseFloat(GetForm()[pField].value);
	if(isNaN(dValue)){dValue = 0};
	GetForm()[pField].value = (dValue + pInc);

	if(pFunction != '')
	{
		eval(pFunction);
	}
}
function SpinnerFloatSub(pField,pInc,pFunction)
{
	var dValue	= parseFloat(GetForm()[pField].value);
	if(isNaN(dValue)){dValue = 0};
	GetForm()[pField].value = (dValue - pInc);

	if(pFunction != '')
	{
		eval(pFunction);
	}
}

var arrFormData			= new Array();
var bFormDataInit		= false;
var pActiveFormData		= null;

function LoadFormData(pForm)
{
	var arrData			= new Array();

	for(var ii = 0;ii < pForm.elements.length;ii++)
	{
		arrData[ii]		= [pForm.elements[ii].name,pForm.elements[ii].value];
		bFormDataInit	= true;
	}

	arrFormData			= arrData;
	pActiveFormData		= pForm;
}

