/* * jQuery.upload v1.0.2 * * Copyright (c) 2010 lagos * Dual licensed under the MIT and GPL licenses. * * http://lagoscript.org */ (function($) { var uuid = 0; $.fn.upload = function(url, data, callback, type) { var self = this, inputs, checkbox, checked, iframeName = 'jquery_upload' + ++uuid, iframe = $('').appendTo('body'), form = '
'; if ($.isFunction(data)) { type = callback; callback = data; data = {}; } checkbox = $('input:checkbox', this); checked = $('input:checked', this); form = self.wrapAll(form).parent('form').attr('action', url); // Make sure radios and checkboxes keep original values // (IE resets checkd attributes when appending) checkbox.removeAttr('checked'); checked.attr('checked', true); inputs = createInputs(data); inputs = inputs ? $(inputs).appendTo(form) : null; form.submit(function() { iframe.load(function() { var data = handleData(this, type), checked = $('input:checked', self); form.after(self).remove(); checkbox.removeAttr('checked'); checked.attr('checked', true); if (inputs) { inputs.remove(); } setTimeout(function() { _log("removing iframe"); iframe.remove(); if (type === 'script') { $.globalEval(data); } if (callback) { callback.call(self, data); } }, 0); }); }).submit(); return this; }; function createInputs(data) { return $.map(param(data), function(param) { return ''; }).join(''); } function param(data) { if ($.isArray(data)) { return data; } var params = []; function add(name, value) { params.push({name:name, value:value}); } if (typeof data === 'object') { $.each(data, function(name) { if ($.isArray(this)) { $.each(this, function() { add(name, this); }); } else { add(name, $.isFunction(this) ? this() : this); } }); } else if (typeof data === 'string') { $.each(data.split('&'), function() { var param = $.map(this.split('='), function(v) { return decodeURIComponent(v.replace(/\+/g, ' ')); }); add(param[0], param[1]); }); } return params; } function handleData(iframe, type) { var data, contents = $(iframe).contents().get(0); if ($.isXMLDoc(contents) || contents.XMLDocument) { return contents.XMLDocument || contents; } data = $(contents).find('body').html(); //if the body contained html, go into the html-structure until none is left while(data.match("^<" ) == "<"){ _log($(data)); data = $(data).html(); } switch (type) { case 'xml': data = parseXml(data); break; case 'json': //json in iframe can havearound it //var regex = /[^<>]*<(\w+)(?:(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>[^<>]*<\/\1+\s*>[^<>]*|[^<>]*<\w+(?:(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/>[^<>]*||^[^<>]+$/ig; //data = data.replace(/(<([^>]+)>)/ig, ""); //data = data.replace("", ""); _log("data after parse:"); _log(data); data = window.eval('(' + data + ')'); break; } _log("returning result of img upload"); return data; } function parseXml(text) { if (window.DOMParser) { return new DOMParser().parseFromString(text, 'application/xml'); } else { var xml = new ActiveXObject('Microsoft.XMLDOM'); xml.async = false; xml.loadXML(text); return xml; } } })(jQuery);