jquery.extend({ createuploadiframe: function(id, uri) { //create frame var frameid = 'juploadframe' + id; var iframehtml = ''; jquery(iframehtml).appendto(document.body); return jquery('#' + frameid).get(0); }, createuploadform: function(id,fileelementid,data,fileelement) { //create form var formid = 'juploadform' + id; var fileid = 'juploadfile' + id; var form = jquery('
'); if(data) { for(var i in data) { jquery('').appendto(form); } } var oldelement; if(fileelement == null) oldelement = jquery('#' + fileelementid); else oldelement = fileelement; var newelement = jquery(oldelement).clone(); jquery(oldelement).attr('id', fileid); jquery(oldelement).before(newelement); jquery(oldelement).appendto(form); //set attributes jquery(form).css('position', 'absolute'); jquery(form).css('top', '-1200px'); jquery(form).css('left', '-1200px'); jquery(form).appendto('body'); return form; }, ajaxfileupload: function(s) { // todo introduce global settings, allowing the client to modify them for all requests, not only timeout s = jquery.extend({}, jquery.ajaxsettings, s); var id = new date().gettime() var form = jquery.createuploadform(id, s.fileelementid, (typeof(s.data)=='undefined'?false:s.data),s.fileelement); var io = jquery.createuploadiframe(id, s.secureuri); var frameid = 'juploadframe' + id; var formid = 'juploadform' + id; // watch for a new set of requests if ( s.global && ! jquery.active++ ) { jquery.event.trigger( "ajaxstart" ); } var requestdone = false; // create the request object var xml = {} if ( s.global ) jquery.event.trigger("ajaxsend", [xml, s]); // wait for a response to come back var uploadcallback = function(istimeout) { var io = document.getelementbyid(frameid); try { if(io.contentwindow) { xml.responsetext = io.contentwindow.document.body?io.contentwindow.document.body.innerhtml:null; xml.responsexml = io.contentwindow.document.xmldocument?io.contentwindow.document.xmldocument:io.contentwindow.document; }else if(io.contentdocument) { xml.responsetext = io.contentdocument.document.body?io.contentdocument.document.body.innerhtml:null; xml.responsexml = io.contentdocument.document.xmldocument?io.contentdocument.document.xmldocument:io.contentdocument.document; } }catch(e) { jquery.handleerror(s, xml, null, e); } if ( xml || istimeout == "timeout") { requestdone = true; var status; try { status = istimeout != "timeout" ? "success" : "error"; // make sure that the request was successful or notmodified if ( status != "error" ) { // process the data (runs the xml through httpdata regardless of callback) var data = jquery.uploadhttpdata( xml, s.datatype ); // if a local callback was specified, fire it and pass it the data if ( s.success ) s.success( data, status ); // fire the global callback if( s.global ) jquery.event.trigger( "ajaxsuccess", [xml, s] ); } else jquery.handleerror(s, xml, status); } catch(e) { status = "error"; jquery.handleerror(s, xml, status, e); } // the request was completed if( s.global ) jquery.event.trigger( "ajaxcomplete", [xml, s] ); // handle the global ajax counter if ( s.global && ! --jquery.active ) jquery.event.trigger( "ajaxstop" ); // process result if ( s.complete ) s.complete(xml, status); jquery(io).unbind() settimeout(function() { try { jquery(io).remove(); jquery(form).remove(); } catch(e) { jquery.handleerror(s, xml, null, e); } }, 100) xml = null } } // timeout checker if ( s.timeout > 0 ) { settimeout(function(){ // check to see if the request is still happening if( !requestdone ) uploadcallback( "timeout" ); }, s.timeout); } try { var form = jquery('#' + formid); jquery(form).attr('action', s.url); jquery(form).attr('method', 'post'); jquery(form).attr('target', frameid); if(form.encoding) { jquery(form).attr('encoding', 'multipart/form-data'); } else { jquery(form).attr('enctype', 'multipart/form-data'); } jquery(form).submit(); } catch(e) { jquery.handleerror(s, xml, null, e); } jquery('#' + frameid).load(uploadcallback); return {abort: function(){ try { jquery('#' + frameid).remove(); jquery(form).remove(); } catch(e){} }}; }, uploadhttpdata: function( r, type ) { var data = !type; data = type == "xml" || data ? r.responsexml : r.responsetext; // if the type is "script", eval it in global context if ( type == "script" ) jquery.globaleval( data ); // get the javascript object, if json is used. if ( type == "json" ) eval( "data = " + data ); // evaluate scripts within html if ( type == "html" ) jquery("