function checkRule(element, rule)
{
    var rule = rule.split('|');
    var rulename = rule[0];
    
    switch (rulename)
    {
        case 'blank':
        return element.value.length > 0;
        break;
        
        case 'length':
        if(rule[1] > 0 && rule[2] > 0)
        {
            return element.value.length >= rule[1] && element.value.length <= rule[2];
        }
        else if(rule[1] > 0)
        {
            return element.value.length >= rule[1];
        }
        else return false;
        break;
        
        case 'email':
        var level = ( rule[1]==undefined ) ? 0: rule[1];
        var emailpatterns = [
                /.+@.+\..+$/i,
                /^\w.+@\w.+\.[a-z]+$/i,
                /^\w[-_a-z~.]+@\w[-_a-z~.]+\.[a-z]{2}[a-z]*$/i,
                /^\w[\w\d]+(\.[\w\d]+)*@\w[\w\d]+(\.[\w\d]+)*\.[a-z]{2,7}$/i
                ];
        return emailpatterns[level].test( element.value );
        break;
        
        case 'equalto':
        var otherElem = eval('document.'+formname+'.'+rule[1]);
        return element.value == otherElem.value;
        break;
        
        case 'number':
        var type = rule[1] == undefined ? 0 : rule[1];
        var num  = ( type == 0 ) ? parseInt( element.value, 10 ) : parseFloat( element.value );
        var fail = Boolean( isNaN( num ) || num != element.value );
        if(!fail)
        {
            switch(true)
            {
                case rule[2] != undefined && rule[2].length > 0 && rule[3] != undefined && rule[3].length > 0 : fail = !Boolean( rule[2] <= num && num <= rule[3] ); break;
                case rule[2] != undefined && rule[2].length > 0 : fail = Boolean( num < rule[2] ); break;
                case rule[3] != undefined && rule[3].length > 0 : fail = Boolean( num > rule[3] ); break;
            }
        }
        if( fail ) return false;
        else return true;
        break;
        
        case 'numeric':
        var len = rule[1] == undefined ? '*' : rule[1];
        var regex = new RegExp( ( len == '*' ) ? "^[0-9]+$" : "^[0-9]{" + parseInt( len, 10 ) + "}[0-9]*$" );
        return regex.test( element.value );
        break;
        
        case 'alnum':
        var len = rule[1] == undefined ? '*' : rule[1];
        var elmtcase = rule[2] == undefined ? 'A' : rule[2];
        var numbers = rule[3] == undefined ? 0 : rule[3];
        var spaces = rule[4] == undefined ? 0 : rule[4];
        var accents = rule[5] == undefined ? 0 : rule[5];
        var puncs = rule[6] == undefined ? '*' : rule[6];
        var okChars = '';
        switch( elmtcase.toUpperCase() )
        {
            case 'U':
                if(accents == true) okChars += 'A-Z¿»Ã“Ÿ¡…Õ”⁄›¬ Œ‘€√—’ƒÀœ÷‹≈∆«–ÿﬂ';
                else okChars += 'A-Z';
            break;
            case 'L':
                if(accents == true) okChars += 'a-z‡ËÏÚ˘·ÈÌÛ˙˝‚ÍÓÙ˚„Òı‰ÎÔˆ¸ˇÂÊÁ¯ﬂ';
                else okChars += 'a-z';
            break;
            case 'C':
                if(accents == true) okChars += 'A-Z¿»Ã“Ÿ¡…Õ”⁄›¬ Œ‘€√—’ƒÀœ÷‹≈∆«–ÿﬂ][a-z‡ËÏÚ˘·ÈÌÛ˙˝‚ÍÓÙ˚„Òı‰ÎÔˆ¸ˇÂÊÁ¯ﬂA-Z¿»Ã“Ÿ¡…Õ”⁄›¬ Œ‘€√—’ƒÀœ÷‹≈∆«–ÿ';
                else okChars += 'A-Z][a-z';
                len--;
            break;
            default:
                if(accents == true) okChars += 'a-z‡ËÏÚ˘·ÈÌÛ˙˝‚ÍÓÙ˚„Òı‰ÎÔˆ¸ˇÂÊÁ¯ﬂA-Z¿»Ã“Ÿ¡…Õ”⁄›¬ Œ‘€√—’ƒÀœ÷‹≈∆«–ÿﬂ';
                else okChars += 'a-zA-Z';
            break;
        }
        if( numbers == true ) okChars += "0-9";
        if( spaces == true ) okChars += " ";
        var length = ( len != "*" ) ? "{" + len + ",}" :  "+";
        if( puncs == '*' ) okChars += "!\"#$%&\'*+,-./:;=?@\\^_`|~";
        else if( puncs != false )
        {
            puncs = puncs.replace( "pipe", "|" );
            okChars += puncs;
        }
        
        var regex = new RegExp( "^[" + okChars + "]" + length + "$" );
        return regex.test( element.value );
        break;
        
        case 'decimal':
        var llen = rule[1] == undefined ? '*' :  rule[1];
        var rlen = rule[2] == undefined ? '*' :  rule[2];
        var regex = '';
        
        if(llen == '0' && rlen != '*') regex = "^\\.[0-9]{" + parseInt( rlen, 10 ) + "}$";
        else if ( llen == '*' && rlen == '*' ) regex = "^[0-9]+\\.[0-9]+$";
        else if ( llen == '*' ) regex = "^[0-9]*\\.[0-9]{" + parseInt( rlen, 10 ) + "}$";
        else if ( rlen == '*' ) regex = "^[0-9]{" + parseInt( llen, 10 ) + "}\\.[0-9]+$";
        else regex = "^[0-9]{" + parseInt( llen, 10 ) + "}\\.[0-9]{" + parseInt( rlen, 10 ) + "}$";
        
        regex = new RegExp( regex );
        return regex.test( element.value );            
        break;
        
        case 'phone':
        // Declaring required variables
        var digits = "0123456789";
        // non-digit characters which are allowed in phone numbers
        var phoneNumberDelimiters = "()- ";
        // characters which are allowed in international phone numbers
        // (a leading + is OK)
        var validWorldPhoneChars = phoneNumberDelimiters + "+";
        // Minimum no of digits in an international phone no.
        var minDigitsInIPhoneNumber = 10;
        
        s=phoneTestItemStripCharsInBag(element.value,validWorldPhoneChars);
        return (phoneTestItemIsInteger(s) && s.length >= minDigitsInIPhoneNumber);
        break;
        
        case 'regex':
        regex = new RegExp( rule[1] );
        return regex.test( element.value );  
        break;
        
        case 'contain':
        var test = false;
        for(var i=1; i < rule.length; i++){
            if(element.value.indexOf( rule[i] ) != -1){ test = true;}
        }
        return test;  
        break;
        
        default: return false;
    }
}

function phoneTestItemIsInteger(s)
{   var i;
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function phoneTestItemStripCharsInBag(s, bag)
{   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}