$.fn.validate_input_data = function(){

    var element = $(this);
    jQuery.fn.isMandatory = function() {
	var r = new RegExp('\\bmandatory\\b');
	return r.test($(this).attr('class'));
    };
        
    jQuery.fn.skipValidation = function() {
	var r = new RegExp('\\bskip_validation\\b');
	return r.test($(this).attr('class'));
    };
        
    jQuery.fn.checkInputType = function(className) {
	var r = new RegExp('\\b'+className+'\\b');
	    
	return r.test($(this).attr('class'));
    };
        
    jQuery.fn.isEmpty = function(val){
	return  (/^\s*$/).test(val);
    };
          
    jQuery.fn.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
    };

    function is_array(input){
	return typeof(input)=='object'&&(input instanceof Array);
    }


    function invalid_char_check(allowed_chars,value){
	var in_array ;
	var invalid_chrs = [];
	var chr = '';
	for(var n = 0; n <= value.length -1; n++){          
	    chr = value.charAt(n);              
	    in_array = jQuery.inArray(chr,allowed_chars);
	    if(in_array == -1){
		invalid_chrs.push(chr);
	    }
	}
	return invalid_chrs;
    }

        
    var value = '';
    var message = false;
    var elementName = element.data('inputname');
    var skip_validate = false;
        
    var alpha =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
    var numeric = ['1','2','3','4','5','6','7','8','9','0'];
    var alphanumeric = alpha.concat(numeric);

        
    element.removeClass('errorInput');
    var isMandatory = element.isMandatory();
    
    
  //  console.log(element.attr('id'));
    
    
    if(isMandatory && (element.val()=='' || element.val() == null)){
	element.addClass('errorInput');
	return {
	    "value":false,
	    "message":elementName + ' cannot be blank'
	};
    } else if( !isMandatory && element.val()==''){
	skip_validate = true;
    }
         
    if (elementName == undefined)
    {
	skip_validate = true;
    }
    else
    {
           
	// alert(elementName);
	if(is_array(element.val())){
	    //value = element.val().join("\n");
	    skip_validation = true;
	} else {
	    if(element.val() == undefined){
		skip_validate = true;
	    } else {
		value = element.val().replace(/^\s+|\s+$/g,"");
	    }
	}
    }
    
   
         

    switch(true){
	case element.checkInputType('date'):
	    /*** 
                   type       date  
                   max len    10
                   alpha      false 
                   numeric    true
                   mask       mm/dd/yyyy
                   allowed    /
                   Strip      n/a
                 ***/
	    if(!skip_validate){
		if(value.length > 10){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		} else {
		    var datePattern = /\d{1,2}\/\d\d?\/\d{4}/;
		    if(!datePattern.test(value)){
			value = false;
			message = 'Invalid date. Please use mm/dd/yyyy format';
			element.addClass('errorInput');
		    }
		}
	    } else {
		value = '';
	    }
                
	    break;
         
	case element.checkInputType('time'):
	    /*** 
                   type       time  
                   max len    7
                   alpha      false 
                   numeric    true
                   mask       hh:mmAP
                   allowed    :
                   Strip      n/a
                 ***/
	    if(!skip_validate){
		if(value.length > 7){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		} else {
		    var timePattern = /\d{1,2}\:\d{2}[A-Za-z]{2}/;
		    if(!timePattern.test(value)){
			value = false;
			message = 'Invalid date. Please use hh:mm format';
			element.addClass('errorInput');
		    }
		}
	    } else {
		value = '';
	    }
                
                
	    break;
	case element.checkInputType('offercode'):
	    /*** 
                   type       offercode
                   max len    10
                   alpha      true
                   numeric    true
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/
                 
	    if(value.length > 10){
		value = false;
		message = elementName + ' is too long';
		element.addClass('errorInput');
	    }
	    break;
	
	case element.checkInputType('password'):
	    /*** 
                   type       password
                   min len    6
                   alpha      true
                   numeric    true
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/
                 
	    if( value.length  > 1 && value.length < 6){
		value = false;
		message = elementName + ' is too short';
		element.addClass('errorInput');
	    }
		   
	    break;
            
	    
	case element.checkInputType('url'):
	    /*** 
                   type       url  
                   max len    60  
                   alpha      TRUE  
                   numeric    TRUE 
                   mask       NA
                   allowed    [-.]
                 ***/
	    var name_allowed = alphanumeric;
	    name_allowed.push('-');
	    name_allowed.push('.');
	    name_allowed.push(':');
	    name_allowed.push('/');
                 
	    var invalid_chrs = invalid_char_check(name_allowed,value);
	    if(invalid_chrs.length>0){
		value = false;
		message = 'Invalid characters in '+ elementName + ': ' + invalid_chrs.join(' ');
		element.addClass('errorInput');
	    } else {    
		
		if(value.length > 60){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		} else {
		    if(value.length){
			var regex =/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi
			var ret = value.match(regex);
			if(!ret){
			    value = false;
			    message = 'Invalid website address';
			    element.addClass('errorInput');
			}
		    }
		}
                   
	    }
	    break;
	    
	case element.checkInputType('name'):
	    /*** 
                   type       name  
                   max len    40  
                   alpha      TRUE  
                   numeric    FALSE 
                   mask       NA
                   allowed    [-',.]
                   Strip      [',]
                 ***/
	    var name_allowed = alphanumeric;
	    name_allowed.push('-');
	    name_allowed.push("'");
	    name_allowed.push(',');
	    name_allowed.push('-');
	    name_allowed.push('.');
	    name_allowed.push(' '); 
	    name_allowed.push('&'); 
	    name_allowed.push('/'); 
	    name_allowed.push('\\'); 
		
	    var invalid_chrs = invalid_char_check(name_allowed,value);
	    if(invalid_chrs.length>0){
		value = false;
		message = 'Invalid characters in '+ elementName + ': ' + invalid_chrs.join(' ');
		element.addClass('errorInput');
	    } else {                
		if(value.length > 40){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		}  
		/*
                   else if(value.length < 3 && value.length > 0){
                        value = false;
                        message = 'Provide full ' + elementName;
                        element.addClass('errorInput');
                   } 
                   */
		else 
		{
		    value = value.replace(/\'+/g, '').replace(/,+/g, '');
		}
                   
	    }
	    break;
            
            
	case element.checkInputType('email'):
	    /*** 
                   type       email 
                   max len    255
                   alpha      TRUE  
                   numeric    TRUE  
                   mask       x@y.z
                   allowed    [a-z0-9.-_@]
                   Strip      n/a
                 ***/
	    var regex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ 
	    var ret = value.match(regex);
	    if(!ret){
		value = false;
		message = 'Invalid email address';
		element.addClass('errorInput');
	    } else {
		if(value.length > 255){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		}
	    }
                 
	    break;
            
	case element.checkInputType('phone'):
	    /*** 
                   type       phone 
                   max len    20
                   alpha      FALSE 
                   numeric    TRUE  
                   mask       NA
                   allowed    [()-.]
                   Strip      [()-.]
                 ***/
	    var phone_allowed = numeric;
	    phone_allowed.push('(');
	    phone_allowed.push(')');
	    phone_allowed.push('-');
	    phone_allowed.push('.');
	    phone_allowed.push(' '); 
                 
	    if (value.length>0)
	    {
		var invalid_chrs = invalid_char_check(phone_allowed,value);
		if(invalid_chrs.length>0){
		    value = false;
		    message = 'Invalid characters in '+elementName + '. Allowed:' + phone_allowed.join('');
		    element.addClass('errorInput');
		} else {                  
		    value = value.replace(/[^0-9]+/g, '');
		}
		if(value.length>20){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		}
		if(value.length<10){
		    value = false;
		    message = elementName + ' is not long enough.';
		    element.addClass('errorInput');
		}
	    }

	    if(value.length<7 && value.length >1){
		value = false;
		message = elementName + ' is not long enough.';
		element.addClass('errorInput');
	    }
	    break;
            
	case element.checkInputType('address'):
	    /*** 
                   type       address 
                   max len    40
                   alpha      TRUE  
                   numeric    TRUE  
                   mask       n/a
                   allowed    [-.#]
                   Strip      n/a
                 ***/
	    var address_allowed = alphanumeric;
	    address_allowed.push('-');
	    address_allowed.push('#');
	    address_allowed.push("'");
	    address_allowed.push('.');
	    address_allowed.push(',');
	    address_allowed.push(' '); 
                 
	    var invalid_chrs = invalid_char_check(address_allowed,value);
               
	    if(invalid_chrs.length>0){
		value = false;
		message = 'Invalid characters in '+ elementName + ': ' + invalid_chrs.join(' ');
		element.addClass('errorInput');
	    } else {
		if(value.length > 40){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		}
		else if(value.length < 3 && value.length > 0){
		    value = false;
		    message = 'Provide full ' + elementName;
		    element.addClass('errorInput');
		} 
	    }
	    break;
            
	case element.checkInputType('city'):
	    /*** 
                   type       city
                   max len    40
                   alpha      true
                   numeric    false
                   mask       n/a
                   allowed    .,-'
                   Strip      '
                 ***/
                 
	    var city_allowed = alpha;
	    city_allowed.push('.');
	    city_allowed.push(',');
	    city_allowed.push('-');
	    city_allowed.push("'");
	    city_allowed.push(' '); 
                   
	    var invalid_chrs = invalid_char_check(city_allowed,value);
                 
	    if(invalid_chrs.length>0){
		value = false;
		message = 'Invalid characters in '+ elementName + ': ' + invalid_chrs.join(' ');
		element.addClass('errorInput');
	    } else {
		if(value.length > 40){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		} 
		else if(value.length < 3 && value.length > 0){
		    value = false;
		    message = 'Provide full ' + elementName;
		    element.addClass('errorInput');
		} 
		else {
		    value = value.replace(/\'+/g, '');
		}
	    }
	    break;
            

            
         
	case element.checkInputType('state'):
	    /*** 
                   type       state
                   max len    2
                   alpha      true
                   numeric    false
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/
		   
	    var state_allowed = alpha;
	    var invalid_chrs = invalid_char_check(state_allowed,value);
                 
	    if(invalid_chrs.length>0){
		value = false;
		message = 'Invalid characters in '+ elementName + ': ' + invalid_chrs.join(' ');
		element.addClass('errorInput');
	    } else {
		if(value.length != 2){
		    value = false;
		    message = 'Invalid ' + elementName;
		    element.addClass('errorInput');
		}
	    }
	    // value = value.replace(/[^A-Za-z]+/g, '');
	    break;
            
	case element.checkInputType('zip'):
	    /*** 
                   type       zip
                   max len    5
                   alpha      false
                   numeric    true
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/
                 
              var zip_allowed = alphanumeric;
	    zip_allowed.push(' ');
	    var invalid_chrs = invalid_char_check(zip_allowed,value);
	    if(invalid_chrs.length > 0){
		value = false;
		message = 'Invalid ' + elementName;
		element.addClass('errorInput');
	    } else {
		if(value.length)
		{
		    if(value.length > 10)
		    {
			value = false;
			message = 'Invalid ' + elementName;
			element.addClass('errorInput');
		    }
		}
	    }
	    break;
            
	case element.checkInputType('ziplong'):
	    /*** 
                   type       zip
                   max len    11
                   alpha      false
                   numeric    true
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/
                 
              
	    var invalid_chrs = invalid_char_check(numeric,value);
	    if(invalid_chrs.length > 0){
		value = false;
		message = 'Invalid ' + elementName;
		element.addClass('errorInput');
	    } else {
		if(value.length < 5 || value.length > 11 ){
		    value = false;
		    message = 'Invalid ' + elementName;
		    element.addClass('errorInput');
		}
	    }
	    break;
                         
	case element.checkInputType('creditcard'):
	    /*** 
                   type       creditcard
                   max len    20
                   alpha      false
                   numeric    true
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/
	    var cc_allowed = numeric;
	    cc_allowed.push('-');
	    cc_allowed.push('.');
	    cc_allowed.push(' ');
                 
	    var invalid_chrs = invalid_char_check(cc_allowed,value);
	    if(invalid_chrs.length > 0){
		value = false;
		message = 'Invalid ' + elementName;
		element.addClass('errorInput');
	    } else {
		if(value.length > 20){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		} else {
		    if(value.length < 15){
			value = false;
			message = elementName + ' is too short';
			element.addClass('errorInput');
		    } else {
			//we are OK. Strip the non-numeric chr's
			value = value.replace(/[^0-9]+/g, '');
		    }
		}
	    }
                 
	    break;
            
	case element.checkInputType('ssn'):
	    /*** 
                   type       social security #
                   max len    20
                   alpha      false
                   numeric    true
                   mask       n/a
                   allowed    -
                   Strip      n/a
                 ***/
	    var ssn_allowed = numeric;
	    ssn_allowed.push('-');
                 
	    var invalid_chrs = invalid_char_check(ssn_allowed,value);
	    if(invalid_chrs.length > 0){
		value = false;
		message = 'Invalid ' + elementName;
		element.addClass('errorInput');
	    } else {
		if(value.length > 20){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		} else {
		    if(value.length < 10 && value.length > 0){
			value = false;
			message = elementName + ' is too short';
			element.addClass('errorInput');
		    } else {
			
			//we are OK. Strip the non-numeric chr's
			value = value.replace(/[^0-9\-]+/g, '');
			
		    }
		}
	    }
                 
	    break;
	case element.checkInputType('country'):
	    /*** 
                   type       country
                   max len    30
                   alpha      true
                   numeric    false
                   mask       n/a
                   allowed    .-'
                   Strip      '
                 ***/
                 
	    var country_allowed = alpha;
	    country_allowed.push('.');
	    country_allowed.push(',');
	    country_allowed.push('-');
	    country_allowed.push("'");
	    country_allowed.push(' '); 
                   
	    var invalid_chrs = invalid_char_check(country_allowed,value);
                 
	    if(invalid_chrs.length>0){
		value = false;
		message = 'Invalid characters in '+ elementName + ': ' + invalid_chrs.join(' ');
		element.addClass('errorInput');
	    } else {
		if(value.length > 30){
		    value = false;
		    message = elementName + ' is too long';
		    element.addClass('errorInput');
		}
		else if(value.length < 3 && value.length > 0){
		    value = false;
		    message = 'Provide full ' + elementName;
		    element.addClass('errorInput');
		} 
		else {
		    value = value.replace(/\'+/g, '');
		}
	    }
                   
	    break;
            
	case element.checkInputType('number_of_guests'):
	    /*** 
                   type       number_of_guests
                   max len    2
                   alpha      false
                   numeric    true
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/
	    var invalid_chrs = invalid_char_check(numeric,value);
	    if(invalid_chrs.length > 0 || value.length > 2){
		value = false;
		message = 'Invalid ' + elementName;
		element.addClass('errorInput');
	    }

                 
	    break;
            
	case element.checkInputType('comments'):
	    /*** 
                   type       comments
                   max len    500
                   alpha      true
                   numeric    true
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/
                 
	    if(value.length > 500){
		value = false;
		message = elementName + ' too long. Max: 500 characters';
		element.addClass('errorInput');
	    }
                 
	    break;
            
	case element.checkInputType('confirmation_number'):
	    /*** 
                   type       confirmation_number
                   max len    50
                   alpha      true
                   numeric    true
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/
	    if(value.length > 50){
		value = false;
		message = elementName + ' too long. Max: 50 characters';
		element.addClass('errorInput');
	    }
	    break;
	   
	case element.checkInputType('keywords'):
	    /*** 
                   type       confirmation_number
                   max len    1000
                   alpha      true
                   numeric    true
                   mask       n/a
                   allowed    n/a
                   Strip      n/a
                 ***/

	    if(value.length > 1000){
		value = false;
		message = elementName + ' too long. Max: 1000 characters';
		element.addClass('errorInput');
	    }
	    break;
              
              
              
	default:
	    if(is_array(element.val())){
		
		value = element.val().join(",");
		
	    } else {
		value = element.val();
	    }
    }
        

    var json = {
	"value":value,
	"message":message
    };
    return json;
}
