Last active
January 29, 2024 11:02
-
-
Save tramak/5394007 to your computer and use it in GitHub Desktop.
Ajax Message and File Upload
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} | |
} | |
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$( 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 ) | |
)); | |
}; | |
}; | |
} | |
} ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$( 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 ); | |
} | |
} | |
} | |
} ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$(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