2011-05-21 02:57:17 +00:00
; ( function ( $ ) { $ . fn . ajaxSubmit = function ( options ) { if ( ! this . length ) { log ( 'ajaxSubmit: skipping submit process - no element selected' ) ; return this ; }
if ( typeof options == 'function' ) { options = { success : options } ; }
var action = this . attr ( 'action' ) ; var url = ( typeof action === 'string' ) ? $ . trim ( action ) : '' ; url = url || window . location . href || '' ; if ( url ) { url = ( url . match ( /^([^#]+)/ ) || [ ] ) [ 1 ] ; }
options = $ . extend ( true , { url : url , success : $ . ajaxSettings . success , type : this [ 0 ] . getAttribute ( 'method' ) || 'GET' , iframeSrc : /^https/i . test ( window . location . href || '' ) ? 'javascript:false' : 'about:blank' } , options ) ; var veto = { } ; this . trigger ( 'form-pre-serialize' , [ this , options , veto ] ) ; if ( veto . veto ) { log ( 'ajaxSubmit: submit vetoed via form-pre-serialize trigger' ) ; return this ; }
if ( options . beforeSerialize && options . beforeSerialize ( this , options ) === false ) { log ( 'ajaxSubmit: submit aborted via beforeSerialize callback' ) ; return this ; }
var n , v , a = this . formToArray ( options . semantic ) ; if ( options . data ) { options . extraData = options . data ; for ( n in options . data ) { if ( options . data [ n ] instanceof Array ) { for ( var k in options . data [ n ] ) { a . push ( { name : n , value : options . data [ n ] [ k ] } ) ; } }
else { v = options . data [ n ] ; v = $ . isFunction ( v ) ? v ( ) : v ; a . push ( { name : n , value : v } ) ; } } }
if ( options . beforeSubmit && options . beforeSubmit ( a , this , options ) === false ) { log ( 'ajaxSubmit: submit aborted via beforeSubmit callback' ) ; return this ; }
this . trigger ( 'form-submit-validate' , [ a , this , options , veto ] ) ; if ( veto . veto ) { log ( 'ajaxSubmit: submit vetoed via form-submit-validate trigger' ) ; return this ; }
var q = $ . 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 || function ( ) { } ; callbacks . push ( function ( data ) { var fn = options . replaceTarget ? 'replaceWith' : 'html' ; $ ( options . target ) [ fn ] ( data ) . each ( oldSuccess , arguments ) ; } ) ; }
else if ( options . success ) { callbacks . push ( options . success ) ; }
options . success = function ( data , status , xhr ) { var context = options . context || options ; for ( var i = 0 , max = callbacks . length ; i < max ; i ++ ) { callbacks [ i ] . apply ( context , [ data , status , xhr || $form , $form ] ) ; } } ; var fileInputs = $ ( 'input:file' , this ) . length > 0 ; var mp = 'multipart/form-data' ; var multipart = ( $form . attr ( 'enctype' ) == mp || $form . attr ( 'encoding' ) == mp ) ; if ( options . iframe !== false && ( fileInputs || options . iframe || multipart ) ) { if ( options . closeKeepAlive ) { $ . get ( options . closeKeepAlive , fileUpload ) ; }
else { fileUpload ( ) ; } }
else { $ . ajax ( options ) ; }
this . trigger ( 'form-submit-notify' , [ this , options ] ) ; return this ; function fileUpload ( ) { var form = $form [ 0 ] ; if ( $ ( ':input[name=submit],:input[id=submit]' , form ) . length ) { alert ( 'Error: Form elements must not have name or id of "submit".' ) ; return ; }
var s = $ . extend ( true , { } , $ . ajaxSettings , options ) ; s . context = s . context || s ; var id = 'jqFormIO' + ( new Date ( ) . getTime ( ) ) , fn = '_' + id ; var $io = $ ( '<iframe id="' + id + '" name="' + id + '" src="' + s . iframeSrc + '" />' ) ; var io = $io [ 0 ] ; $io . css ( { position : 'absolute' , top : '-1000px' , left : '-1000px' } ) ; var xhr = { aborted : 0 , responseText : null , responseXML : null , status : 0 , statusText : 'n/a' , getAllResponseHeaders : function ( ) { } , getResponseHeader : function ( ) { } , setRequestHeader : function ( ) { } , abort : function ( status ) { var e = ( status === 'timeout' ? 'timeout' : 'aborted' ) ; log ( 'aborting upload... ' + e ) ; this . aborted = 1 ; $io . attr ( 'src' , s . iframeSrc ) ; xhr . error = e ; s . error && s . error . call ( s . context , xhr , e , e ) ; g && $ . event . trigger ( "ajaxError" , [ xhr , s , e ] ) ; s . complete && s . complete . call ( s . context , xhr , e ) ; } } ; var g = s . global ; if ( g && ! $ . active ++ ) { $ . event . trigger ( "ajaxStart" ) ; }
if ( g ) { $ . event . trigger ( "ajaxSend" , [ xhr , s ] ) ; }
if ( s . beforeSend && s . beforeSend . call ( s . context , xhr , s ) === false ) { if ( s . global ) { $ . active -- ; }
return ; }
if ( xhr . aborted ) { return ; }
var timedOut = 0 , timeoutHandle ; var sub = form . clk ; if ( sub ) { var n = sub . name ; if ( n && ! sub . disabled ) { s . extraData = s . extraData || { } ; s . extraData [ n ] = sub . value ; if ( sub . type == "image" ) { s . extraData [ n + '.x' ] = form . clk _x ; s . extraData [ n + '.y' ] = form . clk _y ; } } }
function doSubmit ( ) { var t = $form . attr ( 'target' ) , a = $form . attr ( 'action' ) ; form . setAttribute ( 'target' , id ) ; if ( form . getAttribute ( 'method' ) != 'POST' ) { form . setAttribute ( 'method' , 'POST' ) ; }
if ( form . getAttribute ( 'action' ) != s . url ) { form . setAttribute ( 'action' , s . url ) ; }
if ( ! s . skipEncodingOverride ) { $form . attr ( { encoding : 'multipart/form-data' , enctype : 'multipart/form-data' } ) ; }
if ( s . timeout ) { timeoutHandle = setTimeout ( function ( ) { timedOut = true ; cb ( true ) ; } , s . timeout ) ; }
var extraInputs = [ ] ; try { if ( s . extraData ) { for ( var n in s . extraData ) { extraInputs . push ( $ ( '<input type="hidden" name="' + n + '" value="' + s . extraData [ n ] + '" />' ) . appendTo ( form ) [ 0 ] ) ; } }
$io . appendTo ( 'body' ) ; io . attachEvent ? io . attachEvent ( 'onload' , cb ) : io . addEventListener ( 'load' , cb , false ) ; form . submit ( ) ; }
finally { form . setAttribute ( 'action' , a ) ; if ( t ) { form . setAttribute ( 'target' , t ) ; } else { $form . removeAttr ( 'target' ) ; }
$ ( extraInputs ) . remove ( ) ; } }
if ( s . forceSync ) { doSubmit ( ) ; }
else { setTimeout ( doSubmit , 10 ) ; }
var data , doc , domCheckCount = 50 , callbackProcessed ; function cb ( e ) { if ( xhr . aborted || callbackProcessed ) { return ; }
if ( e === true && xhr ) { xhr . abort ( 'timeout' ) ; return ; }
var doc = io . contentWindow ? io . contentWindow . document : io . contentDocument ? io . contentDocument : io . document ; if ( ! doc || doc . location . href == s . iframeSrc ) { if ( ! timedOut )
return ; }
io . detachEvent ? io . detachEvent ( 'onload' , cb ) : io . removeEventListener ( 'load' , cb , false ) ; var ok = true ; try { if ( timedOut ) { throw 'timeout' ; }
var isXml = s . dataType == 'xml' || doc . XMLDocument || $ . isXMLDoc ( doc ) ; log ( 'isXml=' + isXml ) ; if ( ! isXml && window . opera && ( doc . body == null || doc . body . innerHTML == '' ) ) { if ( -- domCheckCount ) { log ( 'requeing onLoad callback, DOM not available' ) ; setTimeout ( cb , 250 ) ; return ; } }
xhr . responseText = doc . body ? doc . body . innerHTML : doc . documentElement ? doc . documentElement . innerHTML : null ; xhr . responseXML = doc . XMLDocument ? doc . XMLDocument : doc ; if ( isXml )
s . dataType = 'xml' ; xhr . getResponseHeader = function ( header ) { var headers = { 'content-type' : s . dataType } ; return headers [ header ] ; } ; var scr = /(json|script|text)/ . test ( s . dataType ) ; if ( scr || s . textarea ) { var ta = doc . getElementsByTagName ( 'textarea' ) [ 0 ] ; if ( ta ) { xhr . responseText = ta . value ; }
else if ( scr ) { var pre = doc . getElementsByTagName ( 'pre' ) [ 0 ] ; var b = doc . getElementsByTagName ( 'body' ) [ 0 ] ; if ( pre ) { xhr . responseText = pre . textContent ? pre . textContent : pre . innerHTML ; }
else if ( b ) { xhr . responseText = b . innerHTML ; } } }
else if ( s . dataType == 'xml' && ! xhr . responseXML && xhr . responseText != null ) { xhr . responseXML = toXml ( xhr . responseText ) ; }
data = httpData ( xhr , s . dataType , s ) ; }
catch ( e ) { log ( 'error caught:' , e ) ; ok = false ; xhr . error = e ; s . error && s . error . call ( s . context , xhr , 'error' , e ) ; g && $ . event . trigger ( "ajaxError" , [ xhr , s , e ] ) ; }
if ( xhr . aborted ) { log ( 'upload aborted' ) ; ok = false ; }
if ( ok ) { s . success && s . success . call ( s . context , data , 'success' , xhr ) ; g && $ . event . trigger ( "ajaxSuccess" , [ xhr , s ] ) ; }
g && $ . event . trigger ( "ajaxComplete" , [ xhr , s ] ) ; if ( g && ! -- $ . active ) { $ . event . trigger ( "ajaxStop" ) ; }
s . complete && s . complete . call ( s . context , xhr , ok ? 'success' : 'error' ) ; callbackProcessed = true ; if ( s . timeout )
clearTimeout ( timeoutHandle ) ; setTimeout ( function ( ) { $io . removeData ( 'form-plugin-onload' ) ; $io . remove ( ) ; xhr . responseXML = null ; } , 100 ) ; }
var toXml = $ . parseXML || function ( s , doc ) { if ( window . ActiveXObject ) { doc = new ActiveXObject ( 'Microsoft.XMLDOM' ) ; doc . async = 'false' ; doc . loadXML ( s ) ; }
else { doc = ( new DOMParser ( ) ) . parseFromString ( s , 'text/xml' ) ; }
return ( doc && doc . documentElement && doc . documentElement . nodeName != 'parsererror' ) ? doc : null ; } ; var parseJSON = $ . parseJSON || function ( s ) { return window [ 'eval' ] ( '(' + s + ')' ) ; } ; var httpData = function ( xhr , type , s ) { var ct = xhr . getResponseHeader ( 'content-type' ) || '' , xml = type === 'xml' || ! type && ct . indexOf ( 'xml' ) >= 0 , data = xml ? xhr . responseXML : xhr . responseText ; if ( xml && data . documentElement . nodeName === 'parsererror' ) { $ . error && $ . error ( 'parsererror' ) ; }
if ( s && s . dataFilter ) { data = s . dataFilter ( data , type ) ; }
if ( typeof data === 'string' ) { if ( type === 'json' || ! type && ct . indexOf ( 'json' ) >= 0 ) { data = parseJSON ( data ) ; } else if ( type === "script" || ! type && ct . indexOf ( "javascript" ) >= 0 ) { $ . globalEval ( data ) ; } }
return data ; } ; } } ; $ . fn . ajaxForm = function ( options ) { if ( this . length === 0 ) { var o = { s : this . selector , c : this . context } ; if ( ! $ . isReady && o . s ) { log ( 'DOM not ready, queuing ajaxForm' ) ; $ ( function ( ) { $ ( o . s , o . c ) . ajaxForm ( options ) ; } ) ; return this ; }
log ( 'terminating; zero elements found by selector' + ( $ . isReady ? '' : ' (DOM not ready)' ) ) ; return this ; }
return this . ajaxFormUnbind ( ) . bind ( 'submit.form-plugin' , function ( e ) { if ( ! e . isDefaultPrevented ( ) ) { e . preventDefault ( ) ; $ ( this ) . ajaxSubmit ( options ) ; } } ) . bind ( 'click.form-plugin' , function ( e ) { var target = e . target ; var $el = $ ( target ) ; if ( ! ( $el . is ( ":submit,input:image" ) ) ) { var t = $el . closest ( ':submit' ) ; if ( t . length == 0 ) { return ; }
target = t [ 0 ] ; }
var form = this ; form . clk = target ; if ( target . type == 'image' ) { if ( e . offsetX != undefined ) { form . clk _x = e . offsetX ; form . clk _y = e . offsetY ; } else if ( typeof $ . fn . offset == 'function' ) { var offset = $el . offset ( ) ; form . clk _x = e . pageX - offset . left ; form . clk _y = e . pageY - offset . top ; } else { form . clk _x = e . pageX - target . offsetLeft ; form . clk _y = e . pageY - target . offsetTop ; } }
setTimeout ( function ( ) { form . clk = form . clk _x = form . clk _y = null ; } , 100 ) ; } ) ; } ; $ . fn . ajaxFormUnbind = function ( ) { return this . unbind ( 'submit.form-plugin click.form-plugin' ) ; } ; $ . fn . formToArray = function ( semantic ) { var a = [ ] ; if ( this . length === 0 ) { return a ; }
var form = this [ 0 ] ; var els = semantic ? form . getElementsByTagName ( '*' ) : form . elements ; if ( ! els ) { return a ; }
var i , j , n , v , el , max , jmax ; for ( i = 0 , max = els . length ; i < max ; i ++ ) { el = els [ i ] ; n = el . name ; if ( ! n ) { continue ; }
if ( semantic && form . clk && el . type == "image" ) { if ( ! el . disabled && form . clk == el ) { a . push ( { name : n , value : $ ( el ) . val ( ) } ) ; a . push ( { name : n + '.x' , value : form . clk _x } , { name : n + '.y' , value : form . clk _y } ) ; }
continue ; }
v = $ . fieldValue ( el , true ) ; if ( v && v . constructor == Array ) { for ( j = 0 , jmax = v . length ; j < jmax ; j ++ ) { a . push ( { name : n , value : v [ j ] } ) ; } }
else if ( v !== null && typeof v != 'undefined' ) { a . push ( { name : n , value : v } ) ; } }
if ( ! semantic && form . clk ) { var $input = $ ( form . clk ) , input = $input [ 0 ] ; n = input . name ; if ( n && ! input . disabled && input . type == 'image' ) { a . push ( { name : n , value : $input . val ( ) } ) ; a . push ( { name : n + '.x' , value : form . clk _x } , { name : n + '.y' , value : form . clk _y } ) ; } }
return a ; } ; $ . fn . formSerialize = function ( semantic ) { return $ . param ( this . formToArray ( semantic ) ) ; } ; $ . fn . fieldSerialize = function ( successful ) { var a = [ ] ; this . each ( function ( ) { var n = this . name ; if ( ! n ) { return ; }
var v = $ . fieldValue ( this , successful ) ; if ( v && v . constructor == Array ) { for ( var i = 0 , max = v . length ; i < max ; i ++ ) { a . push ( { name : n , value : v [ i ] } ) ; } }
else if ( v !== null && typeof v != 'undefined' ) { a . push ( { name : this . name , value : v } ) ; } } ) ; return $ . param ( a ) ; } ; $ . fn . fieldValue = function ( successful ) { for ( var val = [ ] , i = 0 , max = this . length ; i < max ; i ++ ) { var el = this [ i ] ; var v = $ . fieldValue ( el , successful ) ; if ( v === null || typeof v == 'undefined' || ( v . constructor == Array && ! v . length ) ) { continue ; }
v . constructor == Array ? $ . merge ( val , v ) : val . push ( v ) ; }
return val ; } ; $ . fieldValue = function ( el , successful ) { var n = el . name , t = el . type , tag = el . tagName . toLowerCase ( ) ; if ( successful === undefined ) { successful = true ; }
if ( successful && ( ! n || el . disabled || t == 'reset' || t == 'button' || ( t == 'checkbox' || t == 'radio' ) && ! el . checked || ( t == 'submit' || t == 'image' ) && el . form && el . form . clk != el || tag == 'select' && el . selectedIndex == - 1 ) ) { return null ; }
if ( tag == 'select' ) { var index = el . selectedIndex ; if ( index < 0 ) { return null ; }
var a = [ ] , ops = el . options ; var one = ( t == 'select-one' ) ; var max = ( one ? index + 1 : ops . length ) ; for ( var i = ( one ? index : 0 ) ; i < max ; i ++ ) { var op = ops [ i ] ; if ( op . selected ) { var v = op . value ; if ( ! v ) { v = ( op . attributes && op . attributes [ 'value' ] && ! ( op . attributes [ 'value' ] . specified ) ) ? op . text : op . value ; }
if ( one ) { return v ; }
a . push ( v ) ; } }
return a ; }
return $ ( el ) . val ( ) ; } ; $ . fn . clearForm = function ( ) { return this . each ( function ( ) { $ ( 'input,select,textarea' , this ) . clearFields ( ) ; } ) ; } ; $ . fn . clearFields = $ . fn . clearInputs = function ( ) { return this . each ( function ( ) { var t = this . type , tag = this . tagName . toLowerCase ( ) ; if ( t == 'text' || t == 'password' || tag == 'textarea' ) { this . value = '' ; }
else if ( t == 'checkbox' || t == 'radio' ) { this . checked = false ; }
else if ( tag == '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 ( ) ; } } ) ; } ; $ . fn . enable = function ( b ) { if ( b === undefined ) { b = true ; }
return this . each ( function ( ) { this . disabled = ! b ; } ) ; } ; $ . fn . selected = function ( select ) { if ( select === undefined ) { select = true ; }
return this . each ( function ( ) { var t = this . type ; if ( t == 'checkbox' || t == 'radio' ) { this . checked = select ; }
else if ( this . tagName . toLowerCase ( ) == 'option' ) { var $sel = $ ( this ) . parent ( 'select' ) ; if ( select && $sel [ 0 ] && $sel [ 0 ] . type == 'select-one' ) { $sel . find ( 'option' ) . selected ( false ) ; }
this . selected = select ; } } ) ; } ; function log ( ) { if ( $ . fn . ajaxSubmit . debug ) { var msg = '[jquery.form] ' + Array . prototype . join . call ( arguments , '' ) ; if ( window . console && window . console . log ) { window . console . log ( msg ) ; }
else if ( window . opera && window . opera . postError ) { window . opera . postError ( msg ) ; } } } ; } ) ( jQuery ) ;