Skip to content

Instantly share code, notes, and snippets.

@tramak
Last active January 29, 2024 11:02
Show Gist options
  • Save tramak/5394007 to your computer and use it in GitHub Desktop.
Save tramak/5394007 to your computer and use it in GitHub Desktop.
Ajax Message and File Upload
<?php
class AsyncResponse {
const
APPEND = 'append',
PREPEND = 'prepend',
REPLACE = 'replace',
HTML = 'html',
DELETE = 'delete',
CALLBACK = 'callback',
PAGE_REDIRECT = 'url',
PAGE_RELOAD = 'reload';
protected static $instance;
protected static $response = Array();
// Защищаем от создания через new
private function __construct(){}
// Защищаем от создания через клонирование
private function __clone(){}
// Защищаем от создания через unserialize
private function __wakeup(){}
public static function getInstance() {
if ( self::$instance == NULL ) {
self::$instance = new AsyncResponse();
}
return self::$instance;
}
private function initMessage()
{
if( !isset( $this->response[ 'messages' ] ) ) {
$this->response[ 'messages' ] = Array();
}
}
/**
* Добавляем сообщение
* @param type $type - тип операции который будет выполнен на клиенте
* @param type $elem - селектор над которым будет производится операция
* @param type $html - html код который будет вставлен
* @return \AsyncResponse
*/
public function add( $type, $elem, $html = null )
{
$this->initMessage();
$message = Array(
'type' => $type,
'elem' => $elem
);
if( $html != null )
{
$message[ 'html' ] = $html;
}
$this->response[ 'messages' ][] = $message;
return $this;
}
/**
* Добавляем функцию которая будет вызвана на клиенте, когда ответ вернётся
* @param type $func - javascript функция
* @return \AsyncResponse
*/
public function addCallback( $func )
{
$this->initMessage();
$params = func_get_args();
array_shift( $params );
$message = Array(
'type' => self::CALLBACK,
'callback' => $func,
'callback_params' => $params
);
$this->response[ 'messages' ][] = $message;
return $this;
}
/**
* Изменить uri - Страницы
* @param type $url - uri
* @return \AsyncResponse
*/
public function pageRedirect( $url )
{
$this->response[ self::PAGE_REDIRECT ] = $url;
return $this;
}
/**
* Перезагрузить страницу
* @return \AsyncResponse
*/
public function pageReload()
{
$this->response[ self::PAGE_RELOAD ] = true;
return $this;
}
public function __toString()
{
return json_encode( $this->response );
}
/**
* Отсылаем запрос
* @param type $type - Content-Type ответа
*/
public function end( $type = 'text/json' )
{
header( 'Content-Type: ' . $type );
echo $this;
}
}
?>
$( function() {
var dn = 'data_async_926734';
$.fn.jasync = function( type, obj ) {
if( !this.length ) return this;
if( typeof( type ) == 'string' ) {
setAsyncSend.call( this, type, obj );
} else if( typeof( type ) == 'object' ) {
for( var i in type ) {
if( type.hasOwnProperty( i ) ) {
setAsyncSend.call( this, i, type[ i ] );
}
}
}
return this;
}
function setAsyncSend( type, obj ) {
switch( type ) {
case 'addData':
addDataAsyncSend.call( this, obj );
break;
default:
this.each( function() {
setValue( $( this ), type, obj );
} );
}
}
function getValue( elem, name ) {
var data = elem.data( dn ) || {};
return data[ name ];
}
function setValue( elem, name, value ) {
var data = elem.data( dn ) || {};
data[ name ] = value;
elem.data( dn, data );
}
/**
* �?������������������ �����?�������?�?���� ���?�� �����?��������
* @param obj
*/
function addDataAsyncSend( obj ) {
this.each( function() {
var elem = $( this ),
data = getValue( elem, 'addData' ) || {};
data = $.extend( data, obj );
setValue( elem, 'addData', data );
} );
}
function parseUri( url ) {
if( url ) {
var mas = url.match( /^(.+):\/\/([^\:\/]+)(:[0-9]+)?/ );
if( mas && mas.length > 3 ) {
if( mas[ 3 ] ) {
mas[ 3 ] = mas[ 3 ].match( /[0-9]+/ )[ 0 ];
} else {
mas[ 3 ] = '';
}
return {
protocol: mas[ 1 ] + ':',
host: mas[ 2 ] + ( mas[ 3 ] ? ':' + mas[ 3 ]: '' ),
port: mas[ 3 ]
}
}
}
return {
protocol: location.protocol,
host: location.host,
port: location.port
}
}
function concat() {
var mas = [];
for( var i = 0, l = arguments.length; i < l; i++ ) {
if( arguments[ i ] ) {
mas.push( arguments[ i ] );
}
}
return mas.join( '&' );
}
function asyncSend( e, param ) {
var elem = $( this ),
data;
if( e && e.preventDefault ) {
e.preventDefault();
}
if( typeof( param ) != 'object' ) {
param = {};
}
if( getValue( elem, 'stop' ) === true ) {
setValue( elem, 'stop', false );
return;
}
var href;
if( param.is_form ) {
href = this.action||elem.attr( 'action' );
} else {
href = elem.attr( 'href' );
}
var loc = parseUri( href ),
thishost = ( loc.host == document.location.host && loc.protocol == document.location.protocol ),
methodSend = ( getValue( elem, 'methodSend') || '' ).toLowerCase(),
data_base = serialize( getValue( elem, 'addData' ) ),
data_elem = '',
type = ( this.method || elem.attr( 'method' ) || 'POST' ).toUpperCase(),
dataType = ( getValue( elem, 'dataType' ) || '' ).toUpperCase();
var is_file_send = param.is_form && elem.find( 'input[type=file]' ).length;
if( param.is_form && ( !thishost || !supportFileApi() || type == 'GET' || !is_file_send ) ) {
data_elem = elem.serialize();
} else {
data_elem = elem.attr( 'data' );
}
if( param.is_file ) {
var data = concat( data_elem, data_base );
} else {
var data = concat( data_elem, data_base, serialize( param.data ) );
}
if( !methodSend ) {
if( param.is_file && !supportFileApi() ) {
methodSend = 'iframe';
} else if(
thishost && ( this.enctype != 'multipart/form-data' || supportFileApi() )
) {
methodSend = 'ajax';
} else {
methodSend = 'iframe';
}
}
if( methodSend == 'ajax' ) {
var obj = param.delegate || elem,
xhr = createXMLHttpRequest();
if ( xhr.upload ) {
xhr.upload.addEventListener( 'progress', function( e ) {
var progress = 0;
if ( e.lengthComputable ) {
progress = ( e.loaded * 100 ) / e.total;
}
obj.trigger( 'jasync.uploadProgress', [ progress, e ] );
}, false);
xhr.upload.addEventListener( 'load', function( e ) {
var progress = 100;
obj.trigger( 'jasync.uploadProgress', [ progress, e ] );
}, false);
}
xhr.onreadystatechange = function() {
if ( this.readyState == 4 ) {
var result = this.responseText,
content_type = (this.getResponseHeader( 'Content-Type' ) || '').toLowerCase();
if( dataType == 'JSON' || content_type == 'text/json' || content_type == 'application/json' ) {
try {
result = $.parseJSON( result );
} catch( e ) {}
}
if ( this.status == 200 ) {
obj.trigger( 'jasync.success', result );
} else {
obj.trigger( 'jasync.error', [ this.status, result ] );
}
if( elem.data( 'remove' ) ) {
elem.parent().remove();
}
}
}
if( window.FormData && type == 'POST' && ( param.is_file || param.is_form ) ) {
var formD;
xhr.open( type, href || location.href );
if( param.is_form ) {
formD = new FormData( elem[ 0 ] );
} else {
formD = new FormData();
}
var mas = toArray( data );
for( var i = 0, l = mas.length; i < l; i++ ) {
var m = mas[ i ];
formD.append( m[ 0 ], m[ 1 ] );
}
if( param.is_file ) {
formD.append( param.data.name, param.data.file );
}
xhr.send( formD );
} else if( window.FileReader && type == 'POST' && param.is_file ) {
xhr.open( type, href || location.href );
var boundary = parseInt( Math.random()*100000000, 10 );
xhr.setRequestHeader( 'Content-Type', 'multipart/form-data, boundary=' + boundary );
xhr.setRequestHeader( 'Cache-Control', 'no-cache' );
var body = "";
var mas = toArray( data );
for( var i = 0, l = mas.length; i < l; i++ ) {
var m = mas[ i ];
body += "--" + boundary + "\r\n";
body += "Content-Disposition: form-data; name='" + m[ 0 ] + "'\r\n\r\n";
body += m[ 1 ] + "\r\n";
}
//console.log( body );
body += "--" + boundary + "\r\n";
body += "Content-Disposition: form-data; name='" + param.data.name + "'; filename='" + encodeURIComponent(param.data.file_name) + "'\r\n";
body += "Content-Type: application/octet-stream\r\n\r\n";
body += param.data.result + "\r\n";
body += "--" + boundary + "--";
if( xhr.sendAsBinary ) {
// firefox
xhr.sendAsBinary( body );
} else {
// chrome (W3C spec.)
xhr.send( body );
}
} else {
if( type == 'POST' ) {
xhr.open( type, href );
xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
xhr.send( data );
} else {
xhr.open( type, href + ( data ? '?' + data : '' ) );
xhr.send( null );
}
}
/*
if( param.delete_before_result ) {
elem.remove();
}
*/
/*
} else if( methodSend == 'jsonp' ) {
$.getJSON( href + ( data ? '?' + data : '' ) )
.success( success )
.error( error );
*/
} else {
if( param.is_form ) {
iframeSend( elem, {
data: data_base
} );
} else {
var form = createForm( href );
form.hide();
$( 'body' ).append( form );
if( param.is_file ) {
elem.clone().insertBefore( elem );
form.append( elem );
form.attr( 'enctype', 'multipart/form-data' );
}
iframeSend( form, {
elem: elem,
data: toObj( data ),
remove: function() {
form.remove();
}
} );
}
}
}
function createXMLHttpRequest() {
if ( typeof XMLHttpRequest === 'undefined' ) {
XMLHttpRequest = function() {
try { return new ActiveXObject( 'Msxml2.XMLHTTP.6.0' ); } catch(e) {}
try { return new ActiveXObject( 'Msxml2.XMLHTTP.3.0' ); } catch(e) {}
try { return new ActiveXObject( 'Msxml2.XMLHTTP' ); } catch(e) {}
try { return new ActiveXObject( 'Microsoft.XMLHTTP' ); } catch(e) {}
};
}
return new XMLHttpRequest();
}
$( document ).on( 'click', '[jasync][href][type!=file]', submitElement );
$( document ).on( 'jasync.submit', '[href]', submitElement );
function submitElement( e ) {
var elem = $( this );
if( elem.is( '[dropfile]' ) ) {
return;
}
elem.trigger( 'jasync.beforeSend' );
asyncSend.call( this, e );
}
if( window.FormData ) {
$( document ).on( 'click', '[jasync][href][type=file]', function( e ) {
var elem = $( this );
if( elem.is( 'input' ) ) {
return;
} else {
e.preventDefault();
}
var div = $( '<div></div>' ),
input = $( '<input type="file" />' );
cloneAttr( elem, input);
div.css( {
overflow: 'hidden',
width: 0,
height: 0,
position: 'absolute'
} );
input[ 0 ].delegate = elem;
input[ 0 ].temporarily = true;
input.css( 'margin-left', 20 );
input.data( 'remove', true );
input[ 0 ].delegate = elem;
div.append( input );
div.insertBefore( elem );
setTimeout( function() {
input.click();
}, 100 );
} );
} else {
$( document ).on( 'mouseover', '[jasync][href][type=file]', function( e ) {
var elem = $( this );
if( elem.is( 'input' ) ) {
return;
}
if( this[ 'div' + dn ] ) {
setPropertyDiv( $( this[ 'div' + dn ] ), elem );
return;
}
var div = $( '<div></div>' ),
input = $( '<input type="file" />' );
this[ 'div' + dn ] = div[ 0 ];
cloneAttr( elem, input);
input[ 0 ].delegate = elem;
input[ 0 ].temporarily = true;
input.attr( 'size', 1 );
input.css( {
'font-size': '320px',
'cursor': 'pointer',
'margin-left': '-1000px'
} );
div.bind( 'mouseover', function() {
setPropertyDiv( div, elem );
} );
setPropertyDiv( div, elem );
var position = elem.css( 'position' ),
z = 1;
if( position == 'relative' || position == 'absolute' ) {
z = ( parseInt( elem.css( 'z-index' ), 10 ) || 0 ) + 10;
}
div.css( 'z-index', z );
div.append( input );
div.insertBefore( elem );
} );
}
$( document ).on( 'change', '[jasync][href][type=file]', function( e ) {
var elem = $( this );
if( !elem.is( 'input' ) ) {
return;
}
if( supportFileApi() ) {
sendFiles( this.files, elem );
if( elem[ 0 ].temporarily ) {
elem.parent().remove();
}
} else {
var file_name = elem.val().replace( /.*(\/|\\)/, '' );
var imgs = [ $( {
file: file_name
} ) ];
imgs.nosupport = true;
elem.trigger( 'jasync.beforeSend', [ imgs ] );
asyncSend.call( this, e, {
is_file: true
} );
}
} );
$( document ).on( 'submit', 'form[jasync]', function( e ) {
var form = $( this );
if( form[ 0 ][ dn + 'flag' ] ) {
form[ 0 ][ dn + 'flag' ] = false;
return;
}
form.trigger( 'jasync.beforeSend' );
asyncSend.call( this, e, {
is_form: true
} );
} );
$( document ).on( 'drop', '[jasync][dropfile]', function( e ) {
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
sendFiles( files, $( this ) );
return false;
} ).on( 'dragover', '[jasync]', function( e ) {
e.preventDefault();
return false;
} );
function cloneAttr( from, to ) {
var attr = [ 'jasync', 'href', 'multiple', 'enctype', 'accept', 'name', 'data' ];
for( var i = 0, l = attr.length; i < l; i++ ) {
to.attr( attr[ i ], from.attr( attr[ i ] ) );
}
to.data( 'name', from.attr( 'name' ) );
}
function setPropertyDiv( div, elem ) {
var pos = elem.position();
div.css( {
position: 'absolute',
top: pos.top + 'px',
left: pos.left + 'px',
marginLeft: elem.css( 'marginLeft' ),
marginTop: elem.css( 'marginTop' ),
height: elem.outerHeight(),
width: elem.outerWidth(),
overflow: 'hidden',
'opacity': '0',
'-moz-opacity': '0',
'-khtml-opacity': '0',
'filter': 'alpha(opacity=0)'
} );
}
function sendFileReader( elem, obj, file ) {
var diff = $.Deferred();
var reader = new FileReader();
reader.onload = function( e ) {
var filterName = getValue( elem, 'filterName' );
if( filterName && file.name ) {
if( ( filterName instanceof RegExp ) && !filterName.test( file.name ) ) {
return;
} else if( ( filterName instanceof Function ) && filterName( file.name ) === false ) {
return;
}
}
var max_size = getValue( elem[ 0 ].delegate || elem, 'maxSize' );
if( typeof( max_size ) == 'number' && max_size < file.size ) {
obj.trigger( 'jasync.errorBeforeSend', {
type: 'maxSize',
size: file.size,
max_size: max_size
} );
return;
}
obj.trigger( 'jasync.load', e.target.result );
diff.resolve();
if( !reader.readAsBinaryString ) {
readFile( e );
}
};
reader.readAsDataURL( file );
function readFile( e ) {
var data = {},
name = elem.attr( 'name' ) || elem.data( 'name' );
if( name ) {
data.name = name;
data.file = file;
data.file_name = file.name;
if( !reader.readAsBinaryString && window.atob ) { // ie10
var base64 = e.target.result.replace( /^data:[^,]+,/, '' );
data.result = window.atob( base64 );
} else {
data.result = e.target.result;
}
//data[ name ] = e.target.result;
}
if( typeof( elem.attr( 'href' ) ) != 'undefined' || typeof( elem.attr( 'action' ) ) != 'undefined' ) {
diff.done( function( elem, obj ) {
return function() {
asyncSend.call( elem, null, obj );
}
}( elem[ 0 ].delegate || elem, {
is_file: true,
delegate: obj,
data: data
} ) );
}
}
if( reader.readAsBinaryString ) {
// Читаем данные в бинарном виде
var read_binary = new FileReader();
read_binary.onload = readFile;
read_binary.readAsBinaryString( file );
}
}
function sendFiles( files, elem ) {
var obj = [];
for( var i = 0, l = files.length; i < l; i++ ) {
obj[ i ] = $( {
file: files[ i ]
} );
}
if( elem[ 0 ].delegate ) {
elem[ 0 ].delegate.trigger( 'jasync.beforeSend', [ obj ] );
} else {
elem.trigger( 'jasync.beforeSend', [ obj ] );
}
for( var i = 0, l = files.length; i < l; i++ ) {
sendFileReader( elem, obj[ i ], files[ i ] );
}
}
function createForm( action, enctype ) {
var form = $( '<form method="post" action="' + action + '" enctype="' + ( enctype || '' ) + '"></form>' );
return form;
}
function addParamForm( form, data ) {
for( var i in data ) {
if( data.hasOwnProperty( i ) ) {
form.append( '<input type="hidden" name="' + i + '" value="' + data[ i ] + '" />' );
}
}
}
function supportFileApi() {
return window.File && window.FileReader && window.FileList && window.Blob;
}
function iframeSend( form, param ) {
var target = form[ 0 ].target,
iframe,
iframe_flag = false;
if( typeof( param ) != 'object' ) {
param = {};
}
if( typeof( param.data ) == 'object' ) {
addParamForm( form, param.data );
}
if( !target ) {
iframe_flag = true;
target = 'iframe_' + Math.random();
iframe = $( '<iframe src="javascript: false;" style="visibility: hidden;" name="' + target + '" />' );
$( 'body' ).append( iframe );
form.attr( {
target: target
} );
} else {
iframe = $( 'iframe[name=' + target + ']' );
}
iframe.bind( 'load', upload.bind( window, iframe[ 0 ], param.elem || form ) );
form[ 0 ][ dn + 'flag' ] = true;
form.submit();
if( iframe_flag ) {
form.removeAttr( 'target' );
}
function upload( iframe, elem ) {
var data,
dataType = ( getValue( form, 'dataType' ) || '' ).toUpperCase();
if( elem[ 0 ].delegate ) {
elem = elem[ 0 ].delegate;
}
try {
var doc = iframe.contentDocument ? iframe.contentDocument : frames[ target ].document;
} catch( e ) {
elem.trigger( 'jasync.error', [ 403, 'Forbidden' ] );
return;
}
function clear() {
$( iframe ).remove();
upload = clear = null;
if( param.remove ) {
param.remove();
}
}
try {
if ( doc.readyState && doc.readyState != 'complete' || doc.body && doc.body.innerHTML == 'false' ) {
return;
}
} catch( e ) {
elem.trigger( 'jasync.error', [ 403, 'Forbidden' ] );
return;
}
if ( doc.XMLDocument ) {
data = doc.XMLDocument;
} else if ( doc.body ) {
data = doc.body.innerHTML;
if ( dataType == 'JSON' ) {
if ( doc.body.firstChild && doc.body.firstChild.nodeName.toUpperCase() == 'PRE' ) {
data = doc.body.firstChild.firstChild.nodeValue;
}
if ( data ) {
try {
data = $.parseJSON( data );
} catch( e ) {
elem.trigger( 'jasync.error' );
setTimeout( clear, 1000 );
return;
}
} else {
data = {};
}
}
} else {
data = doc;
}
elem.trigger( 'jasync.success', data );
setTimeout( clear, 1000 );
}
}
function serialize( obj ) {
var val = '';
for( var i in obj ) {
if( obj.hasOwnProperty( i ) ) {
if( val != '' ) val += '&';
val += i + '=' + encodeURIComponent( obj[ i ] );
}
}
return val;
}
function toObj( str ) {
var obj = {};
if( !str ) return;
var result = str.split( '&' );
for( var i = 0, l = result.length; i < l; i++ ) {
var mas = result[ i ].split( '=' );
obj[ mas[ 0 ] ] = mas[ 1 ];
}
return obj;
}
function toArray( str ) {
var obj = [];
if( !str ) return obj;
str.split( '&' ).forEach( function( val ) {
var mas = val.split( '=' );
obj.push( [ mas[ 0 ], mas[ 1 ] ] );
} );
return obj;
}
if (!Function.prototype.bind ) {
Function.prototype.bind = function() {
var original = this;
var extraArgs = Array.prototype.slice.call( arguments );
var thisObj = extraArgs.shift();
return function() {
return original.apply(thisObj, extraArgs.concat(
Array.prototype.slice.call( arguments )
));
};
};
}
} );
$( function() {
$( document ).on( 'jasync.beforeSend', '[jasync=message]', function( e, data ) {
$( this ).addClass( 'blocked' );
} );
$( document ).on( 'jasync.error', '[jasync=message]', function( e, data ) {
$( this ).removeClass( 'blocked' );
} );
$( document ).on( 'jasync.success', '[jasync=message]', function( e, data ) {
$( this ).removeClass( 'blocked' );
if( typeof( data ) == 'string' ) {
try {
data = $.parseJSON( data );
} catch( e ) {
console.log( 'The answer is not in json format' );
return;
}
}
if( typeof( data ) != 'object' ) {
return;
}
if( data.url ) {
location.href = data.url;
return;
}
if( data.reload ) {
location.reload();
return;
}
if( data.messages ) {
if( ( data.messages instanceof Array ) ) {
for( var i = 0, l = data.messages.length; i < l; i++ ) {
parse( data.messages[ i ] );
}
} else {
parse( data.messages );
}
}
} );
function parse( obj ) {
if( typeof( obj ) != 'object' ) {
return;
}
var elem = $( obj.elem ),
html = obj.html || '';
switch( obj.type ) {
case 'html':
elem.html( html );
break;
case 'replace':
elem.replaceWith( html );
break;
case 'prepend':
elem.prepend( html );
break;
case 'append':
elem.append( html );
break;
case 'delete':
elem.remove();
break;
case 'callback':
var callback = obj.callback,
params = obj.callback_params || [],
mas = obj.callback.match( /[^\[\]\"\'\.]+/ig );
if( !mas || mas.length == 0 ) {
return;
}
if( mas[ 0 ] == 'window' ) {
mas.shift();
}
var func = window;
for( var i = 0, l = mas.length; i < l; i++ ) {
func = func[ mas [ i ] ];
if( !func ) break;
}
if( typeof( func ) == 'function' ) {
func.apply( window, params );
}
}
}
} );
$(function(){var p="data_async_926734";$.fn.jasync=function(w,x){if(!this.length){return this}if(typeof(w)=="string"){o.call(this,w,x)}else{if(typeof(w)=="object"){for(var v in w){if(w.hasOwnProperty(v)){o.call(this,v,w[v])}}}}return this};function o(v,w){switch(v){case"addData":s.call(this,w);break;default:this.each(function(){c($(this),v,w)})}}function d(w,v){var x=w.data(p)||{};return x[v]}function c(w,v,y){var x=w.data(p)||{};x[v]=y;w.data(p,x)}function s(v){this.each(function(){var w=$(this),x=d(w,"addData")||{};x=$.extend(x,v);c(w,"addData",x)})}function r(v){if(v){var w=v.match(/^(.+):\/\/([^\:\/]+)(:[0-9]+)?/);if(w&&w.length>3){if(w[3]){w[3]=w[3].match(/[0-9]+/)[0]}else{w[3]=""}return{protocol:w[1]+":",host:w[2]+(w[3]?":"+w[3]:""),port:w[3]}}}return{protocol:location.protocol,host:location.host,port:location.port}}function f(){var x=[];for(var w=0,v=arguments.length;w<v;w++){if(arguments[w]){x.push(arguments[w])}}return x.join("&")}function h(N,A){var O=$(this),R;if(N&&N.preventDefault){N.preventDefault()}if(typeof(A)!="object"){A={}}if(d(O,"stop")===true){c(O,"stop",false);return}var K;if(A.is_form){K=this.action||O.attr("action")}else{K=O.attr("href")}var C=r(K),w=(C.host==document.location.host&&C.protocol==document.location.protocol),L=(d(O,"methodSend")||"").toLowerCase(),z=n(d(O,"addData")),Q="",x=(this.method||O.attr("method")||"POST").toUpperCase(),H=(d(O,"dataType")||"").toUpperCase();var I=A.is_form&&O.find("input[type=file]").length;if(A.is_form&&(!w||!e()||x=="GET"||!I)){Q=O.serialize()}else{Q=O.attr("data")}if(A.is_file){var R=f(Q,z)}else{var R=f(Q,z,n(A.data))}if(!L){if(A.is_file&&!e()){L="iframe"}else{if(w&&(this.enctype!="multipart/form-data"||e())){L="ajax"}else{L="iframe"}}}if(L=="ajax"){var E=A.delegate||O,B=b();if(B.upload){B.upload.addEventListener("progress",function(T){var S=0;if(T.lengthComputable){S=(T.loaded*100)/T.total}E.trigger("jasync.uploadProgress",[S,T])},false);B.upload.addEventListener("load",function(T){var S=100;E.trigger("jasync.uploadProgress",[S,T])},false)}B.onreadystatechange=function(){if(this.readyState==4){var S=this.responseText,T=(this.getResponseHeader("Content-Type")||"").toLowerCase();if(H=="JSON"||T=="text/json"||T=="application/json"){try{S=$.parseJSON(S)}catch(U){}}if(this.status==200){E.trigger("jasync.success",S)}else{E.trigger("jasync.error",[this.status,S])}if(O.data("remove")){O.parent().remove()}}};if(window.FormData&&x=="POST"&&(A.is_file||A.is_form)){var y;B.open(x,K||location.href);if(A.is_form){y=new FormData(O[0])}else{y=new FormData()}var P=q(R);for(var J=0,G=P.length;J<G;J++){var F=P[J];y.append(F[0],F[1])}if(A.is_file){y.append(A.data.name,A.data.file)}B.send(y)}else{if(window.FileReader&&x=="POST"&&A.is_file){B.open(x,K||location.href);var M=parseInt(Math.random()*100000000,10);B.setRequestHeader("Content-Type","multipart/form-data, boundary="+M);B.setRequestHeader("Cache-Control","no-cache");var D="";var P=q(R);for(var J=0,G=P.length;J<G;J++){var F=P[J];D+="--"+M+"\r\n";D+="Content-Disposition: form-data; name='"+F[0]+"'\r\n\r\n";D+=F[1]+"\r\n"}D+="--"+M+"\r\n";D+="Content-Disposition: form-data; name='"+A.data.name+"'; filename='"+encodeURIComponent(A.data.file_name)+"'\r\n";D+="Content-Type: application/octet-stream\r\n\r\n";D+=A.data.result+"\r\n";D+="--"+M+"--";if(B.sendAsBinary){B.sendAsBinary(D)}else{B.send(D)}}else{if(x=="POST"){B.open(x,K);B.setRequestHeader("Content-Type","application/x-www-form-urlencoded");B.send(R)}else{B.open(x,K+(R?"?"+R:""));B.send(null)}}}}else{if(A.is_form){k(O,{data:z})}else{var v=j(K);v.hide();$("body").append(v);if(A.is_file){O.clone().insertBefore(O);v.append(O);v.attr("enctype","multipart/form-data")}k(v,{elem:O,data:u(R),remove:function(){v.remove()}})}}}function b(){if(typeof XMLHttpRequest==="undefined"){XMLHttpRequest=function(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(v){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(v){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(v){}try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(v){}}}return new XMLHttpRequest()}$(document).on("click","[jasync][href][type!=file]",l);$(document).on("jasync.submit","[href]",l);function l(w){var v=$(this);if(v.is("[dropfile]")){return}v.trigger("jasync.beforeSend");h.call(this,w)}if(window.FormData){$(document).on("click","[jasync][href][type=file]",function(x){var w=$(this);if(w.is("input")){return}else{x.preventDefault()}var y=$("<div></div>"),v=$('<input type="file" />');m(w,v);y.css({overflow:"hidden",width:0,height:0,position:"absolute"});v[0].delegate=w;v[0].temporarily=true;v.css("margin-left",20);v.data("remove",true);v[0].delegate=w;y.append(v);y.insertBefore(w);setTimeout(function(){v.click()},100)})}else{$(document).on("mouseover","[jasync][href][type=file]",function(y){var x=$(this);if(x.is("input")){return}if(this["div"+p]){a($(this["div"+p]),x);return}var B=$("<div></div>"),w=$('<input type="file" />');this["div"+p]=B[0];m(x,w);w[0].delegate=x;w[0].temporarily=true;w.attr("size",1);w.css({"font-size":"320px",cursor:"pointer","margin-left":"-1000px"});B.bind("mouseover",function(){a(B,x)});a(B,x);var v=x.css("position"),A=1;if(v=="relative"||v=="absolute"){A=(parseInt(x.css("z-index"),10)||0)+10}B.css("z-index",A);B.append(w);B.insertBefore(x)})}$(document).on("change","[jasync][href][type=file]",function(w){var v=$(this);if(!v.is("input")){return}if(e()){t(this.files,v);if(v[0].temporarily){v.parent().remove()}}else{var y=v.val().replace(/.*(\/|\\)/,"");var x=[$({file:y})];x.nosupport=true;v.trigger("jasync.beforeSend",[x]);h.call(this,w,{is_file:true})}});$(document).on("submit","form[jasync]",function(w){var v=$(this);if(v[0][p+"flag"]){v[0][p+"flag"]=false;return}v.trigger("jasync.beforeSend");h.call(this,w,{is_form:true})});$(document).on("drop","[jasync][dropfile]",function(w){w.preventDefault();var v=w.originalEvent.dataTransfer.files;t(v,$(this));return false}).on("dragover","[jasync]",function(v){v.preventDefault();return false});function m(z,y){var v=["jasync","href","multiple","enctype","accept","name","data"];for(var x=0,w=v.length;x<w;x++){y.attr(v[x],z.attr(v[x]))}y.data("name",z.attr("name"))}function a(x,v){var w=v.position();x.css({position:"absolute",top:w.top+"px",left:w.left+"px",marginLeft:v.css("marginLeft"),marginTop:v.css("marginTop"),height:v.outerHeight(),width:v.outerWidth(),overflow:"hidden",opacity:"0","-moz-opacity":"0","-khtml-opacity":"0",filter:"alpha(opacity=0)"})}function g(y,A,x){var z=$.Deferred();var w=new FileReader();w.onload=function(E){var C=d(y,"filterName");if(C&&x.name){if((C instanceof RegExp)&&!C.test(x.name)){return}else{if((C instanceof Function)&&C(x.name)===false){return}}}var D=d(y[0].delegate||y,"maxSize");if(typeof(D)=="number"&&D<x.size){A.trigger("jasync.errorBeforeSend",{type:"maxSize",size:x.size,max_size:D});return}A.trigger("jasync.load",E.target.result);z.resolve();if(!w.readAsBinaryString){v(E)}};w.readAsDataURL(x);function v(F){var E={},D=y.attr("name")||y.data("name");if(D){E.name=D;E.file=x;E.file_name=x.name;if(!w.readAsBinaryString&&window.atob){var C=F.target.result.replace(/^data:[^,]+,/,"");E.result=window.atob(C)}else{E.result=F.target.result}}if(typeof(y.attr("href"))!="undefined"||typeof(y.attr("action"))!="undefined"){z.done(function(G,H){return function(){h.call(G,null,H)}}(y[0].delegate||y,{is_file:true,delegate:A,data:E}))}}if(w.readAsBinaryString){var B=new FileReader();B.onload=v;B.readAsBinaryString(x)}}function t(y,x){var z=[];for(var w=0,v=y.length;w<v;w++){z[w]=$({file:y[w]})}if(x[0].delegate){x[0].delegate.trigger("jasync.beforeSend",[z])}else{x.trigger("jasync.beforeSend",[z])}for(var w=0,v=y.length;w<v;w++){g(x,z[w],y[w])}}function j(x,w){var v=$('<form method="post" action="'+x+'" enctype="'+(w||"")+'"></form>');return v}function i(w,x){for(var v in x){if(x.hasOwnProperty(v)){w.append('<input type="hidden" name="'+v+'" value="'+x[v]+'" />')}}}function e(){return window.File&&window.FileReader&&window.FileList&&window.Blob}function k(x,z){var y=x[0].target,w,A=false;if(typeof(z)!="object"){z={}}if(typeof(z.data)=="object"){i(x,z.data)}if(!y){A=true;y="iframe_"+Math.random();w=$('<iframe src="javascript: false;" style="visibility: hidden;" name="'+y+'" />');$("body").append(w);x.attr({target:y})}else{w=$("iframe[name="+y+"]")}w.bind("load",v.bind(window,w[0],z.elem||x));x[0][p+"flag"]=true;x.submit();if(A){x.removeAttr("target")}function v(D,E){var F,C=(d(x,"dataType")||"").toUpperCase();if(E[0].delegate){E=E[0].delegate}try{var H=D.contentDocument?D.contentDocument:frames[y].document}catch(G){E.trigger("jasync.error",[403,"Forbidden"]);return}function B(){$(D).remove();v=B=null;if(z.remove){z.remove()}}try{if(H.readyState&&H.readyState!="complete"||H.body&&H.body.innerHTML=="false"){return}}catch(G){E.trigger("jasync.error",[403,"Forbidden"]);return}if(H.XMLDocument){F=H.XMLDocument}else{if(H.body){F=H.body.innerHTML;if(C=="JSON"){if(H.body.firstChild&&H.body.firstChild.nodeName.toUpperCase()=="PRE"){F=H.body.firstChild.firstChild.nodeValue}if(F){try{F=$.parseJSON(F)}catch(G){E.trigger("jasync.error");setTimeout(B,1000);return}}else{F={}}}}else{F=H}}E.trigger("jasync.success",F);setTimeout(B,1000)}}function n(w){var x="";for(var v in w){if(w.hasOwnProperty(v)){if(x!=""){x+="&"}x+=v+"="+encodeURIComponent(w[v])}}return x}function u(A){var z={};if(!A){return}var v=A.split("&");for(var x=0,w=v.length;x<w;x++){var y=v[x].split("=");z[y[0]]=y[1]}return z}function q(w){var v=[];if(!w){return v}w.split("&").forEach(function(y){var x=y.split("=");v.push([x[0],x[1]])});return v}if(!Function.prototype.bind){Function.prototype.bind=function(){var w=this;var v=Array.prototype.slice.call(arguments);var x=v.shift();return function(){return w.apply(x,v.concat(Array.prototype.slice.call(arguments)))}}}});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment