123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- jQuery.extend({
- createUploadIframe: function (id, uri) {
- //create frame
- var frameId = 'jUploadFrame' + id
- if (window.ActiveXObject) {
- var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />')
- if (typeof uri == 'boolean') {
- io.src = 'javascript:false'
- } else if (typeof uri == 'string') {
- io.src = uri
- }
- } else {
- var io = document.createElement('iframe')
- io.id = frameId
- io.name = frameId
- }
- io.style.position = 'absolute'
- io.style.top = '-1000px'
- io.style.left = '-1000px'
- document.body.appendChild(io)
- return io
- },
- createUploadForm: function (id, fileElementId) {
- //create form
- var formId = 'jUploadForm' + id
- var fileId = 'jUploadFile' + id
- var form = $(
- '<form action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>')
- var oldElement = $('#' + fileElementId)
- var newElement = $(oldElement).clone()
- $(oldElement).attr('id', fileId)
- $(oldElement).before(newElement)
- $(oldElement).appendTo(form)
- //set attributes
- $(form).css('position', 'absolute')
- $(form).css('top', '-1200px')
- $(form).css('left', '-1200px')
- $(form).appendTo('body')
- return form
- },
- addOtherRequestsToForm: function (form, data) {
- // add extra parameter
- var originalElement = $('<input type="hidden" name="" value="">')
- for (var key in data) {
- name = key
- value = data[key]
- var cloneElement = originalElement.clone()
- cloneElement.attr({ 'name': name, 'value': value })
- $(cloneElement).appendTo(form)
- }
- 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)
- if (s.data) form = jQuery.addOtherRequestsToForm(form, s.data)
- 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 {
- $(io).remove()
- $(form).remove()
- } catch (e) {
- jQuery.handleError(s, xml, null, e)
- }
- }, 100)
- xml = null
- }
- }
- if (window.attachEvent) {
- document.getElementById(frameId).attachEvent('onload', uploadCallback)
- } else {
- document.getElementById(frameId).addEventListener('load', uploadCallback, false)
- }
- // 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 io = $('#' + frameId);
- var form = $('#' + formId)
- $(form).attr('action', s.url)
- $(form).attr('method', 'POST')
- $(form).attr('target', frameId)
- if (form.encoding) {
- form.encoding = 'multipart/form-data'
- } else {
- form.enctype = 'multipart/form-data'
- }
- form.ajaxSubmit({
- iframeTarget: document.getElementById(frameId),
- beforeSubmit: function (arr, $form, options) {
- arr.push({
- Authorization: 'Bearer ' + auth,
- })
- },
- success: function (result) {
- document.getElementById(frameId).contentWindow.document.body.innerHTML = '<pre>' + JSON.stringify(result) + '</pre>'
- uploadCallback()
- }
- })
- } catch (e) {
- jQuery.handleError(s, xml, null, e)
- }
- return {
- abort: function () {
- },
- }
- },
- 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') {
- // If you add mimetype in your response,
- // you have to delete the '<pre></pre>' tag.
- // The pre tag in Chrome has attribute, so have to use regex to remove
- var data = r.responseText
- var rx = new RegExp('<pre.*?>(.*?)</pre>', 'i')
- var am = rx.exec(data)
- //this is the desired data extracted
- var data = (am) ? am[1] : '{}' //the only submatch or empty
- eval('data = ' + data)
- }
- // evaluate scripts within html
- if (type == 'html')
- jQuery('<div>').html(data).evalScripts()
- //alert($('param', data).each(function(){alert($(this).attr('value'));}));
- return data
- },
- })
|