/**
 * jQuery.fn.verify
 *
 * - url        The URL to send the POST/GET AJAX request to
 * - verifying  The CSS class to toggle while verification is taking place
 * - valid      The CSS class to toggle if verification is successful
 * - invalid    The CSS class to toggle if verification fails
 * - method     Set to either get or post
 *
 * The url should expect to receive either a GET or POST variable named
 * 'value'. In that will be the value of the input this is attached to. It
 * should then respond with either '1' or '0'. '1' means that the value is
 * valid, while '0' (or any non '1' response) means the value is invalid.
 *
 * Additionally, the classes verifying + 'Parent', valid + 'Parent', and
 * invalid + 'Parent' are toggled appropriately. This allows you to add a
 * background icon to the container element if you so wish for instance.
 *
 * @author      Joe Stump <joe@joestump.net>
 * @param       string      url
 * @param       array       options
 */
jQuery.fn.verify = function(url, options) {
    $(this).attr('autocomplete', 'off');
    
    function reset(input) {
        $(input).removeClass(input.settings.verifying)
                .removeClass(input.settings.valid)
                .removeClass(input.settings.invalid)
                .removeClass(input.settings.tooshort)
                .removeClass(input.settings.specialchars);

        $(input).parent().removeClass(input.settings.verifying + 'Parent')
                         .removeClass(input.settings.valid + 'Parent')
                         .removeClass(input.settings.invalid + 'Parent');
    }
    
    

    function response(response, input) {
        reset(input);
        if (response == 1) {
           var iChars = "!@#$%^&*()+=-[]\\\';,./{}|\":<>?~_";
           var specialChars = 0;
           var error = "";
           for (var i = 0; i < input.value.length; i++) {
              if (iChars.indexOf(input.value.charAt(i)) != -1) {
                 specialChars++;
              }
           }
           if (input.value.length < 4){
              $(input).addClass(input.settings.invalid);
              $(input).parent().addClass(input.settings.invalid + 'Parent');
              $('.error').text('Your username is not long enough');
              $('#userValidation').val('invalid');
           } else if (specialChars > 0){
              $(input).addClass(input.settings.invalid);
              $(input).parent().addClass(input.settings.invalid + 'Parent');
              $('.error').text('Special characters are not allowed');
              $('#userValidation').val('invalid');
           } else if (input.value.match(/\s+/g)){
              $(input).addClass(input.settings.invalid);
              $(input).parent().addClass(input.settings.invalid + 'Parent');
              $('.error').text('Spaces are not allowed');
              $('#userValidation').val('invalid');
           }else{
              $(input).addClass(input.settings.valid);
              $(input).parent().addClass(input.settings.valid + 'Parent');
              $('.error').text('Valid');
              $('#userValidation').val('valid');
           }
        }else {
            $(input).addClass(input.settings.invalid);
            $(input).parent().addClass(input.settings.invalid + 'Parent');
            $('.error').text('This username is not available');
            $('#userValidation').val('invalid');
        }
    }

    this.each(function() {
        var settings = jQuery.extend({
            url         : url,
            verifying   : "",
            valid       : "",
            invalid     : "",
            tooshort    : "",
            specialchars: "",
            method      : "get"
        }, options || {});
        
        this.timer    = undefined;
        this.settings = settings;
        $(this).keyup(function() {
            if (this.timer) {
                clearTimeout(this.timer);
                this.timer = undefined
            }

            if (this.value.length == 0) {
                reset(this);
                return;
            }

            var input = this;
            this.timer = setTimeout(function() {
                params = {
                    id      : $(input).attr('id'),
                    value   : $(input).val()
                };

                $(input).addClass(input.settings.verifying);
                if (input.settings.method == "get") {
                    $.get(input.settings.url, params, function(result) {
                        response(result, input);
                    });
                } else {
                    $.post(input.settings.url, params, function(result) {
                        response(result, input);
                    });
                }
            }, 200);
        });
    });

    return this;
};



/** verify email **/

jQuery.fn.verifyemail = function(url, options) {
    $(this).attr('autocomplete', 'off');
    
    function reset(input) {
        $(input).removeClass(input.settings.verifying)
                .removeClass(input.settings.valid)
                .removeClass(input.settings.invalid);

        $(input).parent().removeClass(input.settings.verifying + 'Parent')
                         .removeClass(input.settings.valid + 'Parent')
                         .removeClass(input.settings.invalid + 'Parent');
    }
    

    function response(response, input) {
        reset(input);
        var emailCheck = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(input.value);
        $('.emailError').text('');
        if (response == 1) {
           if (emailCheck == false){
              $(input).addClass(input.settings.invalid);
              $(input).parent().addClass(input.settings.invalid + 'Parent');
              $('.emailError').text('Must enter a valid email');
              $('#emailValidation').val('invalid');
           }else{
              $(input).addClass(input.settings.valid);
              $(input).parent().addClass(input.settings.valid + 'Parent');
              $('.emailError').text('Valid');
              $('#emailValidation').val('valid');
           }
        }else {
            $(input).addClass(input.settings.invalid);
            $(input).parent().addClass(input.settings.invalid + 'Parent');
            $('.emailError').text('This email has already been registered');
              $('#emailValidation').val('invalid');
        }
    }

    this.each(function() {
        var settings = jQuery.extend({
            url         : url,
            verifying   : "",
            valid       : "",
            invalid     : "",
            method      : "get"
        }, options || {});
        
        this.timer    = undefined;
        this.settings = settings;
        $(this).keyup(function() {
            if (this.timer) {
                clearTimeout(this.timer);
                this.timer = undefined
            }

            if (this.value.length == 0) {
                reset(this);
                return;
            }

            var input = this;
            this.timer = setTimeout(function() {
                params = {
                    id      : $(input).attr('id'),
                    value   : $(input).val()
                };

                $(input).addClass(input.settings.verifying);
                if (input.settings.method == "get") {
                    $.get(input.settings.url, params, function(result) {
                        response(result, input);
                    });
                } else {
                    $.post(input.settings.url, params, function(result) {
                        response(result, input);
                    });
                }
            }, 200);
        });
    });

    return this;
};

function validateSignupFrm(){
      var usernameValue = $('input[@name="username"]').val();
      var passwordValue = $('input[@name="password"]').val();
      var userValidationValue = $('input[@name="userValidation"]').val();
      var passwordValidationValue = $('input[@name="passwordValidation"]').val();
      var error = 'Please enter a value for:';
      if (!usernameValue){
         error += "\nUser Name";
      }
      if (!passwordValue){
         error += "\nPassword";
      }
      
      if (!useridValue || !passwordValue){
         alert(error);
         return false;
      }
      if (userValidationValue != 'valid' || passwordValidationValue != 'valid' ){
         alert('Please only submit valid fields');
         return false;
      }
      return true;
   }
   
function validateRegistration3Frm(){
      var mobileValue = $('input[@name=mobile]').val();
      var mobileValidationValue = $('input[@name="mobileValidation"]').val();
      var error = 'Please enter your mobile phone number';
      
      if (!mobileValue){
         alert(error);
         return false;
      }
      if (mobileValidationValue != 'valid'){
         alert('Please submit a valid phone number');
         return false;
      }
      return true;
   }

   function validateSubmitFrm(){
      var uploadValue = $('input[@name="uploadtattoo"]').val();
      var captionValue = $('input[@name="caption"]').val();
      
      var error = '';
      if (!uploadValue){
         error += "Please select a tattoo to upload";
      }
      if (!captionValue){
         error += "\nPlease add a caption to your tattoo";
      }
      if (!uploadValue || !captionValue){
         alert(error);
         return false;
      }
      return true;
   }