TextField validator: email, IP address and URL : Validation « Form Control « JavaScript DHTML






TextField validator: email, IP address and URL


<HTML>
<HEAD>
<TITLE>jaxWidgets by Sarat Pediredla</TITLE>


<STYLE type=text/css>
BODY {
  FONT-SIZE: 0.9em; FONT-FAMILY: Arial, serif
}
A {
  TEXT-DECORATION: none
}
CODE {
  CLEAR: both; DISPLAY: block; FONT-SIZE: 0.9em; FONT-FAMILY: "Courier New", arial, serif; BACKGROUND-COLOR: #00ffcc
}
highlight {
  BACKGROUND-COLOR: #ffff99
}
.header {
  PADDING-RIGHT: 15px; PADDING-LEFT: 10px; FONT-WEIGHT: normal; FONT-SIZE: 2.5em; PADDING-BOTTOM: 15px; MARGIN: 0px; PADDING-TOP: 1px; LETTER-SPACING: -0.05em
}
.header SPAN {
  FONT-SIZE: 0.5em; FONT-FAMILY: Arial, serif; LETTER-SPACING: 0px
}
.toolheader {
  MARGIN: 5px 10px; COLOR: #000000; BORDER-BOTTOM: #69c 2px solid; FONT-FAMILY: arial, serif
}
.layer {
  CLEAR: both; BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 1em; BORDER-TOP: #ccc 1px solid; PADDING-LEFT: 1em; BACKGROUND: #fff; PADDING-BOTTOM: 0.5em; MARGIN: 15px 5%; OVERFLOW: auto; BORDER-LEFT: #ccc 1px solid; PADDING-TOP: 0.5em; BORDER-BOTTOM: #ccc 1px solid
}
.input {
  BORDER-RIGHT: #ff0000 1px solid; BORDER-TOP: #ff0000 1px solid; OVERFLOW: auto; BORDER-LEFT: #ff0000 1px solid; BORDER-BOTTOM: #ff0000 1px solid
}
.button {
  BORDER-RIGHT: #cccccc 1px ridge; PADDING-RIGHT: 2px; BORDER-TOP: #cccccc 1px ridge; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; BORDER-LEFT: #cccccc 1px ridge; PADDING-TOP: 2px; BORDER-BOTTOM: #cccccc 1px ridge; FONT-FAMILY: serif
}
.note {
  FONT-SIZE: 0.8em
}
detailHeader {
  FONT-WEIGHT: bold
}
detailContent {
  CLEAR: left; DISPLAY: block
}
#mainmenu {
  PADDING-RIGHT: 0.2em; PADDING-LEFT: 0.2em; BACKGROUND: #fff; PADDING-BOTTOM: 0.2em; MARGIN: 0px; PADDING-TOP: 0.2em; BORDER-BOTTOM: #707070 2px solid
}
#mainmenu A {
  BORDER-RIGHT: #fff 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #fff 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: normal; FONT-SIZE: 16px; PADDING-BOTTOM: 3px; MARGIN: 0px; BORDER-LEFT: #fff 1px solid; COLOR: #333; PADDING-TOP: 3px; BORDER-BOTTOM: #fff 1px solid; TEXT-DECORATION: none
}
#mainmenu A:hover {
  BORDER-RIGHT: #9d9d9d 1px solid; BORDER-TOP: #9d9d9d 1px solid; BACKGROUND: #ccc; BORDER-LEFT: #9d9d9d 1px solid; COLOR: #171717; BORDER-BOTTOM: #9d9d9d 1px solid
}
#mainmenu LI {
  DISPLAY: inline; LINE-HEIGHT: 200%; LIST-STYLE-TYPE: none; TEXT-ALIGN: center
}
.testClass {
  CLEAR: left; DISPLAY: block; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: red; FONT-FAMILY: Arial, Helvetica, sans-serif
}

</STYLE>
<!-- jaxWidgets_RuntimeEngine.js -->
<SCRIPT language=javascript type="text/javascript">
/*
* This notice must be untouched at all times.

============= META ==================
@name : jaxWidgets_RuntimeEngine.js  
@version : 0.10 
@copyright (c) 2005 Sarat Pediredla. All rights reserved.
@last-modified: 14/06/2005
@url : http://sarat.xcelens.co.uk/jaxWidgets
@latest-version-url : http://sarat.xcelens.co.uk/jaxWidgets/latest/
======================================

============== DESCRIPTION =============
The Runtime Engine to register and process widgets
=========================================

============= FEATURES ==================
- Dynamically loads and parses jaxWidgets
- i18n support for strings
============================================

============= FUTURE PLANS ==================

==============================================

LICENSE: LGPL

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License (LGPL) as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

For more details on the GNU Lesser General Public License,
see http://www.gnu.org/copyleft/lesser.html
*/
// Define namespace
if (typeof jaxWidgets != "object") { var jaxWidgets = {}; }

// Register namespace and object
jaxWidgets.RuntimeEngine = function()
{
  var registeredWidgets = new Array();
  var totalWidgets = -1;
  var loadedWidgets = new Array();
  var currentWidgets = new Array();
  
  this.registerWidget = function(tag, handler)
  {
    var newWidget = new Array(tag, handler);
    registeredWidgets[++totalWidgets] = newWidget;
  };
  
  this.loadEngine = function()
  {
    // Load library component
    _Library = new jaxWidgets.Library();        
    for(var i=0; i <= totalWidgets; i++)
    {
      currentWidgets = document.getElementsByTagName("jax:"+registeredWidgets[i][0]);
      for(var j =0; j < currentWidgets.length; j++)
      {
        registeredWidgets[i][1].load(currentWidgets[j]);
      }
      
      _Library.cleanup(currentWidgets);
    }    
  };
  
  /*
  Debug function for testing purposes only 
  You NEED to create a div with id=debug in your page for this to work
  */
  this.writeDebug = function(string)
  {
    document.getElementById("debug").innerHTML += string + "<br>";
  };
  
  /*
  Error Log function. Can be disabled through setErrors(false)
  */
  this.writeError = function(string)
  {
    if(document.getElementById("jaxErrorLogDiv"))
    {
      document.getElementById("jaxErrorLogDiv").innerHTML += string + "<br>";
    }
    else
    {
      var logDiv = document.createElement("div");
      logDiv.setAttribute("id","jaxErrorLogDiv");
      logDiv.style.color = "red";
      logDiv.style.fontSize = "0.9em";
      logDiv.style.fontWeight = "bold";
      var bodyTag = document.getElementsByTagName("body")[0];
      bodyTag.insertBefore(logDiv,bodyTag.firstChild);
      logDiv.innerHTML = "jax Error : ";
      logDiv.innerHTML += string + "<br>";
    }
  };
      
}

// Register event handlers
// Use quirksmode idea for flexible registration by copying existing events
// onKeyUp
/******* Define GLOBAL Constants *********/
var _Engine;              // The jax Runtime Engine
var _Library;             // The jax Runtime library

_Engine = new jaxWidgets.RuntimeEngine();
var oldEventCode = (window.onload) ? elm.onload : function () {};
window.onload = function () {oldEventCode(); _Engine.loadEngine();};

</SCRIPT>

<!-- jaxWidgets_Library.js -->
<SCRIPT language=javascript type="text/javascript">
/*
* This notice must be untouched at all times.

============= META ==================
@name : jaxWidgets_Library.js  
@version : 0.10 
@copyright (c) 2005 Sarat Pediredla. All rights reserved.
@last-modified: 14/06/2005
@url : http://sarat.xcelens.co.uk/jaxWidgets
@latest-version-url : http://sarat.xcelens.co.uk/jaxWidgets/latest/
======================================

============== DESCRIPTION =============
The Library is a repository for common functions used by jaxWidgets
=========================================

============= FEATURES ==================
- Sets Style of elements
============================================

============= CHANGELOG ==================
17 June 2005 [17:46] [Sarat Pediredla]
- Modified code to replace getAttribute().toLowerCase() with tmpString
  because strangely IE 6.0 wont support it.
18 June 2005 [08:45] [Sarat Pediredla]
- Added functions to get X & Y position of elements.
- Modified style setters to use element.style.cssText
==========================================

LICENSE: LGPL

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License (LGPL) as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

For more details on the GNU Lesser General Public License,
see http://www.gnu.org/copyleft/lesser.html
*/

// The following array IS NEEDED for widgets wishing to lock submitting forms
var submitLockedBy = new Array();

// Register object
jaxWidgets.Library = function()
{
  // Cleanup function to remove jax XML tags
  this.cleanup = function(array)
  {
    var arraylength = array.length;
    for(var i=0; i < arraylength; i++)
    {
      var element = array[0];
      element.parentNode.removeChild(element);
    }
    return true;
  }
  
  // Gets the index of an element in an array
  this.getIndex = function(element,array)
  {
    for(var i=0; i < array.length; i++)
    {
      if(array[i] == element)
        return i;
    }
  }
  // Sets the CSS style from source to target element
  this.setStyle = function(sourceElement,targetElement)
  {
    if(sourceElement.getAttribute("style") && sourceElement.getAttribute("style").length > 0)
    {
      targetElement.style.cssText = sourceElement.getAttribute("style");
      return;
    }
    if(sourceElement.getAttribute("class") && sourceElement.getAttribute("class").length > 0)    
    {      
      targetElement.setAttribute("className",sourceElement.getAttribute("class"));
      targetElement.setAttribute("class",sourceElement.getAttribute("class"));
      return;
    }
  }
  
  // Returns parent form of a given element
  this.getParentForm = function(element)
  {
    for(var i=0;i < document.forms.length; i++)
    {
      if(document.forms[i][element.id] == element)
        return document.forms[i];
    }
    _Engine.writeError("jax Error : Your elements are not embedded inside a form");
    return null;
  }
  
  // Returns the submit button for a given form
  this.getSubmitElement = function(currentForm)
  {
    for(i=0;i<currentForm.length;i++)
    {
      var currentElement = currentForm.elements[i];
      var tmpString = currentElement.type;
      if(tmpString.toString().toLowerCase() == "submit")
        return currentElement;
    }
  }
  
  // Disables submitting of forms when fields not validated
  this.disableSubmit = function(element)
  {    
    form = this.getParentForm(element);
    var btnSubmit = this.getSubmitElement(form);    
    if(btnSubmit)
      btnSubmit.disabled = true;
  }
  
  this.enableSubmit = function(element)
  {    
    form = this.getParentForm(element);
    var btnSubmit = this.getSubmitElement(form);
    if(btnSubmit)
      btnSubmit.disabled = false;
  }
  
  this.lockSubmit = function(id)
  {
    var index = _Library.getIndex(id,submitLockedBy)
    if(!(index >= 0))
    {
      submitLockedBy.push(id);    
    }  
    _Library.disableSubmit(document.getElementById(id));
  }
  
  this.unlockSubmit = function(id)
  {
    var index = _Library.getIndex(id, submitLockedBy);
    if(index > -1)
    {
      submitLockedBy.pop(index);
      if(_Library.noSubmitLocks())
        _Library.enableSubmit(document.getElementById(id));
    }
  }
    
  this.noSubmitLocks = function()
  {
    if(submitLockedBy.length <= 0)
      return true;
    return false;
  }
  
  this.getXPos = function(element)
  {
      xPos = element.offsetLeft;
      tempEl = element.offsetParent;
        while (tempEl != null) 
      {
        xPos += (tempEl.offsetLeft);
          tempEl = tempEl.offsetParent;
        }
      return xPos;
  }
  
  this.getYPos = function(element)
  {    
      yPos = element.offsetTop;
      tempEl = element.offsetParent;
        while (tempEl != null) 
      {
        yPos += tempEl.offsetTop;
          tempEl = tempEl.offsetParent;
        }
      return yPos;    
  }
          
}
  
</SCRIPT>

<!-- jaxWidgets_Validator.js -->
<SCRIPT language=javascript type="text/javascript">
/*
* This notice must be untouched at all times.

============= META ==================
@name : jaxWidgets_Validator.js  
@version : 0.10 
@copyright (c) 2005 Sarat Pediredla. All rights reserved.
@last-modified: 27/06/2005
@url : http://sarat.xcelens.co.uk/jaxWidgets
@latest-version-url : http://sarat.xcelens.co.uk/jaxWidgets/latest/
======================================

============== DESCRIPTION =============
The validator widget is a part of the jaxWidgets library. It provides
dynamic in-page validation of common fields.
=========================================

============= FEATURES ==================
- Uses jaxXML markup tags to specify designer friendly tags in HTML (.NET style)
- i18n support for strings
- Customisable UI
- Use on any number of fields
- Validates most common formats
============================================

============= CHANGELOG ==================

==========================================

LICENSE: LGPL

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License (LGPL) as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

For more details on the GNU Lesser General Public License,
see http://www.gnu.org/copyleft/lesser.html
*/

// Register object
jaxWidgets.Validator = function()
{
  // Validation settings
  var isRequired = "false";
  
  // Common regexs
  var regexEmail = /^([\w]+)(.[\w]+)*@([\w]+)(.[\w]{2,3}){1,2}$/;
  var regexUrl = /^(http:\/\/www.|https:\/\/www.|ftp:\/\/www.|www.){1}([\w]+)(.[\w]+){1,2}$/;
  var regexDate = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
  var regexTime = /^([1-9]|1[0-2]):[0-5]\d$/;
  var regexIP = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
  var regexInteger = /(^-?\d\d*$)/;       
  
  // United states specific regexs
  var regexPostcode_US = /\d{5}(-\d{4})?/;
  var regexSSN_US = /\d{3}-\d{2}-\d{4}/;   
  var regexPhone_US = /^\(?\d{3}\)?\s|-\d{3}-\d{4}$/;
  var regexState_US = /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i;
  
  // United Kingdom specific regexs
  var regexPostcode_UK = /^([A-Za-z]{1,2})([0-9]{2,3})([A-Za-z]{2})$/;   
  
  // i18n settings
  var strLocale = "US";  
  var strType = "String";
  var strRequired = "Required";
  var strInvalid = "Invalid format";

  // Internal global vars
  var tmpString;
  
  // Create validator
  this.load = function(element)
  {
    if(!element)
    {
      _Engine.writeError('jax Error: Validator cannot load');
      return;
    }
    
    var fieldElement = document.getElementById(element.getAttribute("ControlToValidate"));
    if(!fieldElement)
    {
      _Engine.writeError('jax Error: Validator is missing a ControlToValidate attribute');
      return;
    }    
    
    // Create validator layer
    var validatorElement = document.createElement("span");
    validatorElement.setAttribute("id",fieldElement.id+"_valid");
    
    element.parentNode.insertBefore(validatorElement,element.nextSibling);
    
    // Standard function to parse the custom jax tag
    this.parseTag(element,validatorElement);    
    
    // Create style for current element using DOM compatible function from Library
    _Library.setStyle(element, validatorElement);
    
    tmpString = validatorElement.getAttribute("isRequired")
    if(tmpString.toString().toLowerCase() == "true")
    {
      _Validator.validate(fieldElement.id);
    }
    
    // Register event handlers
    // Use quirksmode idea for flexible registration by copying existing events
    // onSubmit
    var parentForm = _Library.getParentForm(fieldElement);
    var oldEventCode = (parentForm.onsubmit) ? parentForm.onsubmit : function () {};
    parentForm.onsubmit = function () {oldEventCode(); return _Validator.validate(fieldElement.id)};    
    // onBlue
    var oldEventCode = (fieldElement.onblur) ? fieldElement.onblur : function () {};
    fieldElement.onblur = function () {oldEventCode(); return _Validator.validate(fieldElement.id)};
  };
  
  this.setInvalid = function(div)
  {
    div.innerHTML = div.getAttribute("strInvalid");
  };
  
  this.validate = function(id)
  {    
      var element;
    if(!(element = document.getElementById(id)))
    {
      return false;
    }
    var validDiv = document.getElementById(id+"_valid");
    var validString = element.value;    
    if(validString.length == 0)
    {
      tmpString = validDiv.getAttribute("isRequired");
      var isRequired = tmpString.toString().toLowerCase();
      if(isRequired == "true")
      {
        validDiv.innerHTML = validDiv.getAttribute("strRequired");
        return false;
      }
      else
      {
        validDiv.innerHTML = "";
      }      
    }
    
    // If we have reached here, we can continue with validation
    var tmpLocale = validDiv.getAttribute("strLocale");
    switch(validDiv.getAttribute("strType"))
    {
      case "String" : 
        return true;
        break;
      
      case "Email" :  
        if(!validString.match(regexEmail))
          { this.setInvalid(validDiv); return false; }
        break;
      
      case "Url" :  
        if(!validString.match(regexUrl))
          { this.setInvalid(validDiv); return false; }
        break;
      
      case "Date" :  
        if(!validString.match(regexDate))
          { this.setInvalid(validDiv); return false; }
        break;
      
      case "Time" :  
        if(!validString.match(regexTime))
          { this.setInvalid(validDiv); return false; }
        break;
      
      case "IP" :  
        if(!validString.match(regexIP))
          { this.setInvalid(validDiv); return false; }
        break;
      
      case "Integer" :  
        if(!validString.match(regexInteger))
          { this.setInvalid(validDiv); return false; }
        break;
      
      case "Postcode" :
        switch(tmpLocale)
        {
          case "US" :  
            if(!validString.match(regexPostcode_US))
              { this.setInvalid(validDiv); return false; }
            break;
          case "Email" :  
            if(!validString.match(regexPostcode_UK))
              { this.setInvalid(validDiv); return false; }
            break;
        }
        break;
      
      // No need to check locale for SSN as it is US specific
      case "SSN" :  
        if(!validString.match(regexSSN_US))
          { this.setInvalid(validDiv); return false; }
        break;
      
      case "Phone" :  
        switch(tmpLocale)
        {
          case "US" :  
            if(!validString.match(regexPhone_US))
              { this.setInvalid(validDiv); return false; }
            break;                              
        }
        break;
      
      // Only US States work for now
      case "State" :  
        switch(tmpLocale)
        {
          case "Email" :  
            if(!validString.match(regexState_US))
              { this.setInvalid(validDiv); return false; }
            break;
        }
        break;                                      
        
      // Do custom validation
      case "Custom" :
        if(!validString.match(validDiv.getAttribute("Match")))
          { this.setInvalid(validDiv); return false; }
        break;
    }
    
    // If we have reached here, everything is OK    
    validDiv.innerHTML = "";
    return true;
  };    
  
  /********* Custom tag parser **********/
  this.parseTag = function(element,validatorElement)
  {          
      if(element.getAttribute("Required"))
      validatorElement.setAttribute("isRequired",element.getAttribute("Required"));
    else
      validatorElement.setAttribute("isRequired",isRequired);
            
    if(element.getAttribute("TextRequired"))
      validatorElement.setAttribute("strRequired",element.getAttribute("TextRequired"));
    else
      validatorElement.setAttribute("strRequired",strRequired);    
      
    if(element.getAttribute("TextInvalid"))
      validatorElement.setAttribute("strInvalid",element.getAttribute("TextInvalid"));
    else
      validatorElement.setAttribute("strInvalid",strInvalid);
      
    if(element.getAttribute("Type"))
      validatorElement.setAttribute("strType", element.getAttribute("Type"));
    else
      validatorElement.setAttribute("strType", strType);
    
    if(element.getAttribute("Locale"))
      validatorElement.setAttribute("strLocale", element.getAttribute("Locale"));
    else
      validatorElement.setAttribute("strLocale", strLocale);
    
    if(element.getAttribute("Match"))
      validatorElement.setAttribute("strCustom", element.getAttribute("Match"));1
  };      
  
  this.registerWithEngine = function(_Validator)
  {
    var tag = "Validator";
    var handler = _Validator;
    _Engine.registerWidget(tag, handler);
  };
}
  
var _Validator = new jaxWidgets.Validator();
_Validator.registerWithEngine(_Validator);



</SCRIPT>


<BODY>
<H2>Demo</H2>
<DIV class=layer id=jaxDetail>This is a demo for jax Validators <BR><BR>
<FORM id=testForm name=form method=post>IP Address : 
   <INPUT id=ip>
      <JAX:VALIDATOR class=testClass Required="true" Type="IP" ControlToValidate="ip">
      </JAX:VALIDATOR> 
      <BR>Email: 
      <INPUT id=email>
      <JAX:VALIDATOR class=testClass Required="true" Type="Email" ControlToValidate="email" TextRequired="Cant be empty">
      </JAX:VALIDATOR> 
      <BR>URL : 
      <INPUT id=url>
      <JAX:VALIDATOR class=testClass Type="Url" ControlToValidate="url" TextInvalid="Need website">
      </JAX:VALIDATOR> 
      <BR>
   <INPUT id=submitbtn type=submit value=submit> 
</FORM>
</BODY>
</HTML>

           
       








Related examples in the same category

1.Form validation: Not Empty, Valid Radio, is Number, string length, EMail Address
2.Validate an input field with minimum and maximum values
3.Validate an field with a maximum number of characters
4.Phone Number Validation
5.Creating Reusable Validation Code
6.Credit Card Validation
7.Money Format
8.Validating User Input
9.Validate email address
10.Validate a number
11.TextField input length validator
12.Password field validator
13.Must be at least 3 characters and not more than 8
14.Only characters are allowed
15.Can be empty
16.Must be a valid email address
17.ComboBox(list box): Must be selected one
18.InputBox: value must be between 10 and 90
19.Not stop when the first failed validation is encountered
20.A CSS is used to highlight the fields which failed to validate
21.Need to select a file
22.A simple form with two passwords that must have the same value
23.Shows the usage of callback functions for checking a field
24.Javascript validation framework
25.Form validator library