//jquery form+ajax插件

(function($){
$.fn.param=function( a ) {
   var encode=function(v){//如果包含中文就escape,避免重复escape)
     return /[^\x00-\xff]/g.test(v)?escape(v):v;
    }
   var s = [];
   // If an array was passed in, assume that it is an array
   // of form elements
   if ( a.constructor == Array || a.jquery )
    // Serialize the form elements
    jQuery.each( a, function(){
     s.push( encode(this.name) + "=" + encode( this.value ) );
    });

   // Otherwise, assume that it's an object of key/value pairs
   else
    // Serialize the key/values
    for ( var j in a )
     // If the value is an array then the key names need to be repeated
     if ( a[j] && a[j].constructor == Array )
      jQuery.each( a[j], function(){
       s.push( encode(j) + "=" + encode( this ) );
      });
     else
      s.push( encode(j) + "=" + encode( a[j] ) );

   // Return the resulting serialization
   return s.join("&").replace(/%20/g, "+");
}
$.fn.ajaxSubmit=function(options){if(typeof options=="function")options={success:options};options=$.extend({url:this.attr("action")||window.location,type:this.attr("method")||"GET"},options||{});var a=this.formToArray(options.semantic);if(options.beforeSubmit&&options.beforeSubmit(a,this,options)===false)return this;var veto={};$.event.trigger("form.submit.validate",[a,this,options,veto]);if(veto.veto)return this;var q=this.param(a);if(options.type.toUpperCase()=="GET"){options.url+=(options.url.indexOf("?")>=0?"&":"?")+q;options.data=null}else options.data=q;var $form=this,callbacks=[];if(options.resetForm)callbacks.push(function(){$form.resetForm()});if(options.clearForm)callbacks.push(function(){$form.clearForm()});if(!options.dataType&&options.target){var oldSuccess=options.success;callbacks.push(function(_){$(options.target).attr("innerHTML",_).evalScripts().each(oldSuccess,arguments)})}else if(options.success)callbacks.push(options.success);options.success=function(A,_){for(var B=0,$=callbacks.length;B<$;B++)callbacks[B](A,_,$form)};var files=$("input:file",this).fieldValue(),found=false;for(var j=0;j<files.length;j++)if(files[j])found=true;if(options.iframe||found)fileUpload();else $.ajax(options);$.event.trigger("form.submit.notify",[this,options]);return this;function fileUpload(){var form=$form[0],opts=$.extend({},$.ajaxSettings,options),id="jqFormIO"+$.fn.ajaxSubmit.counter++,$io=$("<iframe id=\""+id+"\" name=\""+id+"\" />"),io=$io[0],op8=$.browser.opera&&window.opera.version()<9;if($.browser.msie||op8)io.src="javascript:false;document.write(\"\");";$io.css({position:"absolute",top:"-1000px",left:"-1000px"});var xhr={responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){}},g=opts.global;if(g&&!$.active++)$.event.trigger("ajaxStart");if(g)$.event.trigger("ajaxSend",[xhr,opts]);var cbInvoked=0,timedOut=0;setTimeout(function(){$io.appendTo("body");io.attachEvent?io.attachEvent("onload",cb):io.addEventListener("load",cb,false);var $=form.encoding?"encoding":"enctype",_=$form.attr("target");$form.attr({target:id,method:"POST",encAttr:"multipart/form-data",action:opts.url});if(opts.timeout)setTimeout(function(){timedOut=true;cb()},opts.timeout);form.submit();$form.attr("target",_)},10);function cb(){if(cbInvoked++)return;io.detachEvent?io.detachEvent("onload",cb):io.removeEventListener("load",cb,false);var ok=true;try{if(timedOut)throw"timeout";var data,doc;doc=io.contentWindow?io.contentWindow.document:io.contentDocument?io.contentDocument:io.document;xhr.responseText=doc.body?doc.body.innerHTML:null;xhr.responseXML=doc.XMLDocument?doc.XMLDocument:doc;if(opts.dataType=="json"||opts.dataType=="script"){var ta=doc.getElementsByTagName("textarea")[0];data=ta?ta.value:xhr.responseText;if(opts.dataType=="json")eval("data = "+data);else $.globalEval(data)}else if(opts.dataType=="xml"){data=xhr.responseXML;if(!data&&xhr.responseText!=null)data=toXml(xhr.responseText)}else data=xhr.responseText}catch(e){ok=false;$.handleError(opts,xhr,"error",e)}if(ok){opts.success(data,"success");if(g)$.event.trigger("ajaxSuccess",[xhr,opts])}if(g)$.event.trigger("ajaxComplete",[xhr,opts]);if(g&&!--$.active)$.event.trigger("ajaxStop");if(opts.complete)opts.complete(xhr,ok?"success":"error");setTimeout(function(){$io.remove();xhr.responseXML=null},100)}function toXml($,_){if(window.ActiveXObject){_=new ActiveXObject("Microsoft.XMLDOM");_.async="false";_.loadXML($)}else _=(new DOMParser()).parseFromString($,"text/xml");return(_&&_.documentElement&&_.documentElement.tagName!="parsererror")?_:null}}};$.fn.ajaxSubmit.counter=0;$.fn.ajaxForm=function(_){return this.ajaxFormUnbind().submit(submitHandler).each(function(){this.formPluginId=$.fn.ajaxForm.counter++;$.fn.ajaxForm.optionHash[this.formPluginId]=_;$(":submit,input:image",this).click(clickHandler)})};$.fn.ajaxForm.counter=1;$.fn.ajaxForm.optionHash={};function clickHandler(_){var A=this.form;A.clk=this;if(this.type=="image")if(_.offsetX!=undefined){A.clk_x=_.offsetX;A.clk_y=_.offsetY}else if(typeof $.fn.offset=="function"){var B=$(this).offset();A.clk_x=_.pageX-B.left;A.clk_y=_.pageY-B.top}else{A.clk_x=_.pageX-this.offsetLeft;A.clk_y=_.pageY-this.offsetTop}setTimeout(function(){A.clk=A.clk_x=A.clk_y=null},10)}function submitHandler(){var _=this.formPluginId,A=$.fn.ajaxForm.optionHash[_];$(this).ajaxSubmit(A);return false}$.fn.ajaxFormUnbind=function(){this.unbind("submit",submitHandler);return this.each(function(){$(":submit,input:image",this).unbind("click",clickHandler)})};$.fn.formToArray=function(D){var B=[];if(this.length==0)return B;var A=this[0],F=D?A.getElementsByTagName("*"):A.elements;if(!F)return B;for(var G=0,_=F.length;G<_;G++){var K=F[G],C=K.name;if(!C)continue;if(D&&A.clk&&K.type=="image"){if(!K.disabled&&A.clk==K)B.push({name:C+".x",value:A.clk_x},{name:C+".y",value:A.clk_y});continue}var H=$.fieldValue(K,true);if(H&&H.constructor==Array){for(var E=0,I=H.length;E<I;E++)B.push({name:C,value:H[E]})}else if(H!==null&&typeof H!="undefined")B.push({name:C,value:H})}if(!D&&A.clk){var L=A.getElementsByTagName("input");for(G=0,_=L.length;G<_;G++){var J=L[G],C=J.name;if(C&&!J.disabled&&J.type=="image"&&A.clk==J)B.push({name:C+".x",value:A.clk_x},{name:C+".y",value:A.clk_y})}}return B};$.fn.formSerialize=function(_){return this.param(this.formToArray(_))};$.fn.fieldSerialize=function(A){var _=[];this.each(function(){var D=this.name;if(!D)return;var B=$.fieldValue(this,A);if(B&&B.constructor==Array){for(var E=0,C=B.length;E<C;E++)_.push({name:D,value:B[E]})}else if(B!==null&&typeof B!="undefined")_.push({name:this.name,value:B})});return this.param(_)};$.fn.fieldValue=function(D){for(var _=[],E=0,B=this.length;E<B;E++){var C=this[E],A=$.fieldValue(C,D);if(A===null||typeof A=="undefined"||(A.constructor==Array&&!A.length))continue;A.constructor==Array?$.merge(_,A):_.push(A)}return _};$.fieldValue=function(J,K){var F=J.name,I=J.type,C=J.tagName.toLowerCase();if(typeof K=="undefined")K=true;if(K&&(!F||J.disabled||I=="reset"||I=="button"||(I=="checkbox"||I=="radio")&&!J.checked||(I=="submit"||I=="image")&&J.form&&J.form.clk!=J||C=="select"&&J.selectedIndex==-1))return null;if(C=="select"){var _=J.selectedIndex;if(_<0)return null;var D=[],L=J.options,E=(I=="select-one"),A=(E?_+1:L.length);for(var G=(E?_:0);G<A;G++){var B=L[G];if(B.selected){var H=$.browser.msie&&!(B.attributes["value"].specified)?B.text:B.value;if(E)return H;D.push(H)}}return D}return J.value};$.fn.clearForm=function(){return this.each(function(){$("input,select,textarea",this).clearFields()})};$.fn.clearFields=$.fn.clearInputs=function(){return this.each(function(){var $=this.type,_=this.tagName.toLowerCase();if($=="text"||$=="password"||_=="textarea")this.value="";else if($=="checkbox"||$=="radio")this.checked=false;else if(_=="select")this.selectedIndex=-1})};$.fn.resetForm=function(){return this.each(function(){if(typeof this.reset=="function"||(typeof this.reset=="object"&&!this.reset.nodeType))this.reset()})}})(jQuery)