X-Git-Url: http://source.jalview.org/gitweb/?p=jalviewjs.git;a=blobdiff_plain;f=site%2Fjs%2FSwingJSjQueryExt.js;fp=site%2Fjs%2FSwingJSjQueryExt.js;h=6452d26fa138fe780c3c154230093585c2ed1e8d;hp=110720f224af3f5c5312200dbec4185a02d598c5;hb=b9b7a352eee79b7764c3b09c9d19663075061d8c;hpb=7301a2415adab88038b291fc54caeeb3a5a47a44 diff --git a/site/js/SwingJSjQueryExt.js b/site/js/SwingJSjQueryExt.js index 110720f..6452d26 100644 --- a/site/js/SwingJSjQueryExt.js +++ b/site/js/SwingJSjQueryExt.js @@ -1,292 +1,292 @@ -// SwingJSjQueryExt.js -// BH 7/24/2015 7:24:30 AM renamed from JSmoljQueryExt.js -// 9/2/2013 7:43:12 AM BH Opera/Safari fix for binary file reading -// 3/11/2014 6:31:01 AM BH fix for MSIE not working locally - -;(function($) { - - function createXHR(isMSIE) { - try { - return (isMSIE ? new window.ActiveXObject( "Microsoft.XMLHTTP" ) : new window.XMLHttpRequest()); - } catch( e ) {} - } - - $.ajaxSettings.xhr = (window.ActiveXObject === undefined ? createXHR : - function() { - return (this.url == document.location || this.url.indexOf("http") == 0 || !this.isLocal) && // BH MSIE fix - /^(get|post|head|put|delete|options)$/i.test( this.type ) && - createXHR() || createXHR(1); - }); - - -// Bind script tag hack transport - $.ajaxTransport( "+script", function(s) { - - // This transport only deals with cross domain requests - // BH: No! This is not compatible with Chrome - if ( true || s.crossDomain ) { - - var script, - head = document.head || jQuery("head")[0] || document.documentElement; - - return { - - send: function( _, callback ) { - script = document.createElement("script"); - //script.async = true; - - if ( s.scriptCharset ) { - script.charset = s.scriptCharset; - } - - script.src = s.url; - - // Attach handlers for all browsers - script.onload = script.onreadystatechange = function( _, isAbort ) { - - if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { - - // Handle memory leak in IE - script.onload = script.onreadystatechange = null; - // Remove the script - if ( script.parentNode ) { - script.parentNode.removeChild( script ); - } - - // Dereference the script - script = null; - - // Callback if not abort - if ( !isAbort ) { - callback( 200, "success" ); - } - } - }; - - // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending - // Use native DOM manipulation to avoid our domManip AJAX trickery - head.insertBefore( script, head.firstChild ); - }, - - abort: function() { - if ( script ) { - script.onload( undefined, true ); - } - } - }; - } -}); - - // incorporates jquery.iecors MSIE asynchronous cross-domain request for MSIE < 10 - - $.extend( $.support, { iecors: !!window.XDomainRequest }); - - if ($.support.iecors) { - // source: https://github.com/dkastner/jquery.iecors - // author: Derek Kastner dkastner@gmail.com http://dkastner.github.com - $.ajaxTransport(function(s) { - - return { - send: function( headers, complete ) { - // Note that xdr is not synchronous. - // This is only being used in JSmol for transport of java code packages. - var xdr = new window.XDomainRequest(); - xdr.onload = function() { - var headers = { 'Content-Type': xdr.contentType }; - complete(200, 'OK', { text: xdr.responseText }, headers); - }; - if ( s.xhrFields ) { - xdr.onerror = s.xhrFields.error; - xdr.ontimeout = s.xhrFields.timeout; - } - xdr.open( s.type, s.url ); - xdr.send( ( s.hasContent && s.data ) || null ); - }, - abort: function() { - xdr.abort(); - } - }; - }); - - } else { - - // adds support for synchronous binary file reading - - $.ajaxSetup({ - accepts: { binary: "text/plain; charset=x-user-defined" }, - responseFields: { binary: "response" } - }) - - - $.ajaxTransport('binary', function(s) { - - var callback; - return { - // synchronous or asynchronous binary transfer only - send: function( headers, complete ) { - var xhr = s.xhr(); - console.log("xhr.open binary async=" + s.async + " url=" + s.url); - xhr.open( s.type, s.url, s.async ); - var isOK = false; - try { - if (xhr.hasOwnProperty("responseType")) { - xhr.responseType = "arraybuffer"; - isOK = true; - } - } catch(e) { - // - } - try { - if (!isOK && xhr.overrideMimeType) { - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - } - } catch(e) { - // - } - if ( !s.crossDomain && !headers["X-Requested-With"] ) { - headers["X-Requested-With"] = "XMLHttpRequest"; - } - try { - for (var i in headers ) - xhr.setRequestHeader( i, headers[ i ] ); - } catch(_) {} - - xhr.send( ( s.hasContent && s.data ) || null ); - - // Listener - callback = function( _, isAbort ) { - - var - status = xhr.status, - statusText = "", - responseHeaders = xhr.getAllResponseHeaders(), - responses = {}, - xml; - - try { - - // Firefox throws exceptions when accessing properties - // of an xhr when a network error occured - // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) - // Was never called and is aborted or complete - if ( callback && ( xhr.readyState === 4 ) ) { - - // Only called once - callback = undefined; - - // When requesting binary data, IE6-9 will throw an exception - // on any attempt to access responseText (#11426) - try { - responses.text = (typeof xhr.responseText === "string" ? xhr.responseText : null); - } catch( _ ) { - } - try { - responses.binary = xhr.response; - } catch( _ ) { - } - - // Firefox throws an exception when accessing - // statusText for faulty cross-domain requests - try { - statusText = xhr.statusText; - } catch( _ ) { - // We normalize with Webkit giving an empty statusText - statusText = ""; - } - // Filter status for non standard behaviors - - // If the request is local and we have data: assume a success - // (success with no data won't get notified, that's the best we - // can do given current implementations) - if ( !status && s.isLocal && !s.crossDomain ) { - status = (responses.text ? 200 : 404); - // IE - #1450: sometimes returns 1223 when it should be 204 - } else if ( status === 1223 ) { - status = 204; - } - complete( status, statusText, responses, responseHeaders ); - } - } catch( e ) { - alert(e) - complete( -1, e ); - } - }; - - if ( !s.async ) { - // if we're in sync mode we fire the callback - callback(); - } else if ( xhr.readyState === 4 ) { - // (IE6 & IE7) if it's in cache and has been - // retrieved directly we need to fire the callback - setTimeout( callback ); - } else { - // Add to the list of active xhr callbacks - xhr.onreadystatechange = callback; - } - - }, - abort: function() {} - }; - }); - } -})( jQuery ); - -/* - * jQuery outside events - v1.1 - 3/16/2010 - * http://benalman.com/projects/jquery-outside-events-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - * - * Modified by Bob Hanson for JSmol-specific events and to add parameter reference to actual jQuery event. - * Used for closing the pop-up menu. - * - */ - -;(function($,doc,eventList,id){ - // was 'click dblclick mousemove mousedown mouseup mouseover mouseout change select submit keydown keypress keyup' - $.map( - eventList.split(' '), - function( event_name ) { jq_addOutsideEvent( event_name ); } - ); - jq_addOutsideEvent( 'focusin', 'focus' + id ); - jq_addOutsideEvent( 'focusout', 'blur' + id ); - function jq_addOutsideEvent( event_name, outside_event_name ) { - outside_event_name = outside_event_name || event_name + id; - var elems = $(), - event_namespaced = event_name + '.' + outside_event_name + '-special-event'; - $.event.special[ outside_event_name ] = { - setup: function(){ - elems = elems.add( this ); - if ( elems.length === 1 ) { - $(doc).bind( event_namespaced, handle_event ); - } - }, - teardown: function(){ - self.Jmol && Jmol._setMouseOwner(null); - elems = elems.not( this ); - if ( elems.length === 0 ) { - $(doc).unbind( event_namespaced ); - } - }, - add: function( handleObj ) { - var old_handler = handleObj.handler; - handleObj.handler = function( event, elem ) { - event.target = elem; - old_handler.apply( this, arguments ); - }; - } - }; - function handle_event( event ) { - $(elems).each(function(){ - self.Jmol && (outside_event_name.indexOf("mouseup") >= 0 || outside_event_name.indexOf("touchend") >= 0) && Jmol._setMouseOwner(null); - var elem = $(this); - if ( this !== event.target && !elem.has(event.target).length ) { - //BH: adds event to pass that along to our handler as well. - elem.triggerHandler( outside_event_name, [ event.target, event ] ); - } - }); - }; - }; -})(jQuery,document,"click mousemove mouseup touchmove touchend", "outjsmol"); +// SwingJSjQueryExt.js +// BH 7/24/2015 7:24:30 AM renamed from JSmoljQueryExt.js +// 9/2/2013 7:43:12 AM BH Opera/Safari fix for binary file reading +// 3/11/2014 6:31:01 AM BH fix for MSIE not working locally + +;(function($) { + + function createXHR(isMSIE) { + try { + return (isMSIE ? new window.ActiveXObject( "Microsoft.XMLHTTP" ) : new window.XMLHttpRequest()); + } catch( e ) {} + } + + $.ajaxSettings.xhr = (window.ActiveXObject === undefined ? createXHR : + function() { + return (this.url == document.location || this.url.indexOf("http") == 0 || !this.isLocal) && // BH MSIE fix + /^(get|post|head|put|delete|options)$/i.test( this.type ) && + createXHR() || createXHR(1); + }); + + +// Bind script tag hack transport + $.ajaxTransport( "+script", function(s) { + + // This transport only deals with cross domain requests + // BH: No! This is not compatible with Chrome + if ( true || s.crossDomain ) { + + var script, + head = document.head || jQuery("head")[0] || document.documentElement; + + return { + + send: function( _, callback ) { + script = document.createElement("script"); + //script.async = true; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + // Remove the script + if ( script.parentNode ) { + script.parentNode.removeChild( script ); + } + + // Dereference the script + script = null; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + + // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending + // Use native DOM manipulation to avoid our domManip AJAX trickery + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( undefined, true ); + } + } + }; + } +}); + + // incorporates jquery.iecors MSIE asynchronous cross-domain request for MSIE < 10 + + $.extend( $.support, { iecors: !!window.XDomainRequest }); + + if ($.support.iecors) { + // source: https://github.com/dkastner/jquery.iecors + // author: Derek Kastner dkastner@gmail.com http://dkastner.github.com + $.ajaxTransport(function(s) { + + return { + send: function( headers, complete ) { + // Note that xdr is not synchronous. + // This is only being used in JSmol for transport of java code packages. + var xdr = new window.XDomainRequest(); + xdr.onload = function() { + var headers = { 'Content-Type': xdr.contentType }; + complete(200, 'OK', { text: xdr.responseText }, headers); + }; + if ( s.xhrFields ) { + xdr.onerror = s.xhrFields.error; + xdr.ontimeout = s.xhrFields.timeout; + } + xdr.open( s.type, s.url ); + xdr.send( ( s.hasContent && s.data ) || null ); + }, + abort: function() { + xdr.abort(); + } + }; + }); + + } else { + + // adds support for synchronous binary file reading + + $.ajaxSetup({ + accepts: { binary: "text/plain; charset=x-user-defined" }, + responseFields: { binary: "response" } + }) + + + $.ajaxTransport('binary', function(s) { + + var callback; + return { + // synchronous or asynchronous binary transfer only + send: function( headers, complete ) { + var xhr = s.xhr(); + console.log("xhr.open binary async=" + s.async + " url=" + s.url); + xhr.open( s.type, s.url, s.async ); + var isOK = false; + try { + if (xhr.hasOwnProperty("responseType")) { + xhr.responseType = "arraybuffer"; + isOK = true; + } + } catch(e) { + // + } + try { + if (!isOK && xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + } catch(e) { + // + } + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers["X-Requested-With"] = "XMLHttpRequest"; + } + try { + for (var i in headers ) + xhr.setRequestHeader( i, headers[ i ] ); + } catch(_) {} + + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var + status = xhr.status, + statusText = "", + responseHeaders = xhr.getAllResponseHeaders(), + responses = {}, + xml; + + try { + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occured + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + // Was never called and is aborted or complete + if ( callback && ( xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // When requesting binary data, IE6-9 will throw an exception + // on any attempt to access responseText (#11426) + try { + responses.text = (typeof xhr.responseText === "string" ? xhr.responseText : null); + } catch( _ ) { + } + try { + responses.binary = xhr.response; + } catch( _ ) { + } + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( _ ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = (responses.text ? 200 : 404); + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + complete( status, statusText, responses, responseHeaders ); + } + } catch( e ) { + alert(e) + complete( -1, e ); + } + }; + + if ( !s.async ) { + // if we're in sync mode we fire the callback + callback(); + } else if ( xhr.readyState === 4 ) { + // (IE6 & IE7) if it's in cache and has been + // retrieved directly we need to fire the callback + setTimeout( callback ); + } else { + // Add to the list of active xhr callbacks + xhr.onreadystatechange = callback; + } + + }, + abort: function() {} + }; + }); + } +})( jQuery ); + +/* + * jQuery outside events - v1.1 - 3/16/2010 + * http://benalman.com/projects/jquery-outside-events-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + * + * Modified by Bob Hanson for JSmol-specific events and to add parameter reference to actual jQuery event. + * Used for closing the pop-up menu. + * + */ + +;(function($,doc,eventList,id){ + // was 'click dblclick mousemove mousedown mouseup mouseover mouseout change select submit keydown keypress keyup' + $.map( + eventList.split(' '), + function( event_name ) { jq_addOutsideEvent( event_name ); } + ); + jq_addOutsideEvent( 'focusin', 'focus' + id ); + jq_addOutsideEvent( 'focusout', 'blur' + id ); + function jq_addOutsideEvent( event_name, outside_event_name ) { + outside_event_name = outside_event_name || event_name + id; + var elems = $(), + event_namespaced = event_name + '.' + outside_event_name + '-special-event'; + $.event.special[ outside_event_name ] = { + setup: function(){ + elems = elems.add( this ); + if ( elems.length === 1 ) { + $(doc).bind( event_namespaced, handle_event ); + } + }, + teardown: function(){ + self.Jmol && Jmol._setMouseOwner(null); + elems = elems.not( this ); + if ( elems.length === 0 ) { + $(doc).unbind( event_namespaced ); + } + }, + add: function( handleObj ) { + var old_handler = handleObj.handler; + handleObj.handler = function( event, elem ) { + event.target = elem; + old_handler.apply( this, arguments ); + }; + } + }; + function handle_event( event ) { + $(elems).each(function(){ + self.Jmol && (outside_event_name.indexOf("mouseup") >= 0 || outside_event_name.indexOf("touchend") >= 0) && Jmol._setMouseOwner(null); + var elem = $(this); + if ( this !== event.target && !elem.has(event.target).length ) { + //BH: adds event to pass that along to our handler as well. + elem.triggerHandler( outside_event_name, [ event.target, event ] ); + } + }); + }; + }; +})(jQuery,document,"click mousemove mouseup touchmove touchend", "outjsmol");