// 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 aform$('<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++ ){
    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(/(.*)-[0-9]+$/, "$1");
  }
  if( elm[0].name.match(/(aform-field-[0-9]+)-[0-9]+-text$/) ){
    id = id.replace(/(.*)-[0-9]+-text$/, "$1");
  }
  if( elm[0].id.match(/^(.*)-confirm$/) ){
    id = RegExp.$1;
  }
  error.addClass('validation-advice');
  aform$('#'+ id +'-error').html(error);
}

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

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

    aform_jQuery.validator.addMethod('validate-length', function(v,elm) {
      var max_length = aform$(elm).attr('maxlength');
      v = v.replace(/\r/g, "");
      v = v.replace(/\n/g, "");
      if( v.length <= max_length ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('max_length_error', elm, v);
        return false;
      }
    });

    aform_jQuery.validator.addMethod('validate-email', function(v,elm) {
      if( isEmpty(v) || /^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/i.test(v) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('email_format_error', elm, v);
        return false;
      }
    });

    aform_jQuery.validator.addMethod('validate-url', function (v,elm) {
      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;
      }
    });

    aform_jQuery.validator.addMethod('validate-tel', function(v,elm) {
      if( isEmpty(v) || /^[0-9\-]+$/.test(v) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('tel_format_error', elm, v);
        return false;
      }
    });

    aform_jQuery.validator.addMethod('validate-zipcode', function(v,elm) {
      if( isEmpty(v) || /^[0-9]{3}-[0-9]{4}$/.test(v) ){
        removeAFormInputErrorTitle(elm);
        return true;
      }else{
        addAFormInputErrorTitle(elm);
        postAFormErrorLog('zipcode_format_error', elm, v);
        return false;
      }
    });

    aform_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;
      }
    });

    aform_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;
      aform$(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, v);
        return false;
      }
    });

    aform_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( aform$('#'+field_id+'-'+option_idx)[0].checked && isEmpty(v) ){
          addAFormInputErrorTitle(elm);
          postAFormErrorLog('empty', elm, v);
          return false;
        }else{
          removeAFormInputErrorTitle(elm);
          return true;
        }
      }
      return true;
    });

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

    aform_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;
      aform$(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, v);
        return false;
      }
    });

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

    aform_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;
      }
    });

    aform_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;
      }
    });
}



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");
  aform$(field_id + '-error').innerHTML = '';
}

function postAFormAccessLog(aform_id)
{
  var params = {
    screen : 'form',
    run_mode : 'access',
    aform_id : aform_id,
    aform_url : document.location.href,
    first_access : aform$.cookie(document.location.pathname) ? 0 : 1
  };
  aform_jQuery.post(
        aform.logger_url,
        params
        ); 
  var date = new Date();
  date.setTime(date.getTime() + 30*60*1000);
  aform$.cookie(document.location.pathname, "1", { expires: date});	// expires sec
}

function postAFormErrorLog(type, elm, value)
{
  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
  };
  aform_jQuery.post(
        aform.logger_url,
        params
  );
}

function postAFormChecker()
{
  aform_jQuery.post(aform.checker_url);
}

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

  var params = {
    __mode : 'rebuild_aform',
    aform_id : aform_id
  };
  aform_jQuery.post(
        aform.checker_url,
        params,
        reload_if_rebuild
  ); 
}

function reload_if_rebuild(response)
{
  if( response == 'rebuild' ){
    document.location.reload();
  }else{
    aform_jQuery('.aform-checking').hide();
    aform_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 = '';
  }
  aform_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 + ")");
      aform_jQuery('#aform-upload-info-' + field_id).text(fileObj.name + response.message);
      switch( response.result ){
      case 'success':
        aform_jQuery('#aform-field-' + field_id).val(response.id);
        aform_jQuery('#aform-upload-name-' + field_id).val(fileObj.name);
        aform_jQuery('#aform-upload-remove-' + field_id).show();
        aform_jQuery('#advice-validate-upload-aform-field-' + field_id).hide();
        break;
      default:
        aform_jQuery('#aform-field-' + field_id).val('');
        aform_jQuery('#aform-upload-name-' + field_id).val('');
        aform_jQuery('#aform-upload-remove-' + field_id).hide();
        break;
      }
      this.enable();
    },
    onError : function(event, queueID, fileObj, errorObj){
      switch( errorObj.type ){
      case 'File Size':
        aform_jQuery("#" + event.target.id + queueID + " .fileName").text("エラー : ファイルサイズオーバー " + fileObj.name);
        break;
      default:
        alert('error!' + errorObj.type);
        break;
      }
      return false;
    }
  });
}

function remove_upload(field_id){
  aform_jQuery('#aform-upload-info-' + field_id).text('');
  aform_jQuery('#aform-field-' + field_id).val('');
  aform_jQuery('#aform-upload-name-' + field_id).val('');
  aform_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 = aform$.query.get(parameter_name);
  aform_jQuery('#' + parts_id).val(val);
  aform_jQuery('#' + parts_id + '-text').text(val);
}

function set_datepicker(parts_id, range_from, range_to){
  aform$('#' + parts_id).datepicker({
    showOn: 'button',
    buttonImage: aform.static_uri + 'plugins/AForm/images/calendar.gif',
    buttonImageOnly: true,
    changeMonth: true,
    changeYear: true,
    minDate: new Date(range_from, 1-1, 1),
    maxDate: new Date(range_to, 12-1, 31),
    beforeShow: function(){
      var yy = aform$('#' + parts_id + '-yy').val();
      var mm = aform$('#' + parts_id + '-mm').val();
      var dd = aform$('#' + parts_id + '-dd').val();
      if( yy > 0 && mm > 0 && dd > 0 ){
        aform$(this).datepicker('setDate', new Date(yy, mm-1, dd));
      }
    },
    onSelect: function() {
      var date = aform$(this).datepicker('getDate');
      var elm_yy = aform$('#' + parts_id + '-yy');
      var elm_mm = aform$('#' + parts_id + '-mm');
      var elm_dd = aform$('#' + parts_id + '-dd');
      aform$(elm_yy).val(date.getFullYear());
      aform$(elm_mm).val(date.getMonth()+1);
      aform$(elm_dd).val(date.getDate());
      aform$(elm_yy).valid();
      aform$(elm_mm).valid();
      aform$(elm_dd).valid();
    }
  });
}

aform$(document).ready(function(){
  aform_set_reserve_events();
});

function aform_set_reserve_events(){
  aform$('.aform-reserve-plan-id').change(function(){
    var field_id;
    if( this.name.match(/^aform-field-(\d+)-plan-id$/) ){
      field_id = RegExp.$1;
    }
    if( !field_id ){
      return;
    }
    var option_value_select = aform$('#aform-field-'+ field_id +'-option-value-id');
    option_value_select.empty();
    var plan_id = aform$(this).val();
    var option_items = '<option value="">-</option>';
    for( option_value_id in aformReserveOptionValues[plan_id] ){
      option_value_value = aformReserveOptionValues[plan_id][option_value_id];
      option_items += '<option value="' + option_value_id + '">' + option_value_value + '</option>';
    }
    option_value_select.append(option_items);
  });
}

aform$(window).unload(function(){
  aform$.ajax({
    async: false,
    type: "POST",
    url: aform.unload_saver_url,
    data: aform$('#aform-form-'+aform.id).serialize(),
    success: function(data){
    }
  });
});

