
//    TIme Validation :    http://www.the-art-of-web.com/javascript/validate-date/
//    Check box group:     http://www.codeproject.com/KB/webforms/GridViewcheckBoxes.aspx?fid=986730&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2405512
//                         http://www.w3schools.com/htmldom/dom_obj_document.asp


/*------------------------------
The Form Data to validate should in the following format
var v_formdata = 
{
    "form"       : "@sting",                        // Name of the Form - Optional
    "error_box"  : "@string",                       // [ERRor Div ID], where the error need to show
    "fields"     : [   // Field Datas
                        { "id"        : "@string",  // Id of the field
                          "name"      : "@string",  // Name of the field
                          "title"     : "@string", // Title, this is what displayed along with the alert or error message
                          "type"      : "@string",  // [Field Type]. Possible values (uname|phone|email|url|digit|checkgroup|radio|timesplit|date|not_null). If the value is not set the default will be 'not_null'. 
                          "minval"    : @int,       // Optional - Minimum Value of the Field
                          "maxval"    : @int,       // Optional - Maximum Value of the Field                          
                          "minlen"    : @int,       // Optional - Minimum length of the Field
                          "maxlen"    : @int,       // Optional - Maximum length of the Field
                          "regexp"    : "@string"   // Optional - Set this field, if want to check a custom reg expression
                          "optional"  : @boolean    // Indicates whether a field is optional or not. 
                          "container" : "@string"   // Id of the container, useful for checkgroup, radiogroup, etc.. 
                          "value"     : "@string"   // Concatenated string from the differnt time fileds (HR+MIN+AM/PM), useful for timesplit
                        },
                      ], // End "accounting" array.                                  
} // End Employees
---------------------------------*/
 
function validate_form(){
error_object = [];

    if(typeof(arguments[0])=="object"){
    var data = arguments[0];
    }else
    var data = v_formdata;
    
    if(typeof(data)=="undefined"){
        return false;
    }
    var reg_border1 =  "1px solid #D9D9D9";
    var no_border   =  "0px solid #FFFFFF";
    
    var fields  =   data.fields;
            
    for (var i=0; i<fields.length; i++)
    {
        var field   = fields[i];
    
        switch(field.type){
        
            case 'uname':
                        _el(field.id).style.border= reg_border1;
                        checkUserName(field);                        
                    break;
            case 'phone':
                        if (field.optional) if (isEmpty(_el(field.id).value)) break;                        
                        _el(field.id).style.border= reg_border1;
                        checkPhoneNumber(field);          
                    break;                    
            case 'email':
                        if (field.optional) if (isEmpty(_el(field.id).value)) break;                        
                        _el(field.id).style.border= reg_border1;
                        checkEmail(field);          
                    break;                       
            case 'url':
                        if (field.optional) if (isEmpty(_el(field.id).value)) break;                        
                        _el(field.id).style.border= reg_border1;
                        checkURL(field);          
                    break;                           
            case 'checkgroup':
                        _el(field.container).style.border= no_border;
                        checkCheckboxGroup(field);          
                    break;    
            case 'radio':
                        _el(field.container).style.border= no_border;
                        checkRadios(field);          
                    break;                       
            case 'time':
                        if(typeof(field.container)!="undefined")
                        _el(field.container).style.border= no_border;
                        checkTime(field);          
                    break;                                           
            case 'digit':
                        _el(field.id).style.border= reg_border1;
                        checkDigit(field);  
                    break;                                              
            default:
           
                        _el(field.id).style.border= reg_border1;
                        var obj     =    _el(field.id);    
                        var exp     = /^[\s]+$/;      
                        if (exp.test(obj.value) || (obj.value).length<=0){
                            var errmsg  =   field.title+" cannot be blank!";
                            append_invalid(errmsg, obj);
                        }                       
                    break;                    
        }
    }
    
    displayValidationError(data);       
    
    if (error_object.length<=0){
        return true;
    }else{
        window.scroll(0,0);
        return false;
    }
}

//--------------------------------------------//


/**
 * Return the object by using id|name
 */
function _el(name){
    if (document.getElementById(name))
        return document.getElementById(name);
    else
        return false;
}


//--------------------------------------------//


/**
 * Checks whetehr the user name is in proper format or not. 
 */
function checkUserName(field){
    var obj     =    _el(field.id);    
    var exp     = /^[\s]+$/;      
    if (exp.test(obj.value) || (obj.value).length<=0){
        var errmsg  =   field.title+" cannot be blank!";
        append_invalid(errmsg, obj);
    }else{
        exp = /^[\S]+$/;        
        if (!exp.test(obj.value)){
        var errmsg  =   field.title+" is incorrect!";        
        append_invalid(errmsg, obj);            
        }
    }          
}



//--------------------------------------------//


/**
 * Checks whetehr the phone/fax number is valid or not. 
 */
function checkPhoneNumber(field){
    
    var obj     =    _el(field.id);        
    var exp     = /^\+?[0-9 ()-]+[0-9]$/;      
    
    if (isEmpty(obj.value)){
        var errmsg  =   field.title+" cannot be blank!";
        append_invalid(errmsg, obj);
    }else{
        if (!exp.test(obj.value)){
        var errmsg  =   field.title+" is incorrect!";        
        append_invalid(errmsg, obj);            
        }
    }          
}

//--------------------------------------------//

/**
 * Checks whetehr the Email is valid or not. 
 */
function checkEmail(field){
    var obj     =    _el(field.id);        
    var exp     =   /^[\w-_\.]*[\w-_\.]@[\w].+[\w]+[\w]$/;      
    
    if (isEmpty(obj.value)){
        var errmsg  =   field.title+" cannot be blank!";
        append_invalid(errmsg, obj);
    }else{
        if (!exp.test(obj.value)){
        var errmsg  =   field.title+" is incorrect!";        
        append_invalid(errmsg, obj);            
        }
    }          
}

//--------------------------------------------//

/**
 * Checks whetehr the URL is valid or not. 
 */       
function checkURL(field){
    var obj     =    _el(field.id);        
    var exp1    = /^[A-Za-z]+:\/\/[A-Za-z-_]+\.[A-Za-z0-9-_%&\?\/.=]+$/;      
    var exp2    = /^[A-Za-z-_]+\.[A-Za-z0-9-_%&\?\/.=]+$/; 
    //var exp3    = /^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?$/   
    //var exp3    = /^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?$/   
    if (isEmpty(obj.value)){
        var errmsg  =   field.title+" cannot be blank!";
        append_invalid(errmsg, obj);
    }else{
        if (!(exp1.test(obj.value) || exp2.test(obj.value))){
        //if (!(exp3.test(obj.value))){
        var errmsg  =   field.title+" is incorrect!";        
        append_invalid(errmsg, obj);            
        }
    }          
}       

//--------------------------------------------//

/**
 * Checks whetehr the Digit is valid or not. 
 */       
function checkDigit(field){
    var obj     =    _el(field.id);        
    
    if (isEmpty(obj.value)){
        var errmsg  =   field.title+" cannot be blank!";
        append_invalid(errmsg, obj);
    }else{
        if (!(isDigit(obj.value))){
        var errmsg  =   field.title+" is incorrect!";        
        append_invalid(errmsg, obj);            
        }
    }          
}       

//--------------------------------------------//
/**
 * Checks whetehr the Date is valid or not. 
 */       
function checkDate(field){
    var obj     =   _el(field.id);        
    var exp     =   /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;   
    
    if (isEmpty(obj.value)){
        var errmsg  =   field.title+" cannot be blank!";
        append_invalid(errmsg, obj);
    }else{
        if (!(exp.test(obj.value))){
        var errmsg  =   field.title+" is incorrect!";        
        append_invalid(errmsg, obj);            
        }
    }          
}       

//--------------------------------------------//
/**
 * Checks whetehr the Date is valid or not. 
 */       
function checkTime(field){
    var value       = "";
    if (typeof(field.value)!="undefined"){
        var obj     =   _el(field.container);                
        value       =   field.value;
    }else{
        var obj     =   _el(field.id);        
        value       =   obj.value;
    }

    var exp         =   /^\d{1,2}:\d{2}([AP]M)?$/;       
    if (isEmpty(value)){
        var errmsg  =   field.title+" cannot be blank!";
        append_invalid(errmsg, obj);
    }else{
        if (!(exp.test(value))){
        var errmsg  =   field.title+" is incorrect!";        
        append_invalid(errmsg, obj);            
        }
    }   
            
}    

//--------------------------------------------//
/*
*  Checkbox Group Validation 
*/
function checkCheckboxGroup(field){
    var container  = _el(field.container);
    
    //Get all the checkboxes under this container - If no container then try by name
    if(typeof(container)=="undefined")    
    var checkboxes = container.getElementsByTagName("input");
    else
    var checkboxes = document.getElementsByTagName("input");    
    var checked    = 0;
    for(var n = 0; n < checkboxes.length; ++n)
      if(checkboxes[n].type == 'checkbox' && checkboxes[n].name.indexOf(field.name,0) >= 0) {
         if(checkboxes[n].checked) ++checked; 
      }
    
     
    if(typeof(field.minval)=="undefined") field.minval = 1;   

    if (checked<field.minval){
        var errmsg  =   "Please select atleast "+field.minval+" "+field.title;        
        append_invalid(errmsg, container);       
    }                     
    else if (checked>field.maxval && typeof(field.maxval)!="undefined"){
        var errmsg  =   "Please select a maximum of "+field.maxval+" "+field.title;        
        append_invalid(errmsg, container);       
    }
}

//--------------------------------------------//

/*
*  Radio Group Validation 
*/
function checkRadios(field){
    var container  = _el(field.container);
    
    //Get all the checkboxes under this container - If no container then try by name
    if(typeof(container)=="undefined")    
    var radios = container.getElementsByTagName("input");
    else
    var radios = document.getElementsByTagName("input");    
    var checked    = 0;
    for(var n = 0; n < radios.length; ++n)
      if(radios[n].type == 'radio' && radios[n].name.indexOf(field.name,0) >= 0) {
         if(radios[n].checked) ++checked; 
      }
     
    field.minval = 1;   

    if (checked<field.minval){
        var errmsg  =   "Please select atleast "+field.minval+" "+field.title;        
        append_invalid(errmsg, container);       
    }                     
}
 //--------------------------------------------//
 
/**
 * Appends Error Msgs.. The msgs will be appended into a JSON.. Here is the format.. 
 */
/*------------------------------
The Form Data to validate should in the following format
var error_object = 
[{ 
        "msg"        : "@string",  // Error Message
        "obj"        : @object,    // Object of the relative field to track and give border etc...
},], // End array.                                  
*/
var error_object = new Array();
var mycars=new Array();
function append_invalid(errmsg)
{    
    var obj     =      arguments[1]; 
    
    var i = error_object.length;
   
    if (typeof(obj)!="undefined")
    error_object[i] = {"msg":errmsg,"obj": obj}
    else
    error_object[i] = {"msg":errmsg}
}

//--------------------------------------------//

/**
 * Display Error
 */
function displayValidationError(data){
           
    var errbox  = _el(data.error_box);
    
    if (error_object.length<=0) {
        if (typeof(errbox)!="undefined"){
        errbox.innerHTML = "";
        errbox.style.display = "none";   
        }     
        return false;
    }
    
    var errStr  = "";
    
    if (errbox)
    {     
      //  errStr += "<ul>";
        for(var k=0; k<error_object.length; k++)
        {
            errStr += "<li>"+error_object[k].msg+"</li>";        
            if (typeof(error_object[k].obj)!="undefined")
            error_object[k].obj.style.border = "1px solid red";
        }
       // errStr += "</ul>";        
        
        errbox.innerHTML = errStr;
        errbox.style.display = "";
    }else{
        for(var k=0; k<error_object.length; k++)
        {
            errStr += error_object[k].msg+"\n\n";        
            error_object[k].obj.style.border = "1px solid red";
        }      
        
        alert(errStr);
    }
} 

//--------------------------------------------//


function isEmpty(str){
    var exp     = /^[\s]+$/;      
    if (exp.test(str) || (str).length<=0){
        return true;
    }  
    return false;
}

function isDigit (str) {
    if (str == null) {
        return (false);
    }
    if (isNaN(str)){
    return (false);
    }
    else if(str<=0){
        return (false);
    }
    return (true);
}
//--------------------------------------------//



function isWhitespace (c) {
    var whitespace = " \t\r\n\f\'";
    return (whitespace.indexOf (c) != -1);
}

function isBlank (str){
    if (str == null) {
        return (true);
        }
    for (var i = 0; i < str.length; i++) {        
        var c = str.charAt (i);
        if (!isWhitespace (c)) {
           return (false);
           }
        }
    return (true);
}