// A plugin for adding "A-Form" functionality.
// Copyright (c) 2008 ARK-Web Co.,Ltd.

function isEmpty(v) {
  return  ((v == null) || (v.length == 0) || /^\s+$/.test(v.toHankaku()));
}

function escapeHTML(str) {
  return jQuery('<div>').text(str).html();
}

function aformValidate_showErrors(errorMap, errorList) {
  var icon = '<img src="'+ aform.static_uri  +'plugins/AForm/images/icons/warning_y.gif">';
  for( var i = 0; errorList[i]; i++ ){
    if (errorList[i].message.match(/^<img/)) {
    } else {
      errorList[i].message = icon + errorList[i].message;
    }
  }
  this.defaultShowErrors();
}

function aformValidate_errorPlacement(error, elm) {
  var id = elm[0].id;
  if( elm[0].type == 'checkbox' || elm[0].type == 'radio' ){
    id = id.replace(/(.*)-[^-]+$/, "$1");
  }
  if( elm[0].name.match(/(aform-field-[0-9]+)-[0-9]+-text$/) ){
    id = id.replace(/(.*)-[0-9]+-text$/, "$1");
  }
  if( match = elm[0].id.match(/^(.*)-confirm$/) ){
    id = match[1];
  }
  if( match = id.match(/^(.*-cardnumber)\d$/) ){
    id = match[1];
  }
  error.addClass('validation-advice');
  jQuery('#'+ id +'-error').html(error);
}

function addAFormValidate() {

    jQuery.validator.addMethod('aform-calendar', function(v,elm) {
      if (match = elm.id.match(/^(.*)\-dd$/)) {
        var parts_id = match[1];
        if (aform.range_from && aform.range_from[parts_id]) {
          var yy = jQuery('#'+ parts_id +'-yy');
          var mm = jQuery('#'+ parts_id +'-mm');
          var dd = jQuery('#'+ parts_id +'-dd');
          if (!yy.val() && !mm.val() && !dd.val()) {
            return true;
          } else {
            if (!yy.val() || !mm.val() || !dd.val()) {
              return false;
            }
          }
          var dt = new Date(yy.val(), mm.val() -1, dd.val());
          if (dt < aform.range_from[parts_id]) {
            return false;
          }
          return true;
        }
      }
      return true;
    });

    jQuery.validator.addMethod('hankaku', function(v,elm) {
      elm.value = elm.value.toHankaku();
      return true;
    });

    jQuery.validator.addMethod('required', function(v,elm) {
      if (aform_ignore_validate(elm)) {
        return true;
      }
      if (!jQuery(elm).hasClass('required')) {
        return true;
      }
      if( !isEmpty(v) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('empty', elm, v);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-length', function(v,elm) {
      if (aform_ignore_validate(elm)) {
        return true;
      }
      if (isEmpty(v)) {
        removeAFormInputErrorTitle(elm);
        return true;
      }
      var pattern = jQuery(elm).attr('pattern');
      var min_length = null;
      var max_length = null;
      if (matches = pattern.match(/^.*\{(\d*),(\d*)\}$/)) {
        min_length = parseInt(matches[1]);
        max_length = parseInt(matches[2]);
      }
      v = v.replace(/\r/g, "");
      v = v.replace(/\n/g, "");
      if( (!min_length || v.length >= min_length) && (!max_length || v.length <= max_length) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('max_length_error', elm, v);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-email', function(v,elm) {
      if (aform_ignore_validate(elm)) {
        return true;
      }
      if( isEmpty(elm.value) || /^(([^<>()\[\]\\.,;:\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,}))$/.test(elm.value) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('email_format_error', elm, elm.value);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-ascii', function(v,elm) {
      if (aform_ignore_validate(elm)) {
        return true;
      }
      var pattern = jQuery(elm).attr('pattern');
      var char_pattern = '[\\x21-\\x7E]';
      var re = new RegExp('^' + char_pattern + '*$', 'i');
      if( isEmpty(v) || re.test(v) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('ascii_error', elm, v);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-url', function (v,elm) {
      if (aform_ignore_validate(elm)) {
        return true;
      }
      if( isEmpty(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('url_format_error', elm, v);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-tel', function(v,elm) {
      if (aform_ignore_validate(elm)) {
        return true;
      }
      var reg_pattern = /.*/;
      if (jQuery(elm).hasClass('require-hyphen')) {
        reg_pattern = /\-/;
      }
      if (jQuery(elm).hasClass('not-allow-hyphen')) {
        reg_pattern = /^[^-]*$/;
      }
      if( isEmpty(elm.value) || (/^[0-9\-]+$/.test(elm.value) && reg_pattern.test(elm.value)) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('tel_format_error', elm, elm.value);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-zipcode', function(v,elm) {
      if (aform_ignore_validate(elm)) {
        return true;
      }
      var reg_pattern = /^[0-9]{3}-?[0-9]{4}$/;
      if (jQuery(elm).hasClass('require-hyphen')) {
        reg_pattern = /^[0-9]{3}-[0-9]{4}$/;
      }
      if (jQuery(elm).hasClass('not-allow-hyphen')) {
        reg_pattern = /^[0-9]{7}$/;
      }
      if( isEmpty(elm.value) || reg_pattern.test(elm.value) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('zipcode_format_error', elm, elm.value);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-selection', function(v,elm){
      if( !isEmpty(v) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('not_selected', elm, v);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-one-required', function(v,elm) {
      var field_id = elm.name.match(/^aform-field-[0-9]+/);
      var reg;
      if( elm.type == 'checkbox' ){
        reg = new RegExp( '^'+ field_id +'-[0-9]+$' );
      }else{
        reg = new RegExp( '^'+ field_id +'$');
      }

      var options = elm.form.getElementsByTagName('INPUT');
      var check = false;
      jQuery(options).each(function() {
        if( this.name.search(reg) == -1 ){
          return true;
        }
        if( this.checked ){
          check = true;
          return false;
        }
      });
      if( check ){
        hideAFormAdvice(elm);
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('empty', elm, '');
        return false;
      }
    });

    jQuery.validator.addMethod('validate-option-text', function(v,elm) {
      var matches = elm.id.match(/^(.*)-([0-9]+)-text$/);
      if( matches.length > 0 ){
        var field_id = matches[1];
        var option_idx = matches[2];
        if( jQuery('#'+field_id+'-'+option_idx)[0].checked && isEmpty(v) ){
          addAFormInputErrorTitle(elm);
          postAFormErrorLog('empty', elm, v);
          return false;
        }else{
          removeAFormInputErrorTitle(elm);
          return true;
        }
      }
      return true;
    });

    jQuery.validator.addMethod('validate-upload', function(v,elm) {
      if( !isEmpty(v) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('empty', elm, v);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-privacy', function(v,elm) {
      var field_id = elm.name.match(/^aform-field-[0-9]+/);
      var reg = new RegExp( field_id );
      var options = elm.form.getElementsByTagName('INPUT');
      var check = false;
      jQuery(options).each(function() {
        if( this.name.search(reg) == -1 ){
          return true;
        }
        if( this.checked ){
          check = true;
          return false;
        }
      });
      if( check ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('privacy_error', elm, '');
        return false;
      }
    });

    jQuery.validator.addMethod('require-twice', function(v,elm) {
      if (match = elm.id.match(/^(.*)-confirm$/)) {
        var orig_id = match[1];
        var orig_elm = jQuery('#' + orig_id);
        if (orig_elm.hasClass('error')) {
          return true;
        }
        if (v == orig_elm.val()) {
          removeAFormInputErrorTitle(elm);
          return true;
        }else{
          addAFormInputErrorTitle(elm);
          postAFormErrorLog('require_twice', elm, v);
          return false;
        }
      }
    });

    jQuery.validator.addMethod('validate-name', function(v,elm) {
      if (v.match(/%/)) {
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('validate_name', elm, v);
        return false;
      }else{
        removeAFormInputErrorTitle(elm);
        return true;
      }
    });

    jQuery.validator.addMethod('validate-name-kana', function(v,elm) {
      elm.value = elm.value.toZenkakuKana();
      if (isEmpty(elm.value) || elm.value.isKanaOnly()) {
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('validate_name_kana', elm, v);
        return false;
      }
    });

    jQuery.validator.addMethod('validate-name-hiragana', function(v,elm) {
      if (isEmpty(elm.value) || elm.value.isHiraganaOnly()) {
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('validate_name_kana', elm, v);
        return false;
      }
    });

    var disable_methods = ['remote', 'minlength', 'maxlength', 'rengelength', 'min', 'max', 'range', 'email', 'url', 'date', 'dateISO', 'number', 'digits', 'creditcard', 'accept', 'equalTo', 'phoneUS'];
    jQuery.each(disable_methods, function(idx, val) {
      jQuery.validator.addMethod(val, function (v,elm) {
        return true;
      });
    });
}



function addAFormInputErrorTitle(elm)
{
  if( ! elm.title.match(eval("/^"+ aform.phrases['Input error:'] +"/")) ){
    elm.title = aform.phrases['Input error:'] + elm.title;
  }
}


function removeAFormInputErrorTitle(elm)
{
  elm.title = elm.title.replace(eval("/"+ aform.phrases['Input error:'] +"/"), "");
}


function hideAFormAdvice(elm)
{
  var field_id = elm.id.replace(/(.*)-[0-9]+$/, "$1");
  jQuery('#' + field_id + '-error').html('');
}

function postAFormAccessLog(aform_id)
{
  if (!aform || !aform.enabled_report) {
    return;
  }
  var params = {
    screen : 'form',
    run_mode : 'access',
    aform_id : aform_id,
    aform_url : document.location.href,
    first_access : jQuery.cookie(document.location.pathname) ? 0 : 1
  };
  jQuery.ajax({
        url: aform.logger_url,
        dataType: 'json',
        data: params
        }); 
  var date = new Date();
  date.setTime(date.getTime() + 30*60*1000);
  jQuery.cookie(document.location.pathname, "1", { expires: date});	// expires sec
}

function postAFormErrorLog(type, elm, value)
{
  if (!aform || !aform.enabled_report) {
    return;
  }
  var aform_id = elm.form.id.value;
  var field_id = elm.name.replace(/aform-field-(\d+).*/, "$1");
  var params = {
    run_mode : 'error',
    aform_id : aform_id,
    aform_url : document.location.href,
    type : type,
    error_field_id : field_id,
    error_value : value
  };
  jQuery.ajax({
        url: aform.logger_url,
        dataType: 'json',
        data: params
  });
}

function postAFormChecker()
{
  jQuery.ajax({
    url: aform.checker_url
  });
}

function postAFormActiveChecker(aform_id)
{
  jQuery('.aform-checking').show();
  jQuery('.aform-content').hide();

  var params = {
    __mode : 'rebuild_aform',
    aform_auto_status: aform.auto_status,
    aform_id : aform_id
  };
  jQuery.ajax({
        url: aform.checker_url,
        dataType: 'json',
        data: params,
        success: reload_if_rebuild
  }); 
}

function reload_if_rebuild(response)
{
  if (!response || !response.result) {
    return;
  }
  if (response.result.status == 'rebuild') {
    location.reload();
  }
  if (response.result.msg) {
    jQuery('.aform-checking').html(response.result.msg);
  } else {
    jQuery('.aform-checking').hide();
    jQuery('.aform-content').show();
  }
}

function regist_ajax_upload(field_id, size, type){
  var ext = '';
  if( type != '' ){
    var types = type.split(',');
    for( i = 0; i < types.length; i++ ){
      types[i] = '*.' + types[i].replace(/^\s+|\s+$/g, '');
    }
    ext = types.join(';');
  }
  if( size <= 0 ){
    size = '';
  }
  jQuery('#aform-upload-button-' + field_id).fileUpload({
    'script' : aform.upload_script_url,
    'uploader' : aform.static_uri + 'plugins/AForm/js/jquery.uploadify/uploader.swf',
    'cancelImg' : aform.static_uri + 'plugins/AForm/js/jquery.uploadify/cancel.png',
//    'buttonImg' : aform.static_uri + 'plugins/AForm/js/jquery.uploadify/button.gif',
    'auto' : true,
    'sizeLimit' : size,
    'fileDesc' : ext,
    'fileExt' : ext,
    'fileDataName' : 'upload_file',
    'scriptData' : {
      run_mode : 'upload',
      aform_id : 1,
      field_id : field_id
    },
    'onComplete' : function(event, queueID, fileObj, responseText, data){
      var response = eval("(" + responseText + ")");
      jQuery('#aform-upload-info-' + field_id).text(fileObj.name + response.message);
      switch( response.result ){
      case 'success':
        jQuery('#aform-field-' + field_id).val(response.id);
        jQuery('#aform-upload-name-' + field_id).val(fileObj.name);
        jQuery('#aform-upload-remove-' + field_id).show();
        jQuery('#advice-validate-upload-aform-field-' + field_id).hide();
        break;
      default:
        jQuery('#aform-field-' + field_id).val('');
        jQuery('#aform-upload-name-' + field_id).val('');
        jQuery('#aform-upload-remove-' + field_id).hide();
        break;
      }
      this.enable();
    },
    onError : function(event, queueID, fileObj, errorObj){
      switch( errorObj.type ){
      case 'File Size':
        jQuery("#" + event.target.id + queueID + " .fileName").text("エラー : ファイルサイズオーバー " + fileObj.name);
        break;
      default:
        alert('error!' + errorObj.type);
        break;
      }
      return false;
    }
  });
}

function remove_upload(field_id){
  jQuery('#aform-upload-info-' + field_id).text('');
  jQuery('#aform-field-' + field_id).val('');
  jQuery('#aform-upload-name-' + field_id).val('');
  jQuery('#aform-upload-remove-' + field_id).hide();
  Validation.reset($('aform-field-' + field_id));
}

function get_aform_parameter(parts_id, parameter_name){
  if( isEmpty(parameter_name) ){
    return false;
  }
  var val = jQuery.query.get(parameter_name);
  jQuery('#' + parts_id).val(val);
  jQuery('#' + parts_id + '-text').text(val);
}

function set_datepicker(parts_id, range_from, range_to, default_value, disables){
  init_aform_calendar(parts_id, default_value);

  var range_from_ymd = new Date(range_from, 1-1, 1);
  if (aform.range_from && aform.range_from[parts_id]) {
    range_from_ymd = aform.range_from[parts_id];
    var msg = aform.range_from_msg.replace("%date%", range_from_ymd.getFullYear() +'/'+ (range_from_ymd.getMonth() + 1) +'/'+ range_from_ymd.getDate());
    jQuery('#'+ parts_id +'-dd').attr('title', msg);
    jQuery('#'+ parts_id +'-yy,#'+ parts_id +'-mm').change(function() {
      jQuery('#'+ parts_id +'-dd').valid();
    });
  }

  jQuery('#' + parts_id).datepicker({
    showOn: 'button',
    buttonImage: aform.static_uri + 'plugins/AForm/images/calendar.gif',
    buttonImageOnly: true,
    changeMonth: true,
    changeYear: true,
    minDate: range_from_ymd,
    maxDate: new Date(range_to, 12-1, 31),
    beforeShow: function(){
      var yy = jQuery('#' + parts_id + '-yy').val();
      var mm = jQuery('#' + parts_id + '-mm').val();
      var dd = jQuery('#' + parts_id + '-dd').val();
      if( yy > 0 && mm > 0 && dd > 0 ){
        jQuery(this).datepicker('setDate', new Date(yy, mm-1, dd));
      }
    },
    beforeShowDay: function(day) {
      var mm = ("00" + (day.getMonth() + 1)).slice(-2);
      var dd = ("00" + day.getDate()).slice(-2);
      var ymd = day.getFullYear() + '' + mm + '' + dd;
      var disable_date = disables[ymd];
      if (disable_date) {
        return [false, "", disable_date.title];
      } else {
        return [true, ""];
      }
    },
    onSelect: function() {
      var date = jQuery(this).datepicker('getDate');
      var elm_yy = jQuery('#' + parts_id + '-yy');
      var elm_mm = jQuery('#' + parts_id + '-mm');
      var elm_dd = jQuery('#' + parts_id + '-dd');
      jQuery(elm_yy).val(date.getFullYear());
      jQuery(elm_mm).val(date.getMonth()+1);
      jQuery(elm_dd).val(date.getDate());
      jQuery(elm_yy).trigger('change');
      jQuery(elm_mm).trigger('change');
      jQuery(elm_dd).trigger('change');
      jQuery(elm_yy).valid();
      jQuery(elm_mm).valid();
      jQuery(elm_dd).valid();
    }
  });
}

function init_aform_calendar(parts_id, default_value) {
  var elm_yy = jQuery('#' + parts_id + '-yy');
  var elm_mm = jQuery('#' + parts_id + '-mm');
  var elm_dd = jQuery('#' + parts_id + '-dd');

  if (jQuery(elm_yy).val() != '' || jQuery(elm_mm).val() != '' || jQuery(elm_dd).val() != '') {
    return;
  }

  var date = new Date();
  var yy = date.getFullYear();
  var mm = date.getMonth() + 1;
  var dd = date.getDate();

  if (match = default_value.match(/([\+\-]\d+)((day|month|year))/)) {
    var offset = parseInt(match[1]);
    var type = match[2];
    if (type == "day") {
      date.setTime(date.getTime() + offset * 60*60*24*1000);
      yy = date.getFullYear();
      mm = date.getMonth() + 1;
      dd = date.getDate();
    }
    else if (type == "month") { 
      mm += offset;
      if (mm > 12) {
        yy += 1;
        mm -= 12;
      }
      if (mm < 1) {
        yy -= 1;
        mm += 12;
      }
    }
    else if (type == "year") {
      yy += offset;
    }
    // fix date
    var check_date = new Date(yy, mm, 0);
    if (dd > check_date.getDate()) {
      dd = check_date.getDate();
    }
  } else if (default_value == 'today') {
    // 
  } else {
    return;
  }
  // set dropdown
  jQuery(elm_yy).val(yy);
  jQuery(elm_mm).val(mm);
  jQuery(elm_dd).val(dd);
}

function aform_set_reserve_events(){
  jQuery('.aform-reserve-date').each(function(){
    aform_set_reserve_plan_list(this);
  });
  jQuery('.aform-reserve-date').change(function(){
    aform_set_reserve_plan_list(this);
  });
  jQuery('.aform-reserve-plan-id').each(function(){
    aform_set_reserve_option_list(this);
  });
  jQuery('.aform-reserve-plan-id').change(function(){
    aform_set_reserve_option_list(this);
  });
}

function aform_set_reserve_plan_list(date_parts){
    var parts_id;
    if( match = date_parts.id.match(/^(.+)-date$/) ){
      parts_id = match[1];
    }
    if( !parts_id ){
      return;
    }
    var plan_select = jQuery('#'+ parts_id +'-plan-id');
    plan_select.empty();
    var date_value = jQuery(date_parts).val();
    var plan_items = '<option value="">-</option>';
    var plans = aformReserveOptionValues[date_value];
    jQuery(plans).each(function() {
      plan_items += '<option value="' + this['id'] + '">' + this['name'] + '</option>';
    })
    plan_select.append(plan_items);
    plan_select.trigger("change");
}

function aform_set_reserve_option_list(plan_parts){
    var parts_id;
    if( match = plan_parts.id.match(/^(.+)-plan-id$/) ){
      parts_id = match[1];
    }
    if( !parts_id ){
      return;
    }
    var date_parts = jQuery('#'+ parts_id +'-date');
    if( !date_parts ){
      return;
    }
    var date_value = jQuery(date_parts).val();
    var plan_id = jQuery(plan_parts).val();

    var option_value_select = jQuery('#'+ parts_id +'-option-value-id');
    option_value_select.empty();
    var option_items = '<option value="">-</option>';
    var exists_option = false;
    if (date_value && plan_id) {
      var plans = aformReserveOptionValues[date_value];
      jQuery(plans).each(function() {
          if (this.id == plan_id) {
              var option_values = this['option_values'];
              jQuery(option_values).each(function() {
                  option_items += '<option value="' + this['id'] + '">' + this['name'] + '</option>';
                  exists_option = true;
              });
          }
      });
    }
    option_value_select.append(option_items);

    if (exists_option) {
        option_value_select.removeAttr('disabled', '');
        option_value_select.show();
    }else{
        option_value_select.attr('disabled', 'disabled');
        option_value_select.hide();
    }
}

CheckNextStep = {};
CheckNextStep.vars = {};
CheckNextStep.check = function(me, max_length, e) {
    var value = jQuery(me).val();
    if (value.length < max_length) {
        return ;
    }
    // 矢印キー、TAB、Shift の場合は何もしない
    var denyKey = [37,38,39,40,9,16];
    for (var i = 0 ; i < denyKey.length ; i++) {
        if (e.keyCode == denyKey[i]) {
            return ;
        }
    }
    value = value.substr(0, max_length); // オーバー分は切る
    jQuery(me).val(value);
    
    if (match = jQuery(me).attr("id").match(/(\d+)$/)) {
        var next_num = parseInt(match[1],10) + 1;
        var next_id  = jQuery(me).attr("id").replace(/\d+$/, next_num);
        jQuery("#"+next_id).focus();
    } else {
        jQuery(me).blur();
    }
}

function aform_ignore_validate(elm) {
    if (jQuery(elm).hasClass('require-twice')) {
        return true;
    }
    return false;
}

jQuery(document).ready(function(){
  if (typeof aform === "undefined") {
    return;
  }

  // process confirm
  if (typeof aform_confirm !== "undefined") {
    return documentReadyFormConfirm();
  }

  // parameter parts
  if (aform.parameters) {
    jQuery.each(aform.parameters, function(key, val) {
      get_aform_parameter(key, val);
    });
  }
  // calendar parts
  if (aform.datepickers) {
    jQuery.each(aform.datepickers, function(key, val) {
      set_datepicker(key, val.range_from, val.range_to, val.default_value, val.disable_dates);
    });
  }
  // relations
  if (aform.relations) {
    jQuery.each(aform.relations, function(parts_id, conditions) {
      var selector = 'input.'+ parts_id +', select.'+ parts_id +', textarea.'+ parts_id +', file.'+ parts_id;
      jQuery(selector).change(function() {
        var val = jQuery(this).val();
        if (jQuery(this).attr("type") == "radio") {
          val = jQuery('input[name="'+ this.name +'"]:checked').val();
        }
        if (jQuery(this).hasClass("aform-field-option-text")) {
          return;
        }
        jQuery.each(conditions, function(idx, condition) {
          var show = false;
          if (condition.cond == '==') {
            show = (val == condition.value);
          } else if (condition.cond == '!=') {
            show = (val != condition.value);
          }
          if (show) {
            jQuery('.'+ condition.parts_id).show().prop("disabled", false);
            jQuery('.dl_'+ condition.parts_id).show();
          } else {
            jQuery('.'+ condition.parts_id).hide().prop("disabled", true);
            jQuery('.dl_'+ condition.parts_id).hide();
          }
        });
      });
      jQuery(selector).trigger("change");
    });
  }
  // ajax check
  if (aform.require_ajax_check) {
    postAFormActiveChecker(aform.id);
  }
  if (aform.is_active == 'published') {
    postAFormAccessLog(aform.id);
    postAFormChecker();
    addAFormValidate();
    var validate_options = {
      ignore: [],
      onkeyup: false,
//      wrapper: "div",
//      showErrors: aformValidate_showErrors,
      errorPlacement: aformValidate_errorPlacement
    };
    if (!parseInt(aform.check_immediate)) {
      validate_options.onfocusout = false;
    }
    // payment
    aform_set_payment_events();
    jQuery('#aform-form-'+ aform.id).validate(validate_options);
    // checkbox parts
    jQuery('.aform-checkbox').click(function() {
      jQuery(this).valid();
    });
  }
  // reserve
  aform_set_reserve_events();
  // reCAPTCHA
  aform_set_recaptcha_events();
  // paging
  if (aform.pages) {
    aform_set_paging_events();
  }
  // upload parts
  jQuery('.clear_upload').click(function() {
    var parts_id = jQuery(this).data('parts_id');
    jQuery('#'+ parts_id).val('');
  });
  // others
  if (aform.documentReadyFunctions) {
    for (var i = 0; i < aform.documentReadyFunctions.length; i++) {
      aform.documentReadyFunctions[i]();
    }
  }
});

function aform_set_paging_events() {
  jQuery(document).ready(function() {
    // disable enter key(13) on input field
    jQuery('input').keydown(function(e){
      if ((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) {
        return false;
      } else {
        return true;
      }
    });

    // show top page
    jQuery('.aform_page').hide();
    jQuery('#aform_page_1').show();

    jQuery(aform.pages).each(function() {
      var page = this;
      // prev button
      if (page.prev) {
        jQuery('#'+ page.prev.btn).click(function() {
          // show prev page
          jQuery('.aform_page').hide();
          jQuery('#'+ page.prev.page).show();
        });
      }
      // next button
      if (page.next) {
        jQuery('#'+ page.next.btn).click(function() {
          // validate
          var check = true;
          jQuery(page.parts_ids).each(function() {
            var elm = jQuery('.'+ this +'.aform-validate');
            if (elm.length && !elm.prop('disabled') && !elm.valid()) {
              // focus if first error
              if (check == true) {
                elm.focus();
              }
              check = false;
            }
          });
          if (!check) {
            return false;
          }
          // show next page
          jQuery('.aform_page').hide();
          jQuery('#'+ page.next.page).show();
        });
      }
    });
  });
}

///////////////
// payments
function is_payment_method_selected(method) {
  if (Object.keys(aform.payment.methods).length > 1) {
    return (jQuery('[name="aform-field-'+ aform.payment.field_id +'"]:checked').val() == method.key);
  } else {
    return (jQuery('#'+ aform.payment.parts_id +'-'+ method.key).val() == method.key);
  }
}
function update_payment_method_fields() {
  jQuery(Object.keys(aform.payment.methods)).each(function(index, key) {
    if (is_payment_method_selected(aform.payment.methods[key])) {
      jQuery('#'+ aform.payment.parts_id +'-'+ key +'-cc_info').show();
    } else {
      jQuery('#'+ aform.payment.parts_id +'-'+ key +'-cc_info').hide();
    }
  });
}
function init_card_fields(method) {
  jQuery('#'+ aform.payment.parts_id +'-'+ method.key +'-cardnumber1').keyup(function(e){ CheckNextStep.check(this,4,e); });
  jQuery('#'+ aform.payment.parts_id +'-'+ method.key +'-cardnumber2').keyup(function(e){ CheckNextStep.check(this,4,e); });
  jQuery('#'+ aform.payment.parts_id +'-'+ method.key +'-cardnumber3').keyup(function(e){ CheckNextStep.check(this,4,e); });
  jQuery.validator.addMethod(method.key + '-cardnumber', function(v, elm) {
    if (!is_payment_method_selected(method)) {
      return true;
    }
    if (elm.id == aform.payment.parts_id +"-"+ method.key +"-cardnumber4") {
      if (v.match(/^\d{2,4}$/)) {
        return true;
      }
    } else {
      if (v.match(/^\d{4}$/)) {
        return true;
      }
    }
    return false;
  });
  jQuery.validator.addMethod(method.key +'-expmm', function(v, elm) {
    if (!is_payment_method_selected(method)) {
      return true;
    }
    return (!isEmpty(v));
  });
  jQuery.validator.addMethod(method.key +'-expyy', function(v, elm) {
    if (!is_payment_method_selected(method)) {
      return true;
    }
    return (!isEmpty(v));
  });
  jQuery.validator.addMethod(method.key +'-cvv', function(v, elm) {
    if (!is_payment_method_selected(method)) {
      return true;
    }
    if (v.match(/^\d{3,4}$/)) {
      return true;
    }
    return false;
  });
}
function aform_set_payment_events() {
  jQuery('[name="aform-field-'+ aform.payment.field_id +'"]').click(function() {
    update_payment_method_fields();
  });
  update_payment_method_fields();
  // ecash
  if (aform.payment.methods.ecash) {
    init_card_fields(aform.payment.methods.ecash);
  }
  // remise
  if (aform.payment.methods.remise) {
    init_card_fields(aform.payment.methods.remise);
  }
  // cc_zeus
  if (aform.payment.methods.cc_zeus) {
    if (aform.payment.methods.cc_zeus.use_token_type) {
      init_cc_zeus_token();
    } else {
      init_card_fields(aform.payment.methods.cc_zeus);
    }
  }
}
// cc_zeus token type
function cc_zeus_token_clear_error() {
  jQuery('#zeus_token_card_error').html('');
}

function cc_zeus_token_add_error(msg) {
  jQuery('#zeus_token_card_error').append('<div>' + msg + '</div>');
}

function cc_zeus_token_validate() {
  var results = true;
  var first_error_elm = null;

  cc_zeus_token_clear_error();

  var elm = jQuery('#zeus_token_card_number');
  if (!elm.val().match(/^\d{14,16}$/)) {
    cc_zeus_token_add_error(aform.payment.methods.cc_zeus.msgs.cc_number_error);
    results = false;
    if (!first_error_elm) { first_error_elm = elm; }
  }

  var exp_mm_elm = null;
  elm = jQuery('#zeus_token_card_expires_month');
  if (!elm.val().match(/^\d{2}$/)) {
    cc_zeus_token_add_error(aform.payment.methods.cc_zeus.msgs.cc_exp_mm_error);
    results = false;
    if (!first_error_elm) { first_error_elm = elm; }
  } else {
    exp_mm_elm = elm;
  }

  var exp_yy_elm = null;
  elm = jQuery('#zeus_token_card_expires_year');
  if (!elm.val().match(/^\d{4}$/)) {
    cc_zeus_token_add_error(aform.payment.methods.cc_zeus.msgs.cc_exp_yy_error);
    results = false;
    if (!first_error_elm) { first_error_elm = elm; }
  } else {
    exp_yy_elm = elm;
  }

  if (exp_yy_elm && exp_mm_elm) {
    var date = new Date(exp_yy_elm.val(), exp_mm_elm.val(), 0);
    var today = new Date();
    if (date.getTime() < today.getTime()) {
      cc_zeus_token_add_error(aform.payment.methods.cc_zeus.msgs.cc_exp_error);
      results = false;
      if (!first_error_elm) { first_error_elm = exp_mm_elm; }
    }
  }

  elm = jQuery('#zeus_token_card_cvv');
  if (!elm.val().match(/^\d{3,4}$/)) {
    cc_zeus_token_add_error(aform.payment.methods.cc_zeus.msgs.cc_cvv_error);
    results = false;
    if (!first_error_elm) { first_error_elm = elm; }
  }

  elm = jQuery('#zeus_token_card_name');
  if (!elm.val().match(/^[A-Z ]+$/)) {
    cc_zeus_token_add_error(aform.payment.methods.cc_zeus.msgs.cc_owner_error);
    results = false;
    if (!first_error_elm) { first_error_elm = elm; }
  }

  if (first_error_elm) {
    first_error_elm.focus();
  }

  return results;
}
function init_cc_zeus_token() {
  var btn_confirm = jQuery('#aform_btn_confirm_'+ aform.id);

  var zeus_token_ok = false;
  jQuery.validator.setDefaults({ ignore: '#zues_token_card_number,#zeus_token_card_expires_month,#zeus_token_card_expires_year,#zeus_token_card_cvv,#zeus_token_card_name' });
  jQuery.validator.addMethod('validate-cc-zeus', function(v,elm) {
    if (!is_payment_method_selected(aform.payment.methods.cc_zeus)) {
      return true;
    }

    if (zeus_token_ok) {
      return true;
    }

    if (!cc_zeus_token_validate()) {
      jQuery('#zeus_token_card_error').show();
      return false;
    }

    btn_confirm.prop('disabled', true);
    zeusToken.getToken(function(zeus_token_response_data) {
      if (!zeus_token_response_data['result']) {
        var msgs = zeusToken.getErrorMessage(zeus_token_response_data['error_code']).split(' : ');
        cc_zeus_token_add_error(msgs[1]);
        jQuery('#zeus_token_card_error').show();
        jQuery('#zeus_token_card_number').focus();
      } else {
        cc_zeus_token_clear_error();
        jQuery('#zeus_token_card_error').hide();
        zeus_token_ok = true;
      }
    });
    btn_confirm.prop('disabled', false);
    return zeus_token_ok;
  });
}


// confirm
function documentReadyFormConfirm() {
    if (aform.use_xhr) {
      jQuery('#aform-confirm-form').submit(function() {
        return submitAFormConfirm();
      });
    }
}

function submitAFormConfirm() {
  jQuery('#aform_confirm_msg').hide();
  jQuery('#aform_btn_submit').attr('disabled', 'disabled');
  jQuery('#aform_btn_back').attr('disabled', 'disabled');

  jQuery('#use_js').val(1);
  jQuery.ajax ({
        type: "POST",
        url: jQuery('#aform-confirm-form').attr('action'),
        data: jQuery('#aform-confirm-form').serialize(),
        success: function(result, dataType) {
          jQuery('#aform_result').html(result);
          return false;
        },
        error: function(result, dataType) {
          alert('Ajax error');
        }
      });
  return false;
}

// reCAPTCHA
function aform_recaptcha_onSubmit(token) {
  aform.recaptcha.token = token;
  jQuery('#aform-form-' + aform.id).submit();
}

function aform_set_recaptcha_events() {
  if (aform.recaptcha.enable) {
    var form = jQuery('#aform-form-' + aform.id);
    jQuery(form).submit(function() {
      if (form.valid()) {
        if (!aform.recaptcha.token) {
          grecaptcha.reset();
          grecaptcha.execute();
        } else {
          aform.recaptcha.token = '';
          return true;
        }
      }
      return false;
    });
  }
}
