/*!
* Submitter v0.2.1
* https://github.com/fengyuanchen/submitter
*
* Copyright 2014 Fengyuan Chen
* Released under the MIT license
*/
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){"use strict";var b=function(c,d){d=a.isPlainObject(d)?d:{},this.$form=a(c),this.defaults=a.extend(!0,{},b.defaults,d),this.init()};b.prototype={constructor:b,support:{formData:!!window.FormData},init:function(){var b,c,d,e,f=this.defaults.ajaxOptions.url||this.defaults.url||this.$form.attr("action")||"";f&&(d=this.$form.find(":submit"),this.url=f,c={type:this.$form.attr("method")||"GET"},b={beforeSend:a.proxy(this.start,this),success:a.proxy(this.done,this),error:a.proxy(this.fail,this),complete:a.proxy(this.end,this)},this.ajaxOptions=a.extend({},c,this.defaults.ajaxOptions,b),this.defaults.async||this.initIframe(),this.$form.find(":file").length>0&&!this.support.formData&&(this.defaults.async=!1,this.initIframe()),0===d.length&&(d=a(''),this.$form.append(d)),this.$submit=d,this.defaults.resetAfterDone&&(e=this.$form.find(":reset"),0===e.length&&(e=a(''),this.$form.append(e)),this.$reset=e),this.formTarget=this.$form.attr("target"),this.enable())},enable:function(){this.$form.on("submit",a.proxy(this.submit,this))},disable:function(){this.$form.attr("target",this.formTarget).off(this.submit),this.$form=null,this.$iframe&&(this.$iframe.off("load").remove(),this.$iframe=null),this.$submit=null,this.$reset=null,this.ajaxOptions=null,this.defaults=null},submit:function(){return this.defaults.isValidated()?this.defaults.async?(this.ajaxSubmit(),!1):void this.start(null):!1},start:function(){this.$submit.prop("disabled",!0),a.isFunction(this.defaults.start)&&this.defaults.start("submitStart"),a.isFunction(this.defaults.ajaxOptions.beforeSend)&&this.defaults.ajaxOptions.beforeSend(arguments)},done:function(b){a.isFunction(this.defaults.done)&&this.defaults.done(b,"submitSuccess"),a.isFunction(this.defaults.ajaxOptions.success)&&this.defaults.ajaxOptions.success(arguments),this.defaults.resetAfterDone&&this.$reset&&this.$reset.click()},fail:function(){a.isFunction(this.defaults.fail)&&this.defaults.fail("submitError"),a.isFunction(this.defaults.ajaxOptions.error)&&this.defaults.ajaxOptions.error(arguments)},end:function(){this.$submit.prop("disabled",!1),a.isFunction(this.defaults.end)&&this.defaults.end("submitComplete"),a.isFunction(this.defaults.ajaxOptions.complete)&&this.defaults.ajaxOptions.complete(arguments)},ajaxSubmit:function(){var b=a.extend({},this.ajaxOptions);this.support.formData?(b.data=new FormData(this.$form[0]),b.type="POST",b.processData=!1,b.contentType=!1):b.data=this.$form.serialize(),a.ajax(this.url,b)},initIframe:function(){var b="submitter-"+Math.random().toString().replace("0.",""),c=a(''),d=this;c.on("load",function(){var b,c,e;try{c=this.contentWindow,e=this.contentDocument,e=e?e:c.document,b=e?e.body.innerText:null,b="string"==typeof b?a.parseJSON(b):b}catch(f){d.fail(null,"submitError",f.message)}b&&(a.isPlainObject(b)?d.done(b,"submitSuccess",null):d.fail(null,"submitError","The response data must be JSON."),d.end(null,"submitComplete"))}),this.defaults.ajaxOptions.type&&this.$form.attr("method",this.defaults.ajaxOptions.type),this.$form.attr("target",b).after(c),this.$iframe=c}},b.defaults={async:!0,resetAfterDone:!1,url:void 0,ajaxOptions:{dataType:"json"},messages:{start:"Submit start.",done:"Submit done.",fail:"Submit fail.",end:"Submit end."},isValidated:function(){return!0},start:function(){},done:function(){},fail:function(){},end:function(){}},b.setDefaults=function(c){a.extend(b.defaults,c)},a.fn.submitter=function(c){return this.each(function(){a(this).data("submitter",new b(this,c))})},a.fn.submitter.Constructor=b,a.fn.submitter.setDefaults=b.setDefaults});