"use strict";
/*jslint white: true, browser: true, devel: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: true, maxerr: 50, indent: 2 */

function Form($form, options) {
  options = $.extend(true, {beforeSubmit: $.noop, beforeSend: $.noop, error: $.noop, comlete: $.noop, success: $.noop, async: false, dataType: 'html', data: []}, options);

  this.bind = function () {
    var t = this;
    $form.live('submit', function (e) {
      t.submit.call(t, e);
      return false;
    });
  };

  this.submit = function (e) {
    if (options.beforeSubmit() === false) {
      return false;
    }

    var $form = $(e.target).closest('form');
    var sid = $.cookie('ffc.sid');
    var data = $.merge($form.serializeArray(), options.data);

    if (sid) {
      data = $.merge(data, [{'name' : 'api_session_sid', 'value' : sid}]);
    }

    $.ajax({
      url: $form.attr('action'),
      type: $form.attr('method'),
      dataType: options.dataType,
      data: data,
      beforeSend: options.beforeSend,
      success: function (xhr) {
        options.success(xhr);
      },
      complete: options.complete
    });
  };

  return this;
}
$.fn.bindSubmit = function (options) {
  var f = new Form($(this), options);
  f.bind();
  return $(this);
};
function FormError(error) {
  return {
    message: error
  };
}
var ErrorsFormatter = {
  list: function (errors) {
    if (!errors.length) {
      return '';
    }

    var html = '';
    for (var i = 0; i < errors.length; i += 1) {
      html += '<li>' + errors[i].message + '</li>';
    }

    return '<ul class="errors">' + html + '</ul>';
  }
};
var FormValidator = {
  checkFields: function (fields) {
    var errors = [];
    for (var field in fields) {
      if (fields.hasOwnProperty(field)) {
        var val = $.trim($(':input[name=' + field + ']').val()); 
        if (!val || val === fields[field]) {
          errors.push({field: field, message: 'The ' + fields[field] + ' is required field'});
        }
      }
    }
    if (errors.length) {
      throw errors;
    }
  },
  showErrors: function (errors, container) {
    if (!(errors instanceof Array)) { 
      errors = [errors];
    }

    $(container).html(ErrorsFormatter.list(errors));
    $(container).show();
  },
  checkEmail: function (value) {
    var regExp = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/;

    if (!regExp.test(value)) {
      throw new FormError("Email Address is incorrect.");
    }
  },
  checkUrl: function (value) {
    var regExp = new RegExp('^((https?|HTTPS?)\\:\\/\\/)?[a-zA-Z]\\w*([\\.\\-]\\w+)*\\.(aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|no|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|uk|gd|ge|gf|fr|gg|gh|gi|gl|gm|gn|gp|fr|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mn|mo|mp|mq|fr|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|fr|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|fr|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|fr|ro|rs|yu|ru|su|rw|sa|sb|sc|sd|se|sg|sh|si|sj|no|sk|sl|sm|sn|sr|st|su|sv|sy|sz|tc|td|tf|fr|tg|th|tj|tk|tl|tp|tm|tn|to|tp|tl|tr|tt|tv|tw|tz|ua|ug|uk|us|gov|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|fr|ws|ye|yt|fr|yu|za|zm|zw|arpa)(\\:\\d+)*([\\/\\.\\-\\?\\&\\%\\#=]\\w+)*\\/?$');

    if (!regExp.test(value)) {
      throw new FormError("Url is incorrect.");
    }
  },
  checkPhone: function (value) {
    var regExp = new RegExp('^[ 0-9()-.]{9,}$');

    if (!regExp.test(value)) {
      throw new FormError("Phone is incorrect.");
    }
  }
};
