// source --> https://dsmirror.tecknolab.com/wp-content/plugins/pie-register/assets/js/prVariablesDeclaration.js?ver=3.8.2 
var ajaxurl							= pie_pr_dec_vars.ajaxURL;
var piereg_current_date				= pie_pr_dec_vars.dateY;
var piereg_startingDate				= pie_pr_dec_vars.piereg_startingDate;
var piereg_endingDate				= pie_pr_dec_vars.piereg_endingDate;
var piereg_pass_str_meter_string 	= new Array(pie_pr_dec_vars.pass_strength_indicator_label,
														 pie_pr_dec_vars.pass_very_weak_label,
														 pie_pr_dec_vars.pass_weak_label,
														 pie_pr_dec_vars.pass_medium_label,
														 pie_pr_dec_vars.pass_strong_label,
														 pie_pr_dec_vars.pass_mismatch_label
														 );
var piereg_validation_engn 			= new Array(
										 pie_pr_dec_vars.ValidationMsgText1,
										 pie_pr_dec_vars.ValidationMsgText2,
										 pie_pr_dec_vars.ValidationMsgText3,
										 pie_pr_dec_vars.ValidationMsgText4,
										 pie_pr_dec_vars.ValidationMsgText5,
										 pie_pr_dec_vars.ValidationMsgText6,
										 pie_pr_dec_vars.ValidationMsgText7,
										 pie_pr_dec_vars.ValidationMsgText8,
										 pie_pr_dec_vars.ValidationMsgText9,
										 pie_pr_dec_vars.ValidationMsgText10,
										 pie_pr_dec_vars.ValidationMsgText11,
										 pie_pr_dec_vars.ValidationMsgText12,
										 pie_pr_dec_vars.ValidationMsgText13,
										 pie_pr_dec_vars.ValidationMsgText14,
										 pie_pr_dec_vars.ValidationMsgText15,
										 pie_pr_dec_vars.ValidationMsgText16,
										 pie_pr_dec_vars.ValidationMsgText17,
										 pie_pr_dec_vars.ValidationMsgText18,
										 pie_pr_dec_vars.ValidationMsgText19,
										 pie_pr_dec_vars.ValidationMsgText20,
										 pie_pr_dec_vars.ValidationMsgText21,
										 pie_pr_dec_vars.ValidationMsgText22,
										 pie_pr_dec_vars.ValidationMsgText23,
										 pie_pr_dec_vars.ValidationMsgText24,
										 pie_pr_dec_vars.ValidationMsgText25,
										 pie_pr_dec_vars.ValidationMsgText26,
										 pie_pr_dec_vars.ValidationMsgText27,
										 pie_pr_dec_vars.ValidationMsgText28,
										 pie_pr_dec_vars.ValidationMsgText29,
										 pie_pr_dec_vars.ValidationMsgText30,
										 pie_pr_dec_vars.ValidationMsgText31,
										 pie_pr_dec_vars.ValidationMsgText32,
										 pie_pr_dec_vars.ValidationMsgText33,
										 pie_pr_dec_vars.ValidationMsgText34,
										 pie_pr_dec_vars.ValidationMsgText35,
										 pie_pr_dec_vars.ValidationMsgText36,
										 pie_pr_dec_vars.ValidationMsgText37,
										 pie_pr_dec_vars.ValidationMsgText38,
										 pie_pr_dec_vars.ValidationMsgText39,
										 pie_pr_dec_vars.ValidationMsgText40,
										 pie_pr_dec_vars.ValidationMsgText41,
										 pie_pr_dec_vars.ValidationMsgText42,
										 pie_pr_dec_vars.ValidationMsgText43,
										 pie_pr_dec_vars.ValidationMsgText44,
										 pie_pr_dec_vars.ValidationMsgText45,
										 pie_pr_dec_vars.ValidationMsgText46,
										 pie_pr_dec_vars.ValidationMsgText47,
										 pie_pr_dec_vars.ValidationMsgText48,
										 pie_pr_dec_vars.ValidationMsgText49,
										 pie_pr_dec_vars.ValidationMsgText50,
										 pie_pr_dec_vars.ValidationMsgText51,
										 pie_pr_dec_vars.ValidationMsgText52,
										 pie_pr_dec_vars.ValidationMsgText53,
										 pie_pr_dec_vars.ValidationMsgText54,
										 pie_pr_dec_vars.ValidationMsgText55,
										 pie_pr_dec_vars.ValidationMsgText56,
										 pie_pr_dec_vars.ValidationMsgText57,
										 pie_pr_dec_vars.ValidationMsgText58,
										 pie_pr_dec_vars.ValidationMsgText61
										);
piereg_validation_engn['delete'] 	= pie_pr_dec_vars.ValidationMsgText59;
piereg_validation_engn['edit'] 		= pie_pr_dec_vars.ValidationMsgText60;
var piereg_process_submission		= pie_pr_dec_vars.process_submission;
// source --> https://dsmirror.tecknolab.com/wp-content/plugins/pie-register/assets/js/datepicker.js?ver=3.8.2 
var piereg = jQuery.noConflict();

piereg(document).ready(function(e) {

    /*piereg('.date_start').on("focus", function() {
        if (!piereg("#ui-datepicker-div").closest('.pieregWrapper').length) {
            piereg("#ui-datepicker-div").wrap("<div class='pieregWrapper pieregister-admin'></div>");
        }
    });*/

    /*piereg(".pieregformWrapper form").validationEngine();
    piereg("#lostpasswordform").validationEngine();
    piereg("#resetpassform").validationEngine();	
    piereg("#loginform").validationEngine();*/

    /*piereg('.date_start').datepicker({
        dateFormat : 'yy-mm-dd',
		changeMonth: true,
		changeYear: true,
		yearRange: piereg_startingDate+":"+piereg_endingDate
	});*/

    // used count to make unique ids for datepicker.
    var count = 0;

    piereg('.date_start').each(function(index, element) {

        count++;

        var selectedForm = piereg(this).closest('form');

        var id = piereg(this).attr("id");
        var new_id = id + "_" + count; // Date field Id updated to avoid same id conflict in 2 forms. 
        selectedForm.find("#" + id).attr("id", new_id);

        piereg_endingDate = new Date();

        var year  = ( piereg_endingDate.getFullYear() ) + 10;
        piereg_endingDate = year;

        //Setting date Format
        var formatid = id + "_format";
        var format = selectedForm.find("#" + formatid).val();
       
        var enable_read_only = piereg(this).attr('data-field-visibility-addon');
        read = selectedForm.find("#" + new_id).attr("readonly");   // Field Visibility Plugin
        if(enable_read_only != "1"){
        
            selectedForm.find("#" + new_id).datepicker({
                dateFormat: format,
                changeMonth: true,
                changeYear: true,
                yearRange: piereg_startingDate + ":" + piereg_endingDate,
                showAnim: "fadeIn"
            });

            //First day of a week
            var formatid = id + "_firstday";
            var format = selectedForm.find("#" + formatid).val();
            selectedForm.find("#" + new_id).datepicker({
                firstDay: format,
                changeMonth: true,
                changeYear: true,
                yearRange: piereg_startingDate + ":" + piereg_endingDate,
                showAnim: "fadeIn"
            });

            //Min date		
            var formatid = id + "_startdate";
            var format = selectedForm.find("#" + formatid).val();
            selectedForm.find("#" + new_id).datepicker({
                minDate: format,
                changeMonth: true,
                changeYear: true,
                yearRange: piereg_startingDate + ":" + piereg_endingDate,
                showAnim: "fadeIn"
            });
        }
        piereg("#ui-datepicker-div").hide();

        if (!piereg("#ui-datepicker-div").closest('.pieregWrapper').length) {
            piereg("#ui-datepicker-div").wrap("<div class='pieregWrapper pieregister-admin'></div>");
        }
        piereg(".calendar_icon").on("click", function() {
            var selectedForm = piereg(this).closest('form');
            var id = piereg(this).attr("id");
            id = id.replace("_icon", "");
            read = selectedForm.find("#" + new_id).attr("readonly");   // Field Visibility Plugin
        
            if(read != "readonly"){
                selectedForm.find("#" + new_id).datepicker("show");
            }
        });
    });

    /* piereg js 01012015 */
    piereg(".piereg-select-all-text-onclick").on("click", function() {
        piereg(this).select();
    });
    piereg(".piereg-select-all-text-onclick").on("keyup", function() {
        piereg(this).select();
    });
    piereg(".piereg-select-all-text-onclick").on("focus", function() {
        piereg(this).select();
    });

    /*hide required field*/
    piereg("#pie_register input.piereg_input_field_required").removeAttr("required");
    piereg("#pie_register input.piereg_input_field_required").attr("class", "input_fields piereg_input_field_required ");
    piereg("#pie_register input.piereg_input_field_required").parent().parent().hide();

    if (window.location.hash == "#_=_") {
        history.pushState(null, null, window.location.href.replace(/#_=_/, ''));
        //window.location.href = window.location.href.replace(/#_=_/, '');
    }

});

// Declare jQuery Object to $.
$ = jQuery;
// source --> https://dsmirror.tecknolab.com/wp-content/plugins/pie-register/assets/js/jquery.alphanum.js?ver=3.8.2 
/********************************************************************
* Limit the characters that may be entered in a text field
* Common options: alphanumeric, alphabetic or numeric
* Kevin Sheedy, 2012
* http://github.com/KevinSheedy/jquery.alphanum
*********************************************************************/
(function( $ ){

  // API ///////////////////////////////////////////////////////////////////
  $.fn.alphanum = function(settings) {

    var combinedSettings = getCombinedSettingsAlphaNum(settings);

    var $collection = this;

    setupEventHandlers($collection, trimAlphaNum, combinedSettings);

    return this;
  };

  $.fn.alpha = function(settings) {

    var defaultAlphaSettings = getCombinedSettingsAlphaNum('alpha');
    var combinedSettings = getCombinedSettingsAlphaNum(settings, defaultAlphaSettings);

    var $collection = this;

    setupEventHandlers($collection, trimAlphaNum, combinedSettings);

    return this;
  };

  $.fn.numeric = function(settings) {

    var combinedSettings = getCombinedSettingsNum(settings);
    var $collection = this;

    setupEventHandlers($collection, trimNum, combinedSettings);

    $collection.blur(function(){
      numericField_Blur(this, combinedSettings);
    });

    return this;
  };

  // End of API /////////////////////////////////////////////////////////////


  // Start Settings ////////////////////////////////////////////////////////

  var DEFAULT_SETTINGS_ALPHANUM = {
    allow              : '',    // Allow extra characters
    disallow           : '',    // Disallow extra characters
    allowSpace         : true,  // Allow the space character
    allowNewline       : true,  // Allow the newline character \n ascii 10
    allowNumeric       : true,  // Allow digits 0-9
    allowUpper         : true,  // Allow upper case characters
    allowLower         : true,  // Allow lower case characters
    allowCaseless      : true,  // Allow characters that don't have both upper & lower variants - eg Arabic or Chinese
    allowLatin         : true,  // a-z A-Z
    allowOtherCharSets : true,  // eg é, Á, Arabic, Chinese etc
    forceUpper         : false, // Convert lower case characters to upper case
    forceLower         : false, // Convert upper case characters to lower case
    maxLength          : NaN    // eg Max Length
  };

  var DEFAULT_SETTINGS_NUM = {
    allowPlus           : false, // Allow the + sign
    allowMinus          : true,  // Allow the - sign
    allowThouSep        : true,  // Allow the thousands separator, default is the comma eg 12,000
    allowDecSep         : true,  // Allow the decimal separator, default is the fullstop eg 3.141
    allowLeadingSpaces  : false,
    maxDigits           : NaN,   // The max number of digits
    maxDecimalPlaces    : NaN,   // The max number of decimal places
    maxPreDecimalPlaces : NaN,   // The max number digits before the decimal point
    max                 : NaN,   // The max numeric value allowed
    min                 : NaN    // The min numeric value allowed
  };

  // Some pre-defined groups of settings for convenience
  var CONVENIENCE_SETTINGS_ALPHANUM = {
    'alpha' : {
      allowNumeric  : false
    },
    'upper' : {
      allowNumeric  : false,
      allowUpper    : true,
      allowLower    : false,
      allowCaseless : true
    },
    'lower' : {
      allowNumeric  : false,
      allowUpper    : false,
      allowLower    : true,
      allowCaseless : true
    }
  };

  // Some pre-defined groups of settings for convenience
  var CONVENIENCE_SETTINGS_NUMERIC = {
    'integer' : {
      allowPlus    : false,
      allowMinus   : true,
      allowThouSep : false,
      allowDecSep  : false
    },
    'positiveInteger' : {
      allowPlus    : false,
      allowMinus   : false,
      allowThouSep : false,
      allowDecSep  : false
    }
  };


  var BLACKLIST   = getBlacklistAscii() + getBlacklistNonAscii();
  var THOU_SEP    = ',';
  var DEC_SEP     = '.';
  var DIGITS      = getDigitsMap();
  var LATIN_CHARS = getLatinCharsSet();

  // Return the blacklisted special chars that are encodable using 7-bit ascii
  function getBlacklistAscii(){
    var blacklist = '!@#$%^&*()+=[]\\\';,/{}|":<>?~`.-_';
    blacklist += ' '; // 'Space' is on the blacklist but can be enabled using the 'allowSpace' config entry
    return blacklist;
  }

  // Return the blacklisted special chars that are NOT encodable using 7-bit ascii
  // We want this .js file to be encoded using 7-bit ascii so it can reach the widest possible audience
  // Higher order chars must be escaped eg "\xAC"
  // Not too worried about comments containing higher order characters for now (let's wait and see if it becomes a problem)
  function getBlacklistNonAscii(){
    var blacklist =
        '\xAC'     // ¬
      + '\u20AC'   // €
      + '\xA3'     // £
      + '\xA6'     // ¦
      ;
    return blacklist;
  }

  // End Settings ////////////////////////////////////////////////////////


  // Implementation details go here ////////////////////////////////////////////////////////

  function setupEventHandlers($textboxes, trimFunction, settings) {

    $textboxes.each(function(){

      var $textbox = $(this);

      $textbox
        // Unbind existing alphanum event handlers
        .off('.alphanum')

        .on('keyup.alphanum change.alphanum paste.alphanum', function(e){

          var pastedText = '';

          if(e.originalEvent && e.originalEvent.clipboardData && e.originalEvent.clipboardData.getData)
            pastedText = e.originalEvent.clipboardData.getData('text/plain');

          // setTimeout is necessary for handling the 'paste' event
          setTimeout(function(){
            trimTextbox($textbox, trimFunction, settings, pastedText);
          }, 0);
        })

        .on('keypress.alphanum', function(e){

        // Determine which key is pressed.
        // If it's a control key, then allow the event's default action to occur eg backspace, tab
          var charCode = !e.charCode ? e.which : e.charCode;
          if(isControlKey(charCode)
          || e.ctrlKey
          || e.metaKey ) // cmd on MacOS
            return;

          var newChar         = String.fromCharCode(charCode);

          // Determine if some text was selected / highlighted when the key was pressed
          var selectionObject = $textbox.selection();
          var start = selectionObject.start;
          var end   = selectionObject.end;

          var textBeforeKeypress  = $textbox.val();

          // The new char may be inserted:
          //  1) At the start
          //  2) In the middle
          //  3) At the end
          //  4) User highlights some text and then presses a key which would replace the highlighted text
          //
          // Here we build the string that would result after the keypress.
          // If the resulting string is invalid, we cancel the event.
          // Unfortunately, it isn't enough to just check if the new char is valid because some chars
          // are position sensitive eg the decimal point '.'' or the minus sign '-'' are only valid in certain positions.
          var potentialTextAfterKeypress = textBeforeKeypress.substring(0, start) + newChar + textBeforeKeypress.substring(end);
          var validatedText              = trimFunction(potentialTextAfterKeypress, settings);

          // If the keypress would cause the textbox to contain invalid characters, then cancel the keypress event
          if(validatedText != potentialTextAfterKeypress)
            e.preventDefault();
        });
    });

  }

  // Ensure the text is a valid number when focus leaves the textbox
  // This catches the case where a user enters '-' or '.' without entering any digits
  function numericField_Blur(inputBox, settings) {
    var fieldValueNumeric = parseFloat($(inputBox).val());
    var $inputBox = $(inputBox);

    if(isNaN(fieldValueNumeric)) {
      $inputBox.val('');
      return;
    }

    if(isNumeric(settings.min) && fieldValueNumeric < settings.min)
      $inputBox.val('');

    if(isNumeric(settings.max) && fieldValueNumeric > settings.max)
      $inputBox.val('');
  }

  function isNumeric(value) {
    return !isNaN(value);
  }

  function isControlKey(charCode) {

    if(charCode >= 32)
      return false;
    if(charCode == 10)
      return false;
    if(charCode == 13)
      return false;

    return true;
  }

  // One way to prevent a character being entered is to cancel the keypress event.
  // However, this gets messy when you have to deal with things like copy paste which isn't a keypress.
  // Which event gets fired first, keypress or keyup? What about IE6 etc etc?
  // Instead, it's easier to allow the 'bad' character to be entered and then to delete it immediately after.

  function trimTextbox($textBox, trimFunction, settings, pastedText){

    var inputString = $textBox.val();

    if(inputString == '' && pastedText.length > 0)
      inputString = pastedText;

    var outputString = trimFunction(inputString, settings);

    if(inputString == outputString)
      return;

    var caretPos = $textBox.alphanum_caret();

    $textBox.val(outputString);

    //Reset the caret position
    if(inputString.length ==(outputString.length + 1))
      $textBox.alphanum_caret(caretPos - 1);
    else
      $textBox.alphanum_caret(caretPos);
  }

  function getCombinedSettingsAlphaNum(settings, defaultSettings){
    if(typeof defaultSettings == 'undefined')
      defaultSettings = DEFAULT_SETTINGS_ALPHANUM;
    var userSettings, combinedSettings = {};
    if(typeof settings === 'string')
      userSettings = CONVENIENCE_SETTINGS_ALPHANUM[settings];
    else if(typeof settings == 'undefined')
      userSettings = {};
    else
      userSettings = settings;

    $.extend(combinedSettings, defaultSettings, userSettings);

    if(typeof combinedSettings.blacklist == 'undefined')
      combinedSettings.blacklistSet = getBlacklistSet(combinedSettings.allow, combinedSettings.disallow);

    return combinedSettings;
  }

  function getCombinedSettingsNum(settings){
    var userSettings, combinedSettings = {};
    if(typeof settings === 'string')
      userSettings = CONVENIENCE_SETTINGS_NUMERIC[settings];
    else if(typeof settings == 'undefined')
      userSettings = {};
    else
      userSettings = settings;

    $.extend(combinedSettings, DEFAULT_SETTINGS_NUM, userSettings);

    return combinedSettings;
  }


  // This is the heart of the algorithm
  function alphanum_allowChar(validatedStringFragment, Char, settings){

    if(settings.maxLength && validatedStringFragment.length >= settings.maxLength)
      return false;

    if(settings.allow.indexOf(Char) >=0 )
      return true;

    if(settings.allowSpace && (Char == ' '))
      return true;

    if(!settings.allowNewline && (Char == '\n' || Char == '\r'))
      return false;

    if(settings.blacklistSet.contains(Char))
      return false;

    if(!settings.allowNumeric && DIGITS[Char])
      return false;

    if(!settings.allowUpper && isUpper(Char))
      return false;

    if(!settings.allowLower && isLower(Char))
      return false;

    if(!settings.allowCaseless && isCaseless(Char))
      return false;

    if(!settings.allowLatin && LATIN_CHARS.contains(Char))
      return false;

    if(!settings.allowOtherCharSets){
      if(DIGITS[Char] || LATIN_CHARS.contains(Char))
        return true;
      else
        return false;
    }

    return true;
  }

  function numeric_allowChar(validatedStringFragment, Char, settings){

    if(DIGITS[Char]) {

      if(isMaxDigitsReached(validatedStringFragment, settings))
        return false;

      if(isMaxPreDecimalsReached(validatedStringFragment, settings))
        return false;

      if(isMaxDecimalsReached(validatedStringFragment, settings))
        return false;

      if(isGreaterThanMax(validatedStringFragment + Char, settings))
        return false;

      if(isLessThanMin(validatedStringFragment + Char, settings))
        return false;

      return true;
    }

    if(settings.allowPlus && Char == '+' && validatedStringFragment == '')
      return true;

    if(settings.allowMinus && Char == '-' && validatedStringFragment == '')
      return true;

    if(Char == THOU_SEP && settings.allowThouSep && allowThouSep(validatedStringFragment))
      return true;

    if(Char == DEC_SEP) {
      // Only one decimal separator allowed
      if(validatedStringFragment.indexOf(DEC_SEP) >= 0)
        return false;
      // Don't allow decimal separator when maxDecimalPlaces is set to 0
      if(settings.allowDecSep && settings.maxDecimalPlaces === 0)
        return false;
      if(settings.allowDecSep)
        return true;
    }

    return false;
  }

  function countDigits(string) {

    // Error handling, nulls etc
    string = string + '';

    // Count the digits
    return string.replace(/[^0-9]/g,'').length;
  }

  function isMaxDigitsReached(string, settings) {

    var maxDigits = settings.maxDigits;

    if(maxDigits === '' || isNaN(maxDigits))
      return false; // In this case, there is no maximum

    var numDigits = countDigits(string);

    if(numDigits >= maxDigits)
      return true;

    return false;
  }

  function isMaxDecimalsReached(string, settings) {

    var maxDecimalPlaces = settings.maxDecimalPlaces;

    if(maxDecimalPlaces === '' || isNaN(maxDecimalPlaces))
      return false; // In this case, there is no maximum

    var indexOfDecimalPoint = string.indexOf(DEC_SEP);

    if(indexOfDecimalPoint == -1)
      return false;

    var decimalSubstring = string.substring(indexOfDecimalPoint);
    var numDecimals = countDigits(decimalSubstring);

    if(numDecimals >= maxDecimalPlaces)
      return true;

    return false;
  }

  function isMaxPreDecimalsReached(string, settings) {

    var maxPreDecimalPlaces = settings.maxPreDecimalPlaces;

    if(maxPreDecimalPlaces === '' || isNaN(maxPreDecimalPlaces))
      return false; // In this case, there is no maximum

    var indexOfDecimalPoint = string.indexOf(DEC_SEP);

    if(indexOfDecimalPoint >= 0)
      return false;

    var numPreDecimalDigits = countDigits(string);

    if(numPreDecimalDigits >= maxPreDecimalPlaces)
      return true;

    return false;
  }

  function isGreaterThanMax(numericString, settings) {

    if(!settings.max || settings.max < 0)
      return false;

    var outputNumber = parseFloat(numericString);
    if(outputNumber > settings.max)
      return true;

    return false;
  }

  function isLessThanMin(numericString, settings) {

    if(!settings.min || settings.min > 0)
      return false;

    var outputNumber = parseFloat(numericString);
    if(outputNumber < settings.min)
      return true;

    return false;
  }

  /********************************
   * Trims a string according to the settings provided
   ********************************/
  function trimAlphaNum(inputString, settings){

    if(typeof inputString != 'string')
      return inputString;

    var inChars = inputString.split('');
    var outChars = [];
    var i = 0;
    var Char;

    for(i=0; i<inChars.length; i++){
      Char = inChars[i];
      var validatedStringFragment = outChars.join('');
      if(alphanum_allowChar(validatedStringFragment, Char, settings))
        outChars.push(Char);
    }

    var outputString = outChars.join('');

    if(settings.forceLower)
      outputString = outputString.toLowerCase();
    else if(settings.forceUpper)
      outputString = outputString.toUpperCase();

    return outputString;
  }

  function trimNum(inputString, settings){
    if(typeof inputString != 'string')
      return inputString;

    var inChars = inputString.split('');
    var outChars = [];
    var i = 0;
    var Char;

    for(i=0; i<inChars.length; i++){
      Char = inChars[i];
      var validatedStringFragment = outChars.join('');
      if(numeric_allowChar(validatedStringFragment, Char, settings))
        outChars.push(Char);
    }

    return outChars.join('');
  }

  function isUpper(Char){
    var upper = Char.toUpperCase();
    var lower = Char.toLowerCase();

    if( (Char == upper) && (upper != lower))
      return true;
    else
      return false;
  }

  function isLower(Char){
    var upper = Char.toUpperCase();
    var lower = Char.toLowerCase();

    if( (Char == lower) && (upper != lower))
      return true;
    else
      return false;
  }

  function isCaseless(Char){
    if(Char.toUpperCase() == Char.toLowerCase())
      return true;
    else
      return false;
  }

  function getBlacklistSet(allow, disallow){

    var setOfBadChars  = new Set(BLACKLIST + disallow);
    var setOfGoodChars = new Set(allow);

    var blacklistSet   = setOfBadChars.subtract(setOfGoodChars);

    return blacklistSet;
  }

  function getDigitsMap(){
    var array = '0123456789'.split('');
    var map = {};
    var i = 0;
    var digit;

    for(i=0; i<array.length; i++){
      digit = array[i];
      map[digit] = true;
    }

    return map;
  }

  function getLatinCharsSet(){
    var lower = 'abcdefghijklmnopqrstuvwxyz';
    var upper = lower.toUpperCase();
    var azAZ = new Set(lower + upper);

    return azAZ;
  }

  function allowThouSep(currentString) {

    // Can't start with a THOU_SEP
    if(currentString.length == 0)
      return false;

    // Can't have a THOU_SEP anywhere after a DEC_SEP
    var posOfDecSep = currentString.indexOf(DEC_SEP);
    if(posOfDecSep >= 0)
      return false;

    var posOfFirstThouSep       = currentString.indexOf(THOU_SEP);

    // Check if this is the first occurrence of a THOU_SEP
    if(posOfFirstThouSep < 0)
      return true;

    var posOfLastThouSep        = currentString.lastIndexOf(THOU_SEP);
    var charsSinceLastThouSep   = currentString.length - posOfLastThouSep - 1;

    // Check if there has been 3 digits since the last THOU_SEP
    if(charsSinceLastThouSep < 3)
      return false;

    var digitsSinceFirstThouSep = countDigits(currentString.substring(posOfFirstThouSep));

    // Check if there has been a multiple of 3 digits since the first THOU_SEP
    if((digitsSinceFirstThouSep % 3) > 0)
      return false;

    return true;
  }

  ////////////////////////////////////////////////////////////////////////////////////
  // Implementation of a Set
  ////////////////////////////////////////////////////////////////////////////////////
  function Set(elems){
    if(typeof elems == 'string')
      this.map = stringToMap(elems);
    else
      this.map = {};
  }

  Set.prototype.add = function(set){

    var newSet = this.clone();

    for(var key in set.map)
      newSet.map[key] = true;

    return newSet;
  };

  Set.prototype.subtract = function(set){

    var newSet = this.clone();

    for(var key in set.map)
      delete newSet.map[key];

    return newSet;
  };

  Set.prototype.contains = function(key){
    if(this.map[key])
      return true;
    else
      return false;
  };

  Set.prototype.clone = function(){
    var newSet = new Set();

    for(var key in this.map)
      newSet.map[key] = true;

    return newSet;
  };
  ////////////////////////////////////////////////////////////////////////////////////

  function stringToMap(string){
    var map = {};
    var array = string.split('');
    var i=0;
    var Char;

    for(i=0; i<array.length; i++){
      Char = array[i];
      map[Char] = true;
    }

    return map;
  }

  // Backdoor for testing
  $.fn.alphanum.backdoorAlphaNum = function(inputString, settings){
    var combinedSettings = getCombinedSettingsAlphaNum(settings);

    return trimAlphaNum(inputString, combinedSettings);
  };

  $.fn.alphanum.backdoorNumeric = function(inputString, settings){
    var combinedSettings = getCombinedSettingsNum(settings);

    return trimNum(inputString, combinedSettings);
  };

  $.fn.alphanum.setNumericSeparators = function(settings) {

    if(settings.thousandsSeparator.length != 1)
      return;

    if(settings.decimalSeparator.length != 1)
      return;

    THOU_SEP = settings.thousandsSeparator;
    DEC_SEP = settings.decimalSeparator;
  };

})( jQuery );

/*eslint-disable */
//Include the 3rd party lib: jquery.caret.js


// Set caret position easily in jQuery
// Written by and Copyright of Luke Morton, 2011
// Licensed under MIT
(function ($) {
  // Behind the scenes method deals with browser
  // idiosyncrasies and such
  function caretTo(el, index) {
    if (el.createTextRange) {
      var range = el.createTextRange();
      range.move("character", index);
      range.select();
    } else if (el.selectionStart != null) {
      el.focus();
      el.setSelectionRange(index, index);
    }
  };

  // Another behind the scenes that collects the
  // current caret position for an element

  // TODO: Get working with Opera
  function caretPos(el) {
    if ("selection" in document) {
      var range = el.createTextRange();
      try {
        range.setEndPoint("EndToStart", document.selection.createRange());
      } catch (e) {
        // Catch IE failure here, return 0 like
        // other browsers
        return 0;
      }
      return range.text.length;
    } else if (el.selectionStart != null) {
      return el.selectionStart;
    }
  };

  // The following methods are queued under fx for more
  // flexibility when combining with $.fn.delay() and
  // jQuery effects.

  // Set caret to a particular index
  $.fn.alphanum_caret = function (index, offset) {
    if (typeof(index) === "undefined") {
      return caretPos(this.get(0));
    }

    return this.queue(function (next) {
      if (isNaN(index)) {
        var i = $(this).val().indexOf(index);

        if (offset === true) {
          i += index.length;
        } else if (typeof(offset) !== "undefined") {
          i += offset;
        }

        caretTo(this, i);
      } else {
        caretTo(this, index);
      }

      next();
    });
  };
}(jQuery));

/**********************************************************
* Selection Library
* Used to determine what text is highlighted in the textbox before a key is pressed.
* http://donejs.com/docs.html#!jQuery.fn.selection
* https://github.com/jupiterjs/jquerymx/blob/master/dom/selection/selection.js
***********************************************************/
(function(e){var t=function(e){return e.replace(/([a-z])([a-z]+)/gi,function(e,t,n){return t+n.toLowerCase()}).replace(/_/g,"")},n=function(e){return e.replace(/^([a-z]+)_TO_([a-z]+)/i,function(e,t,n){return n+"_TO_"+t})},r=function(e){return e?e.ownerDocument.defaultView||e.ownerDocument.parentWindow:window},i=function(t,n){var r=e.Range.current(t).clone(),i=e.Range(t).select(t);if(!r.overlaps(i)){return null}if(r.compare("START_TO_START",i)<1){startPos=0;r.move("START_TO_START",i)}else{fromElementToCurrent=i.clone();fromElementToCurrent.move("END_TO_START",r);startPos=fromElementToCurrent.toString().length}if(r.compare("END_TO_END",i)>=0){endPos=i.toString().length}else{endPos=startPos+r.toString().length}return{start:startPos,end:endPos}},s=function(t){var n=r(t);if(t.selectionStart!==undefined){if(document.activeElement&&document.activeElement!=t&&t.selectionStart==t.selectionEnd&&t.selectionStart==0){return{start:t.value.length,end:t.value.length}}return{start:t.selectionStart,end:t.selectionEnd}}else if(n.getSelection){return i(t,n)}else{try{if(t.nodeName.toLowerCase()=="input"){var s=r(t).document.selection.createRange(),o=t.createTextRange();o.setEndPoint("EndToStart",s);var u=o.text.length;return{start:u,end:u+s.text.length}}else{var a=i(t,n);if(!a){return a}var f=e.Range.current().clone(),l=f.clone().collapse().range,c=f.clone().collapse(false).range;l.moveStart("character",-1);c.moveStart("character",-1);if(a.startPos!=0&&l.text==""){a.startPos+=2}if(a.endPos!=0&&c.text==""){a.endPos+=2}return a}}catch(h){return{start:t.value.length,end:t.value.length}}}},o=function(e,t,n){var i=r(e);if(e.setSelectionRange){if(n===undefined){e.focus();e.setSelectionRange(t,t)}else{e.select();e.selectionStart=t;e.selectionEnd=n}}else if(e.createTextRange){var s=e.createTextRange();s.moveStart("character",t);n=n||t;s.moveEnd("character",n-e.value.length);s.select()}else if(i.getSelection){var o=i.document,u=i.getSelection(),f=o.createRange(),l=[t,n!==undefined?n:t];a([e],l);f.setStart(l[0].el,l[0].count);f.setEnd(l[1].el,l[1].count);u.removeAllRanges();u.addRange(f)}else if(i.document.body.createTextRange){var f=document.body.createTextRange();f.moveToElementText(e);f.collapse();f.moveStart("character",t);f.moveEnd("character",n!==undefined?n:t);f.select()}},u=function(e,t,n,r){if(typeof n[0]==="number"&&n[0]<t){n[0]={el:r,count:n[0]-e}}if(typeof n[1]==="number"&&n[1]<=t){n[1]={el:r,count:n[1]-e};}},a=function(e,t,n){var r,i;n=n||0;for(var s=0;e[s];s++){r=e[s];if(r.nodeType===3||r.nodeType===4){i=n;n+=r.nodeValue.length;u(i,n,t,r)}else if(r.nodeType!==8){n=a(r.childNodes,t,n)}}return n};jQuery.fn.selection=function(e,t){if(e!==undefined){return this.each(function(){o(this,e,t)})}else{return s(this[0])}};e.fn.selection.getCharElement=a})(jQuery);
/*eslint-enable */;
// source --> https://dsmirror.tecknolab.com/wp-content/plugins/pie-register/assets/js/piereg_validation.js?ver=3.8.2 
/*
 * Inline Form Validation Engine 1.0, jQuery plugin
 *
 * Copyright(c) 2014
 *
 * 1.0 Rewrite by Baqar Hassan
 *
 */
var piereg = jQuery.noConflict();

piereg(document).ready(function($){
	(function($){
		var IsWidgetFields = false;
		/* Validate On Blur widget Field(s) */
		piereg(".widget .pieregWrapper .fieldset .input_fields").on("blur",function(){
			var piereg_validate = true;
			var rulesParsing = piereg(this).attr("class");
			if(rulesParsing !== null)
			{
				var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
				if(getRules !== null){
					var str = getRules[1];
					var rules = str.split(/\[|,|\]/);
					
					if( piereg(this).hasClass('hasDatepicker') && piereg(this).val() == "" )
					{
						// skip validate on blur if datepicker on empty.
					} else {
						piereg_validate = ValidateField(rules,this,true,".widget ");
					}
				}
			}

		});

		/* Validate On Blur Elementor widget Field(s) */
		piereg(".elementor-widget-container .pieregWrapper .fieldset .input_fields").on("blur",function(){
			var piereg_validate = true;
			var rulesParsing = piereg(this).attr("class");
			if(rulesParsing !== null)
			{
				var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
				if(getRules !== null){
					var str = getRules[1];
					var rules = str.split(/\[|,|\]/);
					
					if( piereg(this).hasClass('hasDatepicker') && piereg(this).val() == "" )
					{
						// skip validate on blur if datepicker on empty.
					} else {
						piereg_validate = ValidateField(rules,this,true,".widget ");
					}
				}
			}

		});

		/* Validate On Blur Field(s) */
		piereg(".pieregWrapper").each(function()
		{
			piereg(this).find(".fieldset .input_fields").on("blur",function()
			{
				var piereg_validate = true;
				var rulesParsing = piereg(this).attr("class");
				if(rulesParsing !== null)
				{
					var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
					if(getRules !== null){
						var str = getRules[1];
						var rules = str.split(/\[|,|\]/);
						
						if( piereg(this).hasClass('hasDatepicker') && piereg(this).val() == "" )
						{
							// skip validate on blur if datepicker on empty.
						} else {
							piereg_validate = ValidateField(rules,this,piereg_validate,"");
							
						}	
					}
				}
			});
		});

		/* Validate On Submit Renew Account's Field(s) */
		piereg("#piereg_loginform").on("submit",function(){
			var piereg_validate = true;
			piereg("#piereg_loginform ul li .input_fields").each(function(i,obj){
				var rulesParsing = piereg(obj).attr("class");
				if(rulesParsing !== null)
				{
					var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
					if(getRules !== null){
						var str = getRules[1];
						var rules = str.split(/\[|,|\]/);
						piereg_validate = ValidateField(rules,obj,piereg_validate,"");
					}
				}
			});

			if(!piereg_validate)
				return false;
		});

		/* Validate On Submit Login Form Field(s)*/
		piereg("#piereg_login_form").on("submit",function(){
			var piereg_validate = true;
			piereg("#piereg_login_form ul li .input_fields").each(function(i,obj){
				var rulesParsing = piereg(obj).attr("class");
				if(rulesParsing !== null)
				{
					var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
					if(getRules !== null){
						var str = getRules[1];
						var rules = str.split(/\[|,|\]/);
						piereg_validate = ValidateField(rules,obj,piereg_validate,"");
					}
				}
			});
			if(!piereg_validate)
				return false;
		});
		// Field Visibility Plugin
		
		piereg(".control_visibility").css({
			"display" : "none"
		});
		
		/* Validate On Submit Widget Login Form Field(s)*/
		piereg("#piereg_login_form_widget").on("submit",function(){
			var piereg_validate = true;
			piereg("#piereg_login_form_widget ul li .input_fields").each(function(i,obj){
				var rulesParsing = piereg(obj).attr("class");
				if(rulesParsing !== null)
				{
					var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
					if(getRules !== null){
						var str = getRules[1];
						var rules = str.split(/\[|,|\]/);
						piereg_validate = ValidateField(rules,obj,piereg_validate,"");
					}
				}
			});
			if(!piereg_validate)
				return false;
		});		
		
		/* Validate On Submit widget Field(s) */
		piereg("form#pie_widget_regiser_form").on("submit",function(){
			var piereg_validate = true;
			piereg(this).find( "ul .input_fields" ).each(function(i,obj) {
			 
				var rulesParsing = piereg(obj).attr("class");
				if(rulesParsing !== null)
				{
					var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
					if(getRules !== null){
						var str = getRules[1];
						var rules = str.split(/\[|,|\]/);
						piereg_validate = ValidateField(rules,obj,piereg_validate,"");
					}
				}
			});
			if(!piereg_validate){
				piereg('html,body').animate({scrollTop: piereg("div.error").offset().top},'slow');
				return false;
			}
			else{
				btn = piereg('#pie_widget_regiser_form input[name="pie_submit"]');
				btn.val(piereg_process_submission);
				btn.parent().parent().on('click', function(){
					return false;
				});
			}
		});
		
		/* Remove validation and strength meter default on Reset (Widget) */
		piereg("#pie_widget_regiser_form input[type='reset']").on("click",function(){
			piereg( "#pie_widget_regiser_form ul .input_fields" ).each(function(i,obj) {
				piereg(obj).closest("li").find(".legend_txt").remove();
				piereg(obj).closest("div.fieldset").removeClass("error");
			});				
			if( piereg('#piereg_passwordStrength_widget').length > 0  ) {
				piereg( "#piereg_passwordStrength_widget" ).removeAttr('class').attr('class', '');
				piereg( "#piereg_passwordStrength_widget" ).addClass("piereg_pass");
				piereg( "#piereg_passwordStrength_widget" ).html("Strength Indicator");
			}
		});
		
		/* Remove validation and strength meter default on Reset */
		piereg("#pie_regiser_form input[type='reset']").on("click",function(){
			piereg( "#pie_regiser_form ul .input_fields" ).each(function(i,obj) {
				piereg(obj).closest("li").find(".legend_txt").remove();
				piereg(obj).closest("div.fieldset").removeClass("error");
			});
			
			if( piereg('#piereg_passwordStrength').length > 0  ) {
				piereg( "#piereg_passwordStrength" ).removeAttr('class').attr('class', '');
				piereg( "#piereg_passwordStrength" ).addClass("piereg_pass");
				piereg( "#piereg_passwordStrength" ).html("Strength Indicator");
			}
		});
		
		/* Validate On Submit Field(s) */
		piereg("form#pie_regiser_form").on("submit",function(){

			var piereg_validate = true;
			piereg(this).find("ul .input_fields" ).each(function(i,obj) {
				var rulesParsing = piereg(obj).attr("class");
				if(rulesParsing !== null)
				{
					var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
					if(getRules !== null){
						var str = getRules[1];
						var rules = str.split(/\[|,|\]/);
						piereg_validate = ValidateField(rules,obj,piereg_validate,"");
					}
				}
			});
			if(!piereg_validate){
				piereg('html,body').animate({scrollTop: piereg("div.error").offset().top},'slow');
				return false;
			}
			else{
				btn = piereg('#pie_regiser_form input[name="pie_submit"]');
				btn.val(piereg_process_submission);
				btn.parent().parent().on('click', function(){
					return false;
				});
			}
		});
		
		/* Validate Next Page widget Field(s) */
		piereg(".widget #pie_widget_regiser_form input[name='pie_next']").click(function(){
			var selectedForm = piereg(this).closest('#pie_widget_regiser_form');
			if (selectedForm.length > 0)
			{
				var piereg_validate = true;
				selectedForm.find( "ul .input_fields" ).each(function(i,obj) {
					if(piereg(obj).closest("li").is(':visible'))
					{
						var rulesParsing = piereg(obj).attr("class");
						if(rulesParsing !== null)
						{
							var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
							if(getRules !== null){
								var str = getRules[1];
								var rules = str.split(/\[|,|\]/);
								piereg_validate = ValidateField(rules,obj,piereg_validate,".widget ");
							}
						}
					}
				});
				if(piereg_validate)
				{
					pieNextPage(this);	
				}  else {
					piereg('html,body').animate({scrollTop: piereg("div.error").offset().top},'slow');
				}
			}
		});
   
		/* Validate Next Page Elementor widget Field(s) */
		piereg(".elementor-widget-container #pie_widget_regiser_form .piewid_pie_next").click(function(){
			var piereg_validate = true;
			piereg( ".elementor-widget-container #pie_widget_regiser_form ul .input_fields" ).each(function(i,obj) {
				if(piereg(obj).closest("li").is(':visible'))
				{
					var rulesParsing = piereg(obj).attr("class");
					if(rulesParsing !== null)
					{
						var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
						if(getRules !== null){
							var str = getRules[1];
							var rules = str.split(/\[|,|\]/);
							piereg_validate = ValidateField(rules,obj,piereg_validate,".widget ");
						}
					}
				}
			});
			if(piereg_validate)
			{
				pieNextPage(this);	
			}
		});

		/* Validate Next Page Field(s) */
		piereg("#pie_regiser_form .pie_next").click(function(){
			var selectedForm = piereg(this).closest('#pie_regiser_form').not(".widget #pie_regiser_form");
			if (selectedForm.length > 0)
			{
				var piereg_validate = true;
				selectedForm.find( "ul .input_fields" ).not(".widget #pie_regiser_form ul .input_fields").each(function(i,obj) {
					if(piereg(obj).closest("li").is(':visible'))
					{
						var rulesParsing = piereg(obj).attr("class");
						if(rulesParsing !== null)
						{
							var getRules = /piereg_validate\[(.*)\]/.exec(rulesParsing);
							if(getRules !== null){
								var str = getRules[1];
								var rules = str.split(/\[|,|\]/);
								piereg_validate = ValidateField(rules,obj,piereg_validate,"");
							}
						}
					}
				});
				if(piereg_validate)
				{
					pieNextPage(this);	
				} else {
					piereg('html,body').animate({scrollTop: piereg("div.error").offset().top},'slow');
				}
			}
		});
		
		piereg("#pie_regiser_form .pie_prev").click(function (){  
			pieNextPage(this);
		}); 
		
		piereg("#pie_widget_regiser_form .pie_prev").click(function (){  
			pieNextPage(this);
		}); 
		
		piereg('input[name="pie_reset"]').click(function(){
			piereg("#pie_register").find(".legend_txt").remove();
			piereg("#pie_register").find("div.fieldset").removeClass("error");
		});
		
	})(jQuery);
	
	piereg("input.piereg_username_input_field").alphanum({
		allow              : '_-@.',    // Allow extra characters
		disallow           : '',    // Disallow extra characters
		allowSpace         : false,  // Allow the space character
		allowNumeric       : true,  // Allow digits 0-9
		allowUpper         : true,  // Allow upper case characters
		allowLower         : true,  // Allow lower case characters
		allowCaseless      : true,  // Allow characters that do not have both upper & lower variants
									// eg Arabic or Chinese
		allowLatin         : true,  // a-z A-Z
		allowOtherCharSets : true,  // eg �, �, Arabic, Chinese etc
		forceUpper         : false, // Convert lower case characters to upper case
		forceLower         : false, // Convert upper case characters to lower case
		maxLength          : NaN    // eg Max Length
	});	
	
	piereg("input.piereg_name_input_field").alphanum({
		allow              : '-.\'',    // Allow extra characters
		disallow           : '',    // Disallow extra characters
		allowSpace         : true,  // Allow the space character
		allowNumeric       : false,  // Allow digits 0-9
		allowUpper         : true,  // Allow upper case characters
		allowLower         : true,  // Allow lower case characters
		allowCaseless      : true,  // Allow characters that do not have both upper & lower variants
									// eg Arabic or Chinese
		allowLatin         : true,  // a-z A-Z
		allowOtherCharSets : true,  // eg �, �, Arabic, Chinese etc
		forceUpper         : false, // Convert lower case characters to upper case
		forceLower         : false, // Convert upper case characters to lower case
		maxLength          : NaN    // eg Max Length
	});	
});

function getCursorPosition(classname){
	var ctl = document.querySelector(classname);
    var startPos = ctl.selectionStart;
    var endPos = ctl.selectionEnd;
    return endPos;  
}

piereg.fn.setCursorPosition = function(start, end) {
    if(!end) end = start; 
    return this.each(function() {
        if (this.setSelectionRange) {
            this.focus();
            this.setSelectionRange(start, end);
        } else if (this.createTextRange) {
            var range = this.createTextRange();
            range.collapse(true);
            range.moveEnd('character', end);
            range.moveStart('character', start);
            range.select();
        }
    });
};

function validImportForm(form, inputclass){
	
	if(inputclass)	 
	{
		if(piereg(inputclass).val().length == "0")
		{ 
			alert("No file selected.");
			return false;
		}		
	} 
	
	if( window.confirm("Are you sure, you want to overwrite all your existing settings?") )
	{
		form.submit();	
	}
}
// Validate Date 
function validatedate(dateString){   
    let dateformat = /^(0?[1-9]|1[0-2])[\/](0?[1-9]|[1-2][0-9]|3[01])[\/]\d{4}$/;      
          
    // Match the date format through regular expression      
    if(dateString.match(dateformat)){      
        let operator = dateString.split('/');      
      
        // Extract the string into month, date and year      
        let datepart = [];      
        if (operator.length>1){      
            datepart = dateString.split('/');      
        }      
        let month= parseInt(datepart[0]);      
        let day = parseInt(datepart[1]);      
        let year = parseInt(datepart[2]);      

        // Create list of days of a month      
        let ListofDays = [31,28,31,30,31,30,31,31,30,31,30,31];      
        if (month==1 || month>2){      
            if (day>ListofDays[month-1]){      
                ///This check is for Confirming that the date is not out of its range      
                return false;      
            }      
        }else if (month==2){      
            let leapYear = false;      
            if ( (!(year % 4) && year % 100) || !(year % 400)) {      
                leapYear = true;      
            }      
            if ((leapYear == false) && (day>=29)){      
                return false;      
            }else      
            if ((leapYear==true) && (day>29)){            
                return false;      
            }      
        }      
    }else{         
        return false;      
    }      
    return true;      
} 
function ValidateField(rules,option,piereg_validate,IsWidget){
	var getAllRules = getRegexAndErrorMsg();
	var breakLoop = false;
	var $this_fields_is_display = piereg(option).closest('.fields').css('display');
	
	for (var i = 0; i < rules.length; i++) {
		switch(rules[i]){
			case "required":
				switch(piereg(option).attr("type")){
					case "radio":
					case "checkbox":
						if($this_fields_is_display == 'none'){
							RemoveErrorMsg(option);
						}else{
							pieregchecked = false;
							var $checked = false;
							piereg(IsWidget+"input[data-map-field-by-class="+(piereg(option).attr("data-map-field-by-class"))+"]").each(function(i,obj) {
								if(piereg(obj).prop("checked"))
								{
									$checked = true;
								}
							});
													
							if(!$checked) 
							{
								ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.required.alertText));
								breakLoop = true;
							}else{
								RemoveErrorMsg(option);
							}
						}
					break;
					default:
						if( piereg(option).attr("data-type") == "list" )
						{
							var hasError = 0;
							var totalFields = piereg(".pie_list_cover").find(".input_fields").length;
							piereg(".pie_list_cover").find("input[type=text]").each(function(i,obj){
								if(piereg(this).val() !== "" )
								{
									err_remain = hasError;	
								}else
								{
									hasError++;
								}

							});
							
							if(hasError<totalFields)
							{
								RemoveErrorMsg(option);
														
							}else{
								ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.list.alertText));
								breakLoop = true;
								
							}			
						} else if(piereg(option).attr("data-type") == 'recaptcha'){
							var recaptcha = piereg(option).find(".g-recaptcha-response").val();
							if (recaptcha === "") {
								ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.required.alertText));
								breakLoop = true;
							}else{
								RemoveErrorMsg(option);
							}
						}
						else
						{
							
							if($this_fields_is_display == 'none'){
								RemoveErrorMsg(option);
							}else{
								if(piereg(option).val() == "" || (piereg(option).prop('type') == 'select-multiple' && piereg(option).val() == null) ){
									ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.required.alertText));
									breakLoop = true;
								}else{
									RemoveErrorMsg(option);
								}
							}
						}
						
						
					break;
				}
					
				
			break;
			case "equals":
				i++;
				
				var field_confirm 	= piereg(option).val().trim();
				var field_value     = piereg(piereg(piereg(option).parent().parent().parent()).find("#"+rules[i])).val();
				
				if (typeof(field_value) === 'undefined' ) 
				{
					field_value     = piereg("#"+rules[i]).val();
				}
				var field_value     = field_value.trim();

				// To check if rule is email
				if(rules[i].indexOf('email_') !== -1) {
					var field_confirm 	= field_confirm.toLowerCase();
					var field_value 	= field_value.toLowerCase();
				} 
				
				if(field_confirm != field_value){
					ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.equals.alertText));
					breakLoop = true;
				}else{
					RemoveErrorMsg(option);
				}
			break;
			case "custom":
				i++;
				var regex,alertText;
				switch(rules[i]){
					case "email":
					case "number":
					case "alphanumeric":
					case "url":
					case "phone_standard":
					case "phone_international":
					case "month":
					case "day":
					case "year":
					case "alphabetic":	
						if(!piereg(option).val().trim().match(new RegExp(getAllRules[rules[i]].regex),piereg(option).val().trim()))
						{
							if(piereg(option).val().trim() == "") {
								RemoveErrorMsg(option);
							} else {
								ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules[rules[i]].alertText));
								breakLoop = true;
							}
						}else{
							RemoveErrorMsg(option);
						}
						
					break;
					
				}
				if( piereg(option).attr("data-type") == "date" )
				{
					var id = piereg(option).attr('id');
					id = id.slice((id.indexOf("_"))+1);

					mm = piereg('#mm_'+id).val();
					dd = piereg('#dd_'+id).val();
					yy = piereg('#yy_'+id).val();

					
					if ( (mm != "") && (dd != "") && (yy != "") )
					{
						dateString = mm+'/'+dd+'/'+yy;
						validateDate = validatedate(dateString);

						if(validateDate == false)
						{
							ShowErrorMsg(option,"Invalid Date");
							breakLoop = true;						
						}
						else
						{
							RemoveErrorMsg(option);
						}
					}
				}
				
			break;			
			case "username":
			//case "alphabetic":
				
				if(piereg(option).val().trim().match(new RegExp(getAllRules.username.regex),piereg(option).val().trim()))
				{
					ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.username.alertText));
					breakLoop = true;
				}else{
					RemoveErrorMsg(option);
				}
				
			break;			
			case "minSize":
				i++;
				if(piereg(option).val().trim() != ""){
					var strlen = piereg(option).val().trim();
					if(rules[i] > strlen.length)
					{
						ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.minSize.alertText+" "+rules[i]+" "+getAllRules.minSize.alertText2));
						breakLoop = true;
					}else{
						RemoveErrorMsg(option);
					}
				}
			break;
			case "maxSize":
				i++;
				if(piereg(option).val().trim())
				{
					var strlen = piereg(option).val().trim();
					if(rules[i] < strlen.length)
					{
						ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.maxSize.alertText+" "+rules[i]+" "+getAllRules.maxSize.alertText2));
						breakLoop = true;
					}else{
						RemoveErrorMsg(option);
					}
				}
			break;
			case "ext":
				i++;
					var regex;
					regex = "(.*?)\.(" + rules[i] + ")$";
					var regexExpression = "(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + rules[i] + ")\\b";
					if (piereg(option).val().trim() != "") {
						if (!piereg(option).val().trim().match(new RegExp(regex), piereg(option).val().trim())) {
							ShowErrorMsg(option, getCustomFieldMessage(option, getAllRules.ext.alertText));
							breakLoop = true;
						} else {
							RemoveErrorMsg(option);
						}
					}				
			break;
			case "size":
				i++;
				var regex;
				var _TMP 		= parseInt(rules[i]);
				var uploadfield	= option.files[0];			
				if (_TMP > 0 && uploadfield) {
					regex = _TMP;
					var filesize = option.files[0].size;
					var sizeInKB = (filesize / (1024)).toFixed(2);
					if (parseInt(sizeInKB) > regex) {
						ShowErrorMsg(option, getCustomFieldMessage(option, getAllRules.size.alertText));
						breakLoop = true;
					} else {
						RemoveErrorMsg(option);
					}
				}
			break;
			case "min":
				i++;
				if(piereg(option).val() != "")
				{
					$value = parseInt(piereg(option).val());
					if($value < rules[i])
					{
						ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.min.alertText+" "+rules[i]));
						breakLoop = true;
					}else{
						RemoveErrorMsg(option);
					}
				}
			break;
			case "max":
				i++;
				if(piereg(option).val())
				{
					$value = parseInt(piereg(option).val());
					if($value > rules[i])
					{
						ShowErrorMsg(option,getCustomFieldMessage(option,getAllRules.max.alertText+" "+rules[i]));
						breakLoop = true;
					}else{
						RemoveErrorMsg(option);
					}
				}
			break;			
		}
		
		if(breakLoop)
		{
			piereg_validate = false;
			break;
		}
	}
	
	return piereg_validate;
}

function pieNextPage(elem)
{
	if (piereg('.pieregformWrapper').length > 0)
	{
		wrapperClass = 'pieregformWrapper';
	}
	else
	{
		wrapperClass = 'pieregProfileWrapper';
	}
	piereg(elem).closest('.' + wrapperClass).find('#pie_register .fields,form .fields').css('display','none');
	var id 		= piereg(elem).attr("id");
	var pageNo = piereg(elem).closest('form,#pie_regiser_form').find("#"+id+"_curr").val();
	var totalPages = piereg(elem).closest('form,#pie_regiser_form').find('.piereg_regform_total_pages').val();
	piereg(elem).closest('form,#pie_regiser_form').find('.pageFields_'+pageNo).css('display','block');
	piereg(elem).closest('form,#pie_regiser_form').find('.pageFields_'+pageNo).find('ul#pie_register_ccinfo li').css('display','block');
	piereg(elem).closest('.' + wrapperClass).find(".piereg_progressbar" ).progressbar( "option", {
		value: pageNo / totalPages * 100
	});
	
	piereg(elem).closest("li").next().find("input:first,checkbox:first,radio:first,select:first").focus();	
}

function pieHideFields()
{
	piereg('.pieregformWrapper .fields').css('display','none');
	piereg('.pieregProfileWrapper .fields').css('display','none'); 	//DUA
}
function getCustomFieldMessage(option,message){
	
	if(piereg(option).attr("data-errormessage-value-missing"))
	{
		return piereg(option).attr("data-errormessage-value-missing");
	}
	return message;
}

function ShowErrorMsg(field,promptText){
	piereg(field).closest("li").find(".legend_txt").remove();
	piereg(field).closest("li").find(".fieldset").addClass("error");
	piereg(field).closest("div.fieldset").append('<div class="legend_txt"><span class="legend error">'+promptText+'</span></div>');
}



function RemoveErrorMsg(field){
	var field_name = piereg(field).attr('name');
	var err_remain = 0;
	var container	= piereg(field).closest('.fieldset');
	
	if (typeof field_name == "string" && field_name.indexOf("address_") >= 0 ) {
		
		piereg(container).find(".input_fields").each(function(){
			var field_class = piereg(this).attr('class');
			var field_value = piereg.trim(this.value);
			if (field_value == "" && field_class.indexOf("required") >= 0) {
				err_remain++;
			}else if( field_class.indexOf("alphabetic") >= 0 ) {
				var regex = /^[a-zA-Z\s]+$/;
				if(!regex.test(field_value)) {
					err_remain++;
				}
			}
		})
			
	}
	else if(typeof field_name == "string" && field_name.indexOf("date_") >= 0 )
	{
		piereg(container).find(".input_fields").each(function(i,obj) {
																					
			var rulesParsing 	= piereg(obj).attr("class");
			var field_class 	= piereg(obj).attr('class');
			var field_value 	= piereg.trim(this.value);
			
			if (field_value == "" && field_class.indexOf("required") >= 0) {
				err_remain++;
			} 
			else if(rulesParsing !== null)
			{
				var getAllRules 	= getRegexAndErrorMsg();
				var getRules		= /piereg_validate\[(.*)\]/.exec(rulesParsing);
				
				if(getRules !== null){
					var str = getRules[1];
					var rules = str.split(/\[|,|\]/);
					
					for (var i = 0; i < rules.length; i++) {
						
						if(	rules[i] == 'custom' )
						{
							i++;
							if(!piereg(obj).val().trim().match(new RegExp(getAllRules[rules[i]].regex),piereg(obj).val().trim()))
							{
								if(piereg(obj).val().trim() !== "") {
									err_remain++;
									break;
								}
							}
						}						
					}
					
					if(err_remain != 0){
						return false;
					}
					
				}
			}			
		})		
	}
	else if(typeof field_name == "string" && field_name.indexOf("time_") >= 0 ){
		
		piereg(container).find(".input_fields").each(function(i,obj) {
																					
			var rulesParsing 	= piereg(obj).attr("class");
			var field_class 	= piereg(obj).attr('class');
			var field_value 	= piereg.trim(this.value);
			
			if (field_value == "" && field_class.indexOf("required") >= 0) {
				err_remain++;
			} 
			else if(rulesParsing !== null)
			{
				var getAllRules 	= getRegexAndErrorMsg();
				var getRules		= /piereg_validate\[(.*)\]/.exec(rulesParsing);
				
				if(getRules !== null){
					var str = getRules[1];
					var rules = str.split(/\[|,|\]/);
					
					for (var i = 0; i < rules.length; i++) {
						
						if(	rules[i] == 'custom' )
						{
							i++;
							if(!piereg(obj).val().trim().match(new RegExp(getAllRules[rules[i]].regex),piereg(obj).val().trim()))
							{
								if(piereg(obj).val().trim() !== "") {
									err_remain++;
									break;
								}
							}
						}
						
						if( rules[i] == 'minSize' )
						{
							i++;
							var strlen = piereg(obj).val().trim();
							if(rules[i] > strlen.length)
							{
								err_remain++;
							}
						}
						if( rules[i] == 'maxSize' )
						{
							i++;
							var strlen = piereg(obj).val().trim();
							if(rules[i] < strlen.length)
							{
								err_remain++;
							}
						}
						if( rules[i] == 'min' )
						{
							i++;
							$value = parseInt(piereg(obj).val());
							if($value < rules[i])
							{
								err_remain++;
							}
						}
						
						if( rules[i] == 'max' )
						{
							i++;
							$value = parseInt(piereg(obj).val());
							if($value > rules[i])
							{
								err_remain++;
							}
						}
						
					}
					
					if(err_remain != 0){
						return false;
					}					
				}
			}			
		})
	}
	else {
		piereg(field).closest("li").find(".legend_txt").remove();
		piereg(field).closest("div.fieldset").removeClass("error");
	}
	
	if( err_remain == 0 ) {
		piereg(field).closest("li").find(".legend_txt").remove();
		piereg(field).closest("div.fieldset").removeClass("error");
	}
}

function getRegexAndErrorMsg(){
	var allRules ={
		"required": { // Add your regex rules here, you can take telephone as an example
			"regex": "none",
			"alertText": piereg_validation_engn[1],//"* This field is required",
			"alertTextCheckboxMultiple": piereg_validation_engn[2],//"* Please select an option",
			"alertTextCheckboxe": piereg_validation_engn[3],//"* This checkbox is required",
			"alertTextDateRange": piereg_validation_engn[4]//"* Both date range fields are required"
		},
		"username": {
			"regex": /\s+/g,
			//"regex": /^[a-zA-Z0-9]+([_ -]?[a-zA-Z0-9])*$/,
			"alertText": piereg_validation_engn[53]//"* Invalid Username"
		},		
		"list":
		{
			"regex": /^[A-Za-z ]+$/,
			"alertText": piereg_validation_engn[1]//"* At least one field is required"
		},
		"ext": {
			"regex": "none",
			"alertText": piereg_validation_engn[54]//"* Invalid File"
		},
		"size": {
			"regex": "none",
			"alertText": piereg_validation_engn[58]//"* Invalid File size"
		},
		"alphanumeric": {
			//"regex": /^[a-zA-Z0-9]+$/,
			"regex": /^[a-zA-Z0-9 ]+$/,
			"alertText": piereg_validation_engn[57]//"* Only Alphanumeric characters are allowed"
		},
		"alphabetic": {
			//"regex": /^[a-zA-Z ]+$/,
			//"regex": /^[a-zA-Z\{wа-я}\p\s\-]+$/igm,
			"regex" : /^[^-_/.,\\ ]+/,
			//"regex": /^[a-zA-Z\{wа-я}\p\s\-\u00E4\u00F6\u00FC\u00C4\u00D6\u00DC\u00df]+$/igm,
			"alertText": piereg_validation_engn[56]//"* Letters only"
		},
		"requiredInFunction": { 
			"func": function(field, rules, i, options){
				return (field.val() == "test") ? true : false;
			},
			"alertText": piereg_validation_engn[5]//"* Field must equal test"
		},
		"dateRange": {
			"regex": "none",
			"alertText": piereg_validation_engn[6],//"* Invalid ",
			"alertText2": piereg_validation_engn[7]//"Date Range"
		},
		"dateTimeRange": {
			"regex": "none",
			"alertText": piereg_validation_engn[6],//"* Invalid ",
			"alertText2": piereg_validation_engn[8]//"Date Time Range"
		},
		"minSize": {
			"regex": "none",
			"alertText": piereg_validation_engn[9],//"* Minimum ",
			"alertText2": piereg_validation_engn[10]//" characters required"
		},
		"maxSize": {
			"regex": "none",
			"alertText": piereg_validation_engn[11],//"* Maximum ",
			"alertText2": piereg_validation_engn[12]//" characters allowed"
		},
		"groupRequired": {
			"regex": "none",
			"alertText": piereg_validation_engn[13]//"* You must fill-in one of the following fields."
		},
		"min": {
			"regex": "none",
			"alertText": piereg_validation_engn[14]//"* Minimum value is "
		},
		"max": {
			"regex": "none",
			"alertText": piereg_validation_engn[55]//"* Maximum value is "
		},
		"past": {
			"regex": "none",
			"alertText": piereg_validation_engn[15]//"* Date prior to "
		},
		"future": {
			"regex": "none",
			"alertText": piereg_validation_engn[16]//"* Date past "
		},	
		"maxCheckbox": {
			"regex": "none",
			"alertText": piereg_validation_engn[9],//"* Maximum ",
			"alertText2": piereg_validation_engn[17]//" options allowed"
		},
		"minCheckbox": {
			"regex": "none",
			"alertText": piereg_validation_engn[18],//"* Please select ",
			"alertText2": piereg_validation_engn[19]//" options"
		},
		"equals": {
			"regex": "none",
			"alertText": piereg_validation_engn[20]//"* Fields do not match"
		},
		"creditCard": {
			"regex": "none",
			"alertText": piereg_validation_engn[21]//"* Invalid credit card number"
		},
		"phone": {
			// credit: jquery.h5validate.js / orefalo
			"regex": /^([\+][0-9]{1,3}[\ \.\-])?([\(]{1}[0-9]{2,6}[\)])?([0-9\ \.\-\/]{3,20})((x|ext|extension)[\ ]?[0-9]{1,4})?$/,
			"alertText": piereg_validation_engn[22]//"* Invalid phone number"
		},
		 "phone_standard": {
			// credit: jquery.h5validate.js / orefalo
			"regex": /^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/,
			"alertText": piereg_validation_engn[23]//"* Invalid phone number. Allowed format: (xxx)xxx-xxxx"
		},
		"phone_international": {
			// credit: jquery.h5validate.js / orefalo
			//"regex": /^\d{10,16}$/,
			//"alertText": piereg_validation_engn[24]//"* Minimum 10 Digits starting with Country Code"
			"regex": /^(\+|00)?(?:[0-9]( |-)?){1,3}(?:[0-9]( |-)?){4,14}$/,
			"alertText": piereg_validation_engn[22]//"* Invalid phone number"
		},
		"email": {
			// Shamelessly lifted from Scott Gonzalez via the Bassistance Validation plugin http://projects.scottsplayground.com/email_address_validation/
			/*"regex": /^((([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,*/
			// "regex": /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i,
			"regex": /^[a-zA-Z0-9.'_%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,5}/,
			"alertText": piereg_validation_engn[25]//"* Invalid email address"
		},
		"integer": {
			"regex": /^[\-\+]?\d+$/,
			"alertText": piereg_validation_engn[26]//"* Not a valid integer"
		},
		"number": {
			// Number, including positive, negative, and floating decimal. credit: orefalo
			"regex": /^[\-\+]?((([0-9]{1,3})([,][0-9]{3})*)|([0-9]+))?([\.]([0-9]+))?$/,
			"alertText": piereg_validation_engn[27]//"* Invalid number"
		},
		"month": {
			"regex": /^(0[1-9]|1[0-2])$/,
			"alertText": piereg_validation_engn[28]//"* Invalid month"
		},
		"day": {
			"regex": /^(0[1-9]|1\d|2\d|3[01])$/,
			"alertText": piereg_validation_engn[29]//"* Invalid day"
		},
		"year": {
			"regex": /^[12][0-9]{3}$/,
			"alertText": piereg_validation_engn[30]//"* Invalid year"
		},
		"file": {
			"regex": /(\.bmp|\.gif|\.jpg|\.jpeg)$/i,
			"alertText": piereg_validation_engn[31]//"* Invalid file extension"
		},
		"date": {                    
			//	Check if date is valid by leap year
			"func": function (field) {
				var pattern = new RegExp(/^(\d{4})[\/\-\.](0?[1-9]|1[012])[\/\-\.](0?[1-9]|[12][0-9]|3[01])$/);
				var match = pattern.exec(field.val());
				if (match == null)
				   return false;
	
				var year = match[1];
				var month = match[2]*1;
				var day = match[3]*1;					
				var date = new Date(year, month - 1, day); // because months starts from 0.	
				return (date.getFullYear() == year && date.getMonth() == (month - 1) && date.getDate() == day);
			},                		
			"alertText": piereg_validation_engn[32]//"* Invalid date, must be in YYYY-MM-DD format"
		},
		"ipv4": {
			"regex": /^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/,
			"alertText": piereg_validation_engn[33]//"* Invalid IP address"
		},
		"url": {
			// since 3.7.0.0
			/* "regex": /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([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])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i, */
			"regex": /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/i,
			"alertText": piereg_validation_engn[34]//"* Invalid URL"
		},
		"onlyNumberSp": {
			"regex": /^[0-9\ ]+$/,
			"alertText": piereg_validation_engn[35]//"* Numbers only"
		},
		"onlyLetterSp": {
			"regex": /^[a-zA-Z\ \']+$/,
			"alertText": piereg_validation_engn[36]//"* Letters only"
		},
		"onlyLetterNumber": {
			"regex": /^[0-9a-zA-Z]+$/,
			"alertText": piereg_validation_engn[37]//"* No special characters allowed"
		},
		// --- CUSTOM RULES -- Those are specific to the demos, they can be removed or changed to your likings
		"ajaxUserCall": {
			"url": "wp-admin/admin-ajax.php",
			"extraDataDynamic": ['#username'],
			// you may want to pass extra data on the ajax call
			 "extraData": "action=check_username",
			"alertText": piereg_validation_engn[38],//"* This username is not available",
			"alertTextLoad": piereg_validation_engn[39]//"* Validating, please wait"
		},
		"ajaxUserCallPhp": {
			"url": "wp-admin/admin-ajax.php",
			"extraDataDynamic": ['#username'],
			// you may want to pass extra data on the ajax call
			"extraData": "action=check_username",
			// if you provide an "alertTextOk", it will show as a green prompt when the field validates
			"alertTextOk": piereg_validation_engn[40],//"* This username is available",
			"alertText": piereg_validation_engn[41],//"* This username is not available",
			"alertTextLoad": piereg_validation_engn[42]//"* Validating, please wait"
		},
		"ajaxNameCall": {
			// remote json service location
			"url": "ajaxValidateFieldName",
			// error
			"alertText": piereg_validation_engn[43],//"* This name is not available",
			// if you provide an "alertTextOk", it will show as a green prompt when the field validates
			"alertTextOk": piereg_validation_engn[44],//"* This name is available",
			// speaks by itself
			"alertTextLoad": piereg_validation_engn[45]//"* Validating, please wait"
		},
		 "ajaxNameCallPhp": {
				// remote json service location
				"url": "phpajax/ajaxValidateFieldName.php",
				// error
				"alertText": piereg_validation_engn[46],//"* This name is not available",
				// speaks by itself
				"alertTextLoad": piereg_validation_engn[39]//"* Validating, please wait"
			},
		"validate2fields": {
			"alertText": piereg_validation_engn[47]//"* Please enter HELLO"
		},
		//tls warning:homegrown not fielded 
		"dateFormat":{
			"regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/,
			"alertText": piereg_validation_engn[48]//"* Invalid Date"
		},
		//tls warning:homegrown not fielded 
		"dateTimeFormat": {
			"regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/,
			"alertText": piereg_validation_engn[49],//"* Invalid Date or Date Format",
			"alertText2": piereg_validation_engn[50],//"Expected Format: ",
			"alertText3": piereg_validation_engn[51],//"mm/dd/yyyy hh:mm:ss AM|PM or ", 
			"alertText4": piereg_validation_engn[52]//"yyyy-mm-dd hh:mm:ss AM|PM"
		}
	}
	
	return allRules; 
}

function checkExtensions(field, rules, i, options)
{
	var ext;
	for (var i=0;i<rules.length;i++)
	{
		 if( rules[i]=="ext"  )
		 {
			ext 		= rules[i+1].split("|");
			break	 
		 }
	}
	if(ext == "")
	return false;
	
	var uploadedExt = 	field.val().split('.').pop();
	if(ext.length > 0)
	{
		for(a = 0 ; a < ext.length ; a++)
		{
			if(uploadedExt == ext[a])
			return true;		
		}
	}
	
	return "* Invalid Extension";
	///(\.bmp|\.gif|\.jpg|\.jpeg)$/i
	//console.log(rules[5]);	
}
function addList(field,total,classname)
{
	var selectedForm = piereg(field).closest('form'); //For 2 form issue
	
	for(a = 1 ; a <= total ; a++)
	{
		if( piereg(selectedForm).find('.'+"list_"+classname+"_"+a)[0] )
		{
			field = selectedForm.find('.'+"list_"+classname+"_"+a)[0];

			if( piereg( field ).css('display') == 'none' )
			{	
				piereg(field).css("display","block")
				return false;
			}
		}
		else if( piereg(piereg(selectedForm).find('.'+"field_"+classname+"_"+a)).css('display') == 'none' )
		{
			piereg(piereg(selectedForm).find('.'+"field_"+classname+"_"+a)).css("display","block")	
			return false;
		}
	}
}
function removeList(field,total,classname,a)
{
	var selectedForm = piereg(field).closest('form'); //For 2 form issue

	if( piereg(selectedForm).find('.'+"list_"+classname+"_"+a)[0] )
	{
		field = selectedForm.find('.'+"list_"+classname+"_"+a)[0];
		piereg(field).css("display","none");
		piereg( piereg(selectedForm).find(".list_"+classname+"_"+a+" input[type=text]") ).val("");
	}
	else if( piereg(selectedForm).find('.'+"field_"+classname+"_"+a) )
	{
		piereg(piereg(selectedForm).find('.'+"field_"+classname+"_"+a)).css("display","none")	
		piereg( piereg(selectedForm).find(".field_"+classname+"_"+a+" input[type=text]") ).val("");
	}
}

// Declare jQuery Object to $.
$ = jQuery;