home *** CD-ROM | disk | FTP | other *** search
/ ftp.tcs3.com / ftp.tcs3.com.tar / ftp.tcs3.com / DRIVERS / Audio / Office2010 / ProPlus.WW / ProPsWW.cab / VALIDATION.JS4 < prev    next >
Text File  |  2007-02-04  |  26KB  |  820 lines

  1. /*********************************************************************
  2.                                  Notice
  3.  
  4. You may not modify, use, copy or distribute this file or its contents. 
  5. Internal interfaces referenced in this file are nonpublic, unsupported 
  6. and subject to change without notice. These interfaces may not be 
  7. utilized in other software applications or components.
  8.  
  9.  
  10. *********************************************************************/
  11.  
  12. // Global arrays used by the validation and formatting functions.
  13. var g_arrMonth = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
  14. var g_arrDay = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
  15. var g_arrErrors = new Array();
  16.  
  17. // =============================VALIDATION===============================
  18. // === the following functions apply to validating the entered values ===
  19. // === according to the rules set up when the form was created        ===
  20. // ======================================================================
  21.  
  22. function validateRequiredRichText(i_FieldName)
  23. {
  24.     var objRichText = document.getElementById(i_FieldName);
  25.     if (objRichText != null)
  26.         validateRequired(objRichText);
  27. }
  28.  
  29. // === validateRequired(object, string) =========================
  30. // called for input types that may be required, displays an error
  31. // if the value is blank
  32. function validateRequired(i_objInput)
  33. {
  34.     if (!g_IsSearch)
  35.     {
  36.         var strRequired = i_objInput.getAttribute("ISREQUIRED");
  37.         if (strRequired != null)
  38.         {
  39.             var blnClear = true;
  40.             var strValue = "";
  41.  
  42.             if (i_objInput.tagName == "OBJECT")
  43.             {
  44.                 strValue = i_objInput.IGrooveTextContent.PlainText;
  45.                 strValue = strValue.replace(/[\r\n]/g, "");
  46.             }
  47.             else if (i_objInput.tagName == "SPAN")
  48.             {
  49.                 strValue = i_objInput.getAttribute("CONTACTURL");
  50.                 if (strValue == null)
  51.                     strValue = "";
  52.             }
  53.             else if (i_objInput.type == "radio")
  54.             {
  55.                 var DocumentForm = document.GrooveFormBase;
  56.                 var RadioGroup = DocumentForm.elements[i_objInput.id];
  57.                 for (var i = 0; i < RadioGroup.length; i++)
  58.                 {
  59.                     if (RadioGroup[i].checked)
  60.                     {
  61.                         strValue = RadioGroup[i].value;
  62.                         break;
  63.                     }
  64.                 }
  65.             }
  66.             else if (i_objInput.type == "checkbox")
  67.             {
  68.                 if (i_objInput.checked)
  69.                     strValue = "true";
  70.             }
  71.             else
  72.                 strValue = i_objInput.value;
  73.  
  74.             if (strValue.trim() == "")
  75.             {
  76.                 // Hidden fields should never be required.
  77.                 if (i_objInput.style.display != "none" && i_objInput.parentElement.style.display != "none")
  78.                 {
  79.                     displayError("This field is required and must have a value.", i_objInput, "Required");
  80.                     blnClear = false;
  81.                 }
  82.             }
  83.  
  84.             if (blnClear)
  85.                 clearError(i_objInput, "Required");
  86.         }
  87.     }
  88. }
  89.  
  90. // === validateNumeric(object) ==================================
  91. // called for numeric input types, displays an error if it is not
  92. // a number, or does not conform to min/max rules
  93. function validateNumeric(i_objInput)
  94. {
  95.     var blnClear = true;
  96.  
  97.     var strNumeric = i_objInput.value;
  98.     if (strNumeric == "")
  99.         var intNumeric = Number.NaN;
  100.     else
  101.         var intNumeric = getValidNumber(i_objInput);
  102.  
  103.     if ((strNumeric != "" || i_objInput.value != "") && isNaN(intNumeric))
  104.         displayError("The value for this field must be a valid number.", i_objInput, "InvalidNumeric");
  105.     else
  106.         clearError(i_objInput, "InvalidNumeric");
  107.  
  108.     var strMin = i_objInput.getAttribute("MIN");
  109.     var strMax = i_objInput.getAttribute("MAX");
  110.  
  111.     var intMin = parseFloat(strMin);
  112.     var intMax = parseFloat(strMax);
  113.  
  114.     if (strMin != null && strMin != "" && intNumeric < intMin)
  115.     {
  116.         displayError("The lowest allowable value for this field is " + strMin + ".", i_objInput, "Numeric");
  117.         blnClear = false;
  118.     }
  119.     if (strMax != null && strMax != "" && intNumeric > intMax)
  120.     {
  121.         displayError("The highest allowable value for this field is " + strMax + ".", i_objInput, "Numeric");
  122.         blnClear = false;
  123.     }
  124.  
  125.     if (blnClear)
  126.         clearError(i_objInput, "Numeric");
  127.  
  128.     return blnClear;
  129. }
  130.  
  131. // === validateDate(object) ====================================
  132. // called for date types, displays an error if it is not a valid
  133. // date, or does not conform to min/max rules
  134. function validateDate(i_objInput)
  135. {
  136.     var blnBlankErr = false;
  137.     var blnNaNErr = false;
  138.     var blnMinErr = false;
  139.     var blnMaxErr = false;
  140.  
  141.     var strFormat = i_objInput.getAttribute("FORMAT");
  142.     var strFieldType = i_objInput.getAttribute("FIELDTYPE");
  143.     var intDateFormat = getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").CreateDateFormatStyleFromAttributeValue(strFormat);
  144.  
  145.     var strInput = i_objInput.value;
  146.     var intInput = getValidDateMillis(strInput, intDateFormat, i_objInput);
  147.     if (strInput != "" && isNaN(intInput))
  148.     {
  149.         blnNaNErr = true;
  150.         var strNow = "";
  151.         var intNow = new Date().valueOf();
  152.         if (strFieldType == FormObjectType_DateTime)
  153.             strNow = getScriptHostQI("IGrooveFormsToolUIDelegate").FormatDateTime(intNow, intDateFormat, 3);
  154.         else
  155.             strNow = getScriptHostQI("IGrooveFormsToolUIDelegate").FormatDate(intNow, intDateFormat)
  156.         displayError("The value for this field must be a valid date in this format: " + strNow + ". You may also use the date picker to select a date.", i_objInput, "InvalidDate");
  157.     }
  158.     else if (strInput == "")
  159.     {
  160.         blnBlankErr = true;
  161.         clearError(i_objInput, "InvalidDate");
  162.     }
  163.     else
  164.         clearError(i_objInput, "InvalidDate");
  165.  
  166.     var strMin = i_objInput.getAttribute("MIN");
  167.     var strMax = i_objInput.getAttribute("MAX");
  168.  
  169.     var strMinDate = "";
  170.     var strMaxDate = "";
  171.     if (strMin != null && strMin != "" && strMin != INVALID_DATE)
  172.     {
  173.         if (strFieldType == FormObjectType_DateTime)
  174.             strMinDate = getScriptHostQI("IGrooveFormsToolUIDelegate").FormatDateTime(strMin, 3, 3);
  175.         else
  176.             strMinDate = getScriptHostQI("IGrooveFormsToolUIDelegate").FormatDate(strMin, 3);
  177.     }
  178.     if (strMax != null && strMax != "" && strMax != INVALID_DATE)
  179.     {
  180.         if (strFieldType == FormObjectType_DateTime)
  181.             strMaxDate = getScriptHostQI("IGrooveFormsToolUIDelegate").FormatDateTime(strMax, 3, 3);
  182.         else
  183.             strMaxDate = getScriptHostQI("IGrooveFormsToolUIDelegate").FormatDate(strMax, 3);
  184.     }
  185.  
  186.     // Min and max values are passed in as milliseconds.
  187.     var intMin = parseInt(strMin);
  188.     var intMax = parseInt(strMax);
  189.  
  190.     if (strMin != null && strMin != "" && strMin != INVALID_DATE && !isNaN(intMin) && intInput < intMin)
  191.         blnMinErr = true;
  192.     if (strMax != null && strMax != "" && strMax != INVALID_DATE && !isNaN(intMax) && intInput > intMax)
  193.         blnMaxErr = true;
  194.  
  195.     if (strMin != INVALID_DATE && strMax != INVALID_DATE && !isNaN(intMin) && !isNaN(intMax) && strInput != "" && (blnMinErr || blnMaxErr))
  196.         displayError("The value for this field must be a date between " + strMinDate + " and " + strMaxDate + ".", i_objInput, "Date");
  197.     else if (strInput != "" && blnMinErr)
  198.         displayError("The value for this field must be a date on, or later than, " + strMinDate + ".", i_objInput, "Date");
  199.     else if (strInput != "" && blnMaxErr)
  200.         displayError("The value for this field must be a date on, or earlier than, " + strMaxDate + ".", i_objInput, "Date");
  201.  
  202.     if (!blnMinErr && !blnMaxErr)
  203.         clearError(i_objInput, "Date");
  204.  
  205.     return (!blnMinErr && !blnMaxErr && !blnBlankErr && !blnNaNErr);
  206. }
  207.  
  208.  
  209. // =======================VALIDATION=FORMATTING==========================
  210. // === the following functions apply to formatting the entered values ===
  211. // === according to the rules set up when the form was created        ===
  212. // ======================================================================
  213.  
  214. // === formatNumeric(object) ==========================================
  215. // formats the value of the numeric input according to formatting rules
  216. function formatNumeric(i_objInput)
  217. {
  218.     var StringValue = i_objInput.value;
  219.     if (StringValue != "")
  220.     {
  221.         NumericValue = getValidNumber(i_objInput);
  222.         if (!isNaN(NumericValue))
  223.             i_objInput.value = formatNumericValue(i_objInput, NumericValue);
  224.     }
  225. }
  226.  
  227. function formatNumericValue(i_objInput, i_Value)
  228. {
  229.     var FormatCancel = i_objInput.getAttribute("NOFORMAT");
  230.     if (FormatCancel == null)
  231.     {
  232.         if (!isNaN(i_Value) && i_Value != "")
  233.         {
  234.             var NumericPrecision = getFormatAttribute(i_objInput, "PRECISION", "2");
  235.             return getScriptHostQI("IGrooveFormsToolUIDelegate").FormatNumber(i_Value, NumericPrecision);
  236.         }
  237.     }
  238.     return i_Value;
  239. }
  240.  
  241. // === formatCurrency(object) ==========================================
  242. // formats the value of the currency input according to formatting rules
  243. function formatCurrency(i_objInput)
  244. {
  245.     var StringValue = i_objInput.value;
  246.     if (StringValue != "")
  247.     {
  248.         var CurrencyValue = getValidNumber(i_objInput);
  249.         if (!isNaN(CurrencyValue))
  250.             i_objInput.value = formatCurrencyValue(i_objInput, CurrencyValue);
  251.     }
  252. }
  253.  
  254. function formatCurrencyValue(i_objInput, i_Value)
  255. {
  256.     if (!isNaN(i_Value))
  257.     {
  258.         var CurrencyPrecision = getFormatAttribute(i_objInput, "PRECISION", "2");
  259.         var CurrencySymbol = getFormatAttribute(i_objInput, "SYMBOL", "$");
  260.         return getScriptHostQI("IGrooveFormsToolUIDelegate").FormatNumber(i_Value, CurrencyPrecision, CurrencySymbol);
  261.     }
  262.     return i_Value;
  263. }
  264.  
  265. // === formatDate(object) ==========================================
  266. // formats the value of the date input according to formatting rules
  267. function formatDate(i_objInput)
  268. {
  269.     var InputValue = i_objInput.value;
  270.     if (InputValue != "")
  271.     {
  272.         var strFormat = i_objInput.getAttribute("FORMAT");
  273.         var intDateFormat = getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").CreateDateFormatStyleFromAttributeValue(strFormat);
  274.         var DateValue = getValidDateMillis(InputValue, intDateFormat, i_objInput);
  275.         if (isNaN(DateValue))
  276.             DateValue = new Date().valueOf();
  277.  
  278.         var FieldTypeAttribute = i_objInput.getAttribute("FIELDTYPE");
  279.         if (FieldTypeAttribute == FormObjectType_DateTime)
  280.         {
  281.             var DateAndTimeEnum = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").FormatDateAndTime(DateValue, intDateFormat, 3);
  282.             if (DateAndTimeEnum.HasMore());
  283.                 i_objInput.value = DateAndTimeEnum.OpenNext();
  284.             var TimeObject = document.getElementById(i_objInput.id + "_Time");
  285.             if (TimeObject != null && DateAndTimeEnum.HasMore())
  286.                 TimeObject.value = DateAndTimeEnum.OpenNext();
  287.         }
  288.         else
  289.         {
  290.             DateValue = getScriptHostQI("IGrooveFormsToolUIDelegate").FormatDate(DateValue, intDateFormat);
  291.             i_objInput.value = DateValue;
  292.         }
  293.     }
  294. }
  295.  
  296.  
  297. // =======================VALIDATION=UTILITY===========================
  298. // === the following section contains utility functions used within ===
  299. // === this javascript file                                            ===
  300. // ====================================================================
  301.  
  302. // === cleanDate(object) ================================
  303. // cleans date objects that are passed in; no longer used
  304. function cleanDate(i_objInput)
  305. {
  306. }
  307.  
  308. function ErrorObject(i_Name, i_Message, i_FieldName)
  309. {
  310.     this.Name = "";
  311.     this.Message = "";
  312.     this.FieldName = "";
  313.  
  314.     if (arguments.length > 0)
  315.         this.initErrorObject(i_Name, i_Message, i_FieldName);
  316. }
  317.  
  318. ErrorObject.prototype.initErrorObject = function(i_Name, i_Message, i_FieldName)
  319. {
  320.     this.Name = i_Name;
  321.     this.Message = i_Message;
  322.     this.FieldName = i_FieldName;
  323. }
  324.  
  325. // === displayError(string, object, string) ==========================
  326. // displays the passed in string as an error message in the status bar
  327. function displayError(i_strError, i_objError, i_strName)
  328. {
  329.     if (!g_IsPreviewPane)
  330.     {
  331.         var strObjName = i_objError.id;
  332.         if (strObjName == "" || strObjName == null)
  333.             strObjName = i_objError.getAttribute("NAME");
  334.  
  335.         var strErrorName = i_strName + "_" + strObjName;
  336.  
  337.         // Add the error to the global array if not there already.
  338.         var blnErrorFound = false;
  339.         for (var i = 0; i < g_arrErrors.length; i++)
  340.         {
  341.             var objError = g_arrErrors[i];
  342.             if (objError.Name == i_strName && objError.FieldName == strObjName)
  343.             {
  344.                 blnErrorFound = true;
  345.                 break;
  346.             }
  347.         }
  348.         
  349.         if (!blnErrorFound)
  350.         {
  351.             var objError = new ErrorObject(i_strName, i_strError, strObjName);
  352.             g_arrErrors.push(objError);
  353.         }
  354.  
  355.         // Display the error icon and set the TITLE for tooltip.
  356.         showErrorIcon(strObjName, i_strError, true)
  357.     }
  358. }
  359.  
  360. // === clearError(object, string) ===================================
  361. // clears the error for the passed in object from the page and erases
  362. // it from the error array
  363. function clearError(i_objError, i_strName)
  364. {
  365.     var strObjName = i_objError.id;
  366.     if (strObjName == "" || strObjName == null)
  367.         strObjName = i_objError.getAttribute("NAME");
  368.  
  369.     // Remove the error name from the global array.
  370.     var arrErrors = new Array();
  371.     var strErrorName = i_strName + "_" + strObjName;
  372.     for (var i = 0; i < g_arrErrors.length; i++)
  373.     {
  374.         var strTempErrorName = g_arrErrors[i].Name + "_" + g_arrErrors[i].FieldName;
  375.         if (strTempErrorName != strErrorName)
  376.             arrErrors.push(g_arrErrors[i]);
  377.     }
  378.     g_arrErrors = arrErrors;
  379.  
  380.     showErrorIcon(strObjName, "", false);
  381.  
  382.     // If there are any more errors left for this field, display the first.
  383.     for (var i = 0; i < g_arrErrors.length; i++)
  384.     {
  385.         if (g_arrErrors[i].FieldName == strObjName)
  386.         {
  387.             showErrorIcon(strObjName, g_arrErrors[i].Message, true);
  388.             break;
  389.         }
  390.     }
  391. }
  392.  
  393. function showErrorIcon(i_strName, i_strError, i_blnShow)
  394. {
  395.     var objField = document.getElementById(i_strName);
  396.     var objImage = document.getElementById(i_strName + "_ErrorImage");
  397.     if (objField != null && objImage != null)
  398.     {
  399.         if (i_blnShow)
  400.         {
  401.             // Radio button fields have a SPAN tag at the end so we know where it is.
  402.             var FieldType = objField.type;
  403.             if (FieldType == "radio")
  404.             {
  405.                 objField = document.getElementById(i_strName + "_RadioEnd");
  406.                 if (objField == null)
  407.                     return;
  408.             }
  409.             // Get the coordinates for the field, so we know where to put the error image.
  410.             var intTop = getOffset(objField, "top");
  411.             var intLeft = getOffset(objField, "left");
  412.             var intHeight = objField.offsetHeight;
  413.             var intWidth = objField.offsetWidth;
  414.             // Get the left offset depending on the type of field.
  415.             var TopOffset = intTop + 4;
  416.             var LeftOffset = intLeft + intWidth - 16;
  417.             if (objField.tagName == "OBJECT")
  418.                 LeftOffset += 20;
  419.             else if (FieldType == "textarea")
  420.                 LeftOffset -= 16;
  421.             else if (FieldType == "radio")
  422.             {
  423.                 TopOffset -= 4;
  424.                 LeftOffset += 20;
  425.             }
  426.             else if (FieldType == "select-one" || FieldType == "select-multiple")
  427.             {
  428.                 LeftOffset += 20;
  429.                 var CustomAttribute = objField.getAttribute("CUSTOM");
  430.                 if (CustomAttribute != null)
  431.                     LeftOffset += 15;
  432.             }
  433.             else if (objField.tagName == "SPAN")
  434.             {
  435.                 TopOffset -= 4;
  436.                 if (objField.getAttribute("ISREADONLY") == null)
  437.                     LeftOffset += 45;
  438.                 else
  439.                     LeftOffset += 20;
  440.             }
  441.             // Set the top and left positions of the error image.
  442.             objImage.style.posTop = TopOffset;
  443.             objImage.style.posLeft = LeftOffset;
  444.             // Display the error image and set the tooltip text.
  445.             objImage.style.display = "inline";
  446.             objImage.title = i_strError;
  447.         }
  448.         else
  449.         {
  450.             objImage.style.display = "none";
  451.             objImage.title = "";
  452.         }
  453.     }
  454. }
  455.  
  456. // === getValidNumber(object) =========================================
  457. // get the numerical value from a number string, NaN if it is not valid
  458. function getValidNumber(i_objInput)
  459. {
  460.     try
  461.     {
  462.         var NumberString = i_objInput.value;
  463.         var CurrencySymbol = getFormatAttribute(i_objInput, "SYMBOL", "$");
  464.         if (CurrencySymbol != "")
  465.         {
  466.             var objRegExp = new RegExp("\\" + CurrencySymbol);
  467.             NumberString = NumberString.replace(objRegExp, "");
  468.         }
  469.  
  470.         var ValidNumber = getScriptHostQI("IGrooveFormsToolUIDelegate").ParseNumber(NumberString);
  471.         if (isNaN(ValidNumber))
  472.         {
  473.             ValidNumber = Number(NumberString);
  474.             if (isNaN(ValidNumber))
  475.                 ValidNumber = Number.NaN;
  476.         }
  477.     }
  478.     catch (error)
  479.     {
  480.         ValidNumber = Number.NaN;
  481.     }
  482.  
  483.     return ValidNumber;
  484. }
  485.  
  486. // === getValidDateMillis(string, string, object) =====================
  487. // get the millisecond value from a date string, NaN if it is not valid
  488. function getValidDateMillis(i_DateString, i_intFormat, i_objInput)
  489. {
  490.     var ValidDate = i_DateString;
  491.     if (ValidDate != "")
  492.     {
  493.         try
  494.         {
  495.             var FieldTypeAttribute = i_objInput.getAttribute("FIELDTYPE");
  496.             if (FieldTypeAttribute == FormObjectType_DateTime)
  497.             {
  498.                 var TimeString = "";
  499.                 var TimeObject = document.getElementById(i_objInput.id + "_Time");
  500.                 if (TimeObject != null)
  501.                     TimeString = TimeObject.value;
  502.  
  503.                 ValidDate = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").ParseDateAndTime(i_DateString, TimeString, i_intFormat, 3);
  504.             }
  505.             else
  506.                 ValidDate = getScriptHostQI("IGrooveFormsToolUIDelegate").ParseDate(i_DateString, i_intFormat);
  507.  
  508.             if (isNaN(ValidDate))
  509.             {
  510.                 ValidDate = new Date(i_DateString);
  511.                 if (isNaN(ValidDate))
  512.                     ValidDate = Number.NaN
  513.                 else if (i_DateString.search(/^\d{1,2}[\/|\-]\d{1,2}[\/|\-]\d{1,2}(\-|\/|$)/) == 0)
  514.                 {
  515.                     // Fix dates with only two digit years.
  516.                     var CurrentDate = new Date();
  517.                     var CutoffYear = CurrentDate.getFullYear() - 80;
  518.                     if (CutoffYear > ValidDate.getFullYear())
  519.                         ValidDate.setFullYear(ValidDate.getFullYear() + 100);
  520.                 }
  521.                 ValidDate = ValidDate.valueOf();
  522.             }
  523.         }
  524.         catch (error)
  525.         {
  526.             ValidDate = Number.NaN;
  527.         }
  528.     }
  529.     else
  530.         ValidDate = Number.NaN;
  531.  
  532.     return ValidDate;
  533. }
  534.  
  535. // === getFormatAttribute(object, string, string) =====================
  536. // utility function to retrieve attribute from the passed in object, it
  537. // returns the passed in default value if the attribute is not found
  538. function getFormatAttribute(i_Object, i_Attribute, i_Default)
  539. {
  540.     var FormatAttribute = i_Object.getAttribute(i_Attribute);
  541.     if (FormatAttribute == null || FormatAttribute == "")
  542.         FormatAttribute = i_Default;
  543.     return FormatAttribute
  544. }
  545.  
  546.  
  547. // =====================FIELD=VALIDATION=HELPERS===========================
  548. // === the following section contains field validation helper functions ===
  549. // === that can be set by the form designer                             ===
  550. // ========================================================================
  551.  
  552. function subStringTest(i_strSub, i_strValue)
  553. {
  554.     if (i_strValue.indexOf(i_strSub) >= 0)
  555.         return true;
  556.     else
  557.         return false;
  558. }
  559.  
  560. function subStringNotTest(i_strSub, i_strValue)
  561. {
  562.     return !subStringTest(i_strSub, i_strValue);
  563. }
  564.  
  565. function subStringsTest(i_strSubs, i_strValue, i_objFunction)
  566. {
  567.     if (typeof i_strSubs == "string")
  568.     {
  569.         return i_objFunction(i_strSubs, i_strValue);
  570.     }
  571.     else if (isArray(i_strSubs))
  572.     {
  573.         var Result = false;
  574.         for (var i = 0; i < i_strSubs.length; i++)
  575.         {
  576.             Result = i_objFunction(i_strSubs[i], i_strValue);
  577.             if (!Result)
  578.                 return false;
  579.         }
  580.         return true;
  581.     }
  582. }
  583.  
  584. function isArray(i_objArray)
  585. {
  586.     if (i_objArray.constructor.toString().indexOf("Array") >= 0)
  587.         return true;
  588.     else
  589.         return false;
  590. }
  591.  
  592. // =========================FIELD=VALIDATION=============================
  593. // === the following section contains field validation functions that ===
  594. // === can be set by the form designer                                ===
  595. // ======================================================================
  596.  
  597. function isSubStringPresent(i_strSub, i_objInput)
  598. {
  599.     var strValue = i_objInput.value;
  600.     if (strValue == "")
  601.         clearError(i_objInput, "isSubStringPresent");
  602.     else
  603.     {
  604.         var Result = subStringTest(i_strSub, strValue);
  605.         if (!Result)
  606.             displayError("This field must contain the string '" + i_strSub + "' in its value.", i_objInput, "isSubStringPresent");
  607.         else
  608.             clearError(i_objInput, "isSubStringPresent");
  609.     }
  610. }
  611.  
  612. function isSubStringNotPresent(i_strSub, i_objInput)
  613. {
  614.     var strValue = i_objInput.value;
  615.     if (strValue == "")
  616.         clearError(i_objInput, "isSubStringNotPresent");
  617.     else
  618.     {
  619.         var Result = !subStringTest(i_strSub, strValue);
  620.         if (!Result)
  621.             displayError("This field cannot contain the string '" + i_strSub + "' in its value.", i_objInput, "isSubStringNotPresent");
  622.         else
  623.             clearError(i_objInput, "isSubStringNotPresent");
  624. }
  625. }
  626.  
  627. function areAllSubStringsPresent(i_strSubs, i_objInput)
  628. {
  629.     var strValue = i_objInput.value;
  630.     if (strValue == "")
  631.         clearError(i_objInput, "areAllSubStringsPresent");
  632.     else
  633.     {
  634.         var arrSubs = i_strSubs.split(",");
  635.         var Result = subStringsTest(arrSubs, strValue, subStringTest);
  636.         if (!Result)
  637.             displayError("This field must contain all strings '" + arrSubs.join("', '") + "' in its value.", i_objInput, "areAllSubStringsPresent");
  638.         else
  639.             clearError(i_objInput, "areAllSubStringsPresent");
  640.     }
  641. }
  642.  
  643. function areAnySubStringsPresent(i_strSubs, i_objInput)
  644. {
  645.     var strValue = i_objInput.value;
  646.     if (strValue == "")
  647.         clearError(i_objInput, "areAnySubStringsPresent");
  648.     else
  649.     {
  650.         var arrSubs = i_strSubs.split(",");
  651.         var Result = false;
  652.         for (var i = 0; i < arrSubs.length; i++)
  653.         {
  654.             if (subStringTest(arrSubs[i], strValue))
  655.             {
  656.                 Result = true;
  657.                 break;
  658.             }
  659.         }
  660.  
  661.         if (!Result)
  662.             displayError("This field must contain at least one of these strings '" + arrSubs.join("', '") + "' in its value.", i_objInput, "areAnySubStringsPresent");
  663.         else
  664.             clearError(i_objInput, "areAnySubStringsPresent");
  665.     }
  666. }
  667.  
  668. function areNoSubStringsPresent(i_strSubs, i_objInput)
  669. {
  670.     var strValue = i_objInput.value;
  671.     if (strValue == "")
  672.         clearError(i_objInput, "areNoSubStringsPresent");
  673.     else
  674.     {
  675.         var arrSubs = i_strSubs.split(",");
  676.         var Result = subStringsTest(arrSubs, strValue, subStringNotTest);
  677.         if (!Result)
  678.             displayError("This field must not contain any of these strings '" + arrSubs.join("', '") + "' in its value.", i_objInput, "areNoSubStringsPresent");
  679.         else
  680.             clearError(i_objInput, "areNoSubStringsPresent");
  681.     }
  682. }
  683.  
  684. function isValidEmailAddress(i_objInput)
  685. {
  686.     var strEmail = i_objInput.value;
  687.     if (strEmail == "")
  688.         clearError(i_objInput, "isValidEmailAddress");
  689.     else
  690.     {
  691.         var objRegExp = /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,4}$/;
  692.         if (!objRegExp.test(strEmail))
  693.             displayError("This field must be a valid email address.", i_objInput, "isValidEmailAddress");
  694.         else
  695.             clearError(i_objInput, "isValidEmailAddress");
  696.     }
  697. }
  698.  
  699. function isValidUSZipCode(i_objInput)
  700. {
  701.     var strZipCode = i_objInput.value;
  702.     if (strZipCode == "")
  703.         clearError(i_objInput, "isValidUSZipCode");
  704.     else
  705.     {
  706.         var objRegExp = /^[\d]{5}$/;
  707.         var objRegExpExt = /^[\d]{5}\-[\d]{4}$/;
  708.         if (!objRegExp.test(strZipCode) && !objRegExpExt.test(strZipCode))
  709.             displayError("This field must be a valid US zip code.", i_objInput, "isValidUSZipCode");
  710.         else
  711.             clearError(i_objInput, "isValidUSZipCode");
  712.     }
  713. }
  714.  
  715. function isValidPassword(i_objInput)
  716. {
  717.     var strPassword = i_objInput.value;
  718.     if (strPassword == "")
  719.         clearError(i_objInput, "isValidPassword");
  720.     else
  721.     {
  722.         var objRegExpUpper = /[A-Z]/;
  723.         var objRegExpLower = /[a-z]/;
  724.         var objRegExpNumeric = /\d/;
  725.         if (strPassword.length < 8 || !objRegExpUpper.test(strPassword) || !objRegExpLower.test(strPassword) || !objRegExpNumeric.test(strPassword))
  726.             displayError("This field must be a valid password. It must be at least 8 characters long, containing at least one upper case character, one lower case character and one number.", i_objInput, "isValidPassword");
  727.         else
  728.             clearError(i_objInput, "isValidPassword");
  729.     }
  730. }
  731.  
  732. function isMinimumLength(i_strMin, i_objInput)
  733. {
  734.     var strValue = i_objInput.value;
  735.     if (strValue == "")
  736.         clearError(i_objInput, "isMinimumLength");
  737.     else
  738.     {
  739.         var intMin = parseInt(i_strMin);
  740.         if (!isNaN(intMin) && intMin > strValue.length)
  741.             displayError("This field must be at least " + i_strMin + " characters long.", i_objInput, "isMinimumLength");
  742.         else
  743.             clearError(i_objInput, "isMinimumLength");
  744.     }
  745. }
  746.  
  747. function isMaximumLength(i_strMax, i_objInput)
  748. {
  749.     var strValue = i_objInput.value;
  750.     if (strValue == "")
  751.         clearError(i_objInput, "isMaximumLength");
  752.     else
  753.     {
  754.         var intMax = parseInt(i_strMax);
  755.         if (!isNaN(intMax) && intMax < strValue.length)
  756.             displayError("This field must be no more than " + i_strMax + " characters long.", i_objInput, "isMaximumLength");
  757.         else
  758.             clearError(i_objInput, "isMaximumLength");
  759.     }
  760. }
  761.  
  762. function isAlpha(i_objInput)
  763. {
  764.     var strValue = i_objInput.value;
  765.     if (strValue == "")
  766.         clearError(i_objInput, "isAlpha");
  767.     else
  768.     {
  769.         var objRegIsAlpha = /^[a-zA-Z]*$/;
  770.         if (!objRegIsAlpha.test(strValue))
  771.             displayError("This field must contain only alphabetic characters.", i_objInput, "isAlpha");
  772.         else
  773.             clearError(i_objInput, "isAlpha");
  774.     }
  775. }
  776.  
  777. function hasAlpha(i_objInput)
  778. {
  779.     var strValue = i_objInput.value;
  780.     if (strValue == "")
  781.         clearError(i_objInput, "hasAlpha");
  782.     else
  783.     {
  784.         var objRegHasAlpha = /[a-zA-Z]/;
  785.         if (!objRegHasAlpha.test(strValue))
  786.             displayError("This field must contain one or more alphabetic characters.", i_objInput, "hasAlpha");
  787.         else
  788.             clearError(i_objInput, "hasAlpha");
  789.     }
  790. }
  791.  
  792. function isNumeric(i_objInput)
  793. {
  794.     var strValue = i_objInput.value;
  795.     if (strValue == "")
  796.         clearError(i_objInput, "isNumeric");
  797.     else
  798.     {
  799.         var objRegIsNumeric = /^\d*$/;
  800.         if (!objRegIsNumeric.test(strValue))
  801.             displayError("This field must contain only numeric characters.", i_objInput, "isNumeric");
  802.         else
  803.             clearError(i_objInput, "isNumeric");
  804.     }
  805. }
  806.  
  807. function hasNumeric(i_objInput)
  808. {
  809.     var strValue = i_objInput.value;
  810.     if (strValue == "")
  811.         clearError(i_objInput, "hasNumeric");
  812.     else
  813.     {
  814.         var objRegHasNumeric = /\d/;
  815.         if (!objRegHasNumeric.test(strValue))
  816.             displayError("This field must contain one or more numeric characters.", i_objInput, "hasNumeric");
  817.         else
  818.             clearError(i_objInput, "hasNumeric");
  819.     }
  820. }