/*dependencies
    <dependencies />
dependencies*/



/*-----------------------------------------------------------------------------
 bUseSpansForRegExp: bool-Determines whether to retrieve regular expressions
                          from specifically named spans, or from an xml doc

 sSpanIDPrefix:    string-If using spans as mentioned above, this would be
                          the common first half of the ID that they all share.
                          for example, spnRegExp

 arListOfControlIDs string array-This is the list of ids that need to be validated.
-----------------------------------------------------------------------------*/
function ValidateForm(SpanIDPrefix, arListOfControlIDs) {
    return validateForm(true, SpanIDPrefix, arListOfControlIDs);
}
function validateForm(bUseSpansForRegExp, sSpanIDPrefix, arListOfControlIDs) {

    var xmlRegExpDoc = null;

    //try {

    if (!bUseSpansForRegExp) xmlRegExpDoc = loadDoc("regExp");

    for (var i = 0; i < arListOfControlIDs.length; i++) {

        var obj = document.getElementById(arListOfControlIDs[i]);
        var sErrMsg = obj.getAttribute("errMsg");
        var sIsReq = obj.getAttribute("isreq").toLowerCase();
        var iIsReq = parseInt(sIsReq);
        var isReq = false;
        if (isNaN(iIsReq)) {

            // test for boolean
            if (sIsReq == "true") { isReq = true; }

        } else {

            isReq = _IntToBool(iIsReq);

        }

        var sRegExpNode = obj.getAttribute("constraint");

        var sRegExp;

        //if(location.href.indexOf("application.aspx") > 0) { alert(sSpanIDPrefix + sRegExpNode); }
        if (!bUseSpansForRegExp && xmlRegExpDoc != null) sRegExp = xmlRegExpDoc.selectSingleNode("//" + sRegExpNode).text;
        else if (bUseSpansForRegExp) sRegExp = document.getElementById(sSpanIDPrefix + sRegExpNode).innerHTML;

        /* must be required or not required and filled out, and must have a reg exp associated with it besides 'Any'*/
        if (isReq || (!isReq && obj.value.length > 0) && sRegExpNode != null && sRegExpNode != "Any" && sRegExpNode != "") {

            if (!validateField(obj, sRegExp)) {

                alert(sErrMsg);
                try { obj.select(); } catch (x) { }
                return false;
            }

        }

    }

    //} catch(x) { }

    return true;

}

function _IntToBool(integer) {

    if (integer == 1) { return true; }
    else { return false; }

}


/*general validation that tests values against reg exp*/
function validateField(obj, sRegExp){

    sRegExp = sRegExp.replace(/&#00038;/g, "&").replace(/&#00035;/g, "#");

	var sText = obj.value;
		
	while(sText.indexOf("  ") > -1) { sText = sText.replace(/  /g, " "); }
//if(location.href.indexOf("application.aspx") > 0) { alert(sRegExp); }
	var oTextField = new RegExp(sRegExp);
	
	return oTextField.test(sText);

}

/* validates a fraction value, and converts it to a decimal returns the decimal value if valid*/
function fractionToDecimal(sFraction, iErrCode) {

    if (iErrCode == null) iErrCode = -109;
    
    var iWholeNumber = 0;
    var sLastHalf = sFraction;
    if(sFraction.indexOf(" ") > -1) {
    
        var arNumbers = sFraction.split(" ");
        iWholeNumber = arNumbers[0];
        sLastHalf = arNumbers[1];
        if(isNaN(iWholeNumber)) {
        
            alert("Invalid whole number of fraction");
            return iErrCode;
        
        }
    }
    
    var arFraction = sLastHalf.split("/");
    var iNumerator = parseInt(arFraction[0]);
    var iDenominator = parseInt(arFraction[1]);
    
    if(isNaN(iNumerator)) {
        alert("Invalid numerator");
        return iErrCode;
    } else if(isNaN(iDenominator)) {
        alert("Invalid denominator");
    }
    
    var iFract = parseFloat(iNumerator / iDenominator);
    iFract += iWholeNumber;
    return iFract.toString();
    

}

/* pass a string ex: 2'-5", and an error code. it returns 
   the decimal: 29.0 or the error code passed in if an error occurs*/
function FeetNInchesToDecimal(sLength, sErr) {
    
    if(sErr == null) sErr = -1;
    var sFeet = "";
    var sWholenumber = "";
    var sNumerator = "";
    var sDenominator = "";
    var fWholenumber = 0;
    var fFraction = 0;

    if(sLength.indexOf("'") == -1) {
    
        alert("Missing feet marker in length.");
        return sErr;
    
    } else {

        sFeet = sLength.substring(0, sLength.indexOf("'"));
        
        var iStop = sLength.indexOf("\"");
        if(iStop == -1) iStop = sLength.length;
        
        if(sLength.indexOf(" ") == -1 && sLength.indexOf("/") == -1) {
        
            /* no fraction*/
            sWholenumber = sLength.substring(sLength.indexOf("-") + 1, iStop);

            if(isNaN(parseInt(sWholenumber))) {
            
                alert("There was a problem converting the inches portion of the length to a decimal. Please review your entry.");
                return sErr;
            
            }
            
        } else if(sLength.indexOf(" ") == -1 && sLength.indexOf("/") > -1) {
        
            /* just a fraction*/
            var iStart = sLength.indexOf("-");
            var iSlash = sLength.indexOf("/");

            sNumerator = sLength.substring(iStart + 1, iSlash);
            sDenominator = sLength.substring(iSlash+1, iStop);
            
            if(isNaN(sDenominator)) {
            
                alert("There was a problem converting the inches portion of the length to a decimal. The denominator parsed at a 0 value. Please review your entry.");
                return sErr;
            
            } else {
            
                if(parseInt(sNumerator) >= parseInt(sDenominator)) {
                
                    alert("There was a problem converting the inches portion of the length to a decimal.  The fraction parsed as an improper fraction which isn't valid.  Please review your entry.");
                    return sErr;
                
                } else {
                
                    var fFraction = parseInt(sNumerator) / parseInt(sDenominator);
                    if(fFraction == 0) {
                    
                        alert("There was a problem converting the inches portio of the length to a decimal.  The fraction calculated at a 0 value.  Please review your entry.");
                        return sErr;
                    
                    }
                
                }
            
            }
        
        } else if(sLength.indexOf(" ") > -1 && sLength.indexOf("/") > -1) {
        
            /*whole number and fraction*/
            var iStart = sLength.indexOf("-") + 1;
            var iEnd = sLength.indexOf(" ");
            sWholenumber = sLength.substring(iStart, iEnd);
            fWholenumber = parseFloat(sWholenumber);
            
            iStart = sLength.indexOf(" ") + 1;
            iEnd = sLength.indexOf("/");
            sNumerator = sLength.substring(iStart, iEnd);
            
            sDenominator = sLength.substring(iEnd + 1, iStop);
            if(parseInt(sDenominator) == 0 || isNaN(parseInt(sDenominator))) {
            
                alert("There was a problem converting the inches portion of the length to a decimal.  The denominator parsed at a 0 value.  Please review your entry.");
                return sErr;
            
            } else {
            
                if(parseInt(sNumerator) >= parseInt(sDenominator)) {
                
                    alert("There was a problem converting the inches portion of the length to a decimal.  The fraction parsed as an improper fraction which isn't valid.  Please review your entry.");
                    return sErr;
                
                } else {
                
                    var fFraction = parseInt(sNumerator) / parseInt(sDenominator);
                    if(fFraction == 0) {
                    
                        alert("There was a problem converting the inches portio of the length to a decimal.  The fraction calculated at a 0 value.  Please review your entry.");
                        return sErr;
                    
                    }
                
                }
            
            }
        
        } else {
        
            /* invalid*/
            alert("There was an unknown problem converting the inches portion of the length to a decimal.  Please review your entry.");
            return sErr;
        
        }
    }
    
    var totalInch = (12 * parseInt(sFeet)) +  parseInt(sWholenumber) + fFraction;
    return (totalInch);
    
    
}
