1 // SwingJSjQueryExt.js
\r
2 // BH 7/24/2015 7:24:30 AM renamed from JSmoljQueryExt.js
\r
3 // 9/2/2013 7:43:12 AM BH Opera/Safari fix for binary file reading
\r
4 // 3/11/2014 6:31:01 AM BH fix for MSIE not working locally
\r
8 function createXHR(isMSIE) {
\r
10 return (isMSIE ? new window.ActiveXObject( "Microsoft.XMLHTTP" ) : new window.XMLHttpRequest());
\r
14 $.ajaxSettings.xhr = (window.ActiveXObject === undefined ? createXHR :
\r
16 return (this.url == document.location || this.url.indexOf("http") == 0 || !this.isLocal) && // BH MSIE fix
\r
17 /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
\r
18 createXHR() || createXHR(1);
\r
22 // Bind script tag hack transport
\r
23 $.ajaxTransport( "+script", function(s) {
\r
25 // This transport only deals with cross domain requests
\r
26 // BH: No! This is not compatible with Chrome
\r
27 if ( true || s.crossDomain ) {
\r
30 head = document.head || jQuery("head")[0] || document.documentElement;
\r
34 send: function( _, callback ) {
\r
35 script = document.createElement("script");
\r
36 //script.async = true;
\r
38 if ( s.scriptCharset ) {
\r
39 script.charset = s.scriptCharset;
\r
44 // Attach handlers for all browsers
\r
45 script.onload = script.onreadystatechange = function( _, isAbort ) {
\r
47 if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
\r
49 // Handle memory leak in IE
\r
50 script.onload = script.onreadystatechange = null;
\r
51 // Remove the script
\r
52 if ( script.parentNode ) {
\r
53 script.parentNode.removeChild( script );
\r
56 // Dereference the script
\r
59 // Callback if not abort
\r
61 callback( 200, "success" );
\r
66 // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
\r
67 // Use native DOM manipulation to avoid our domManip AJAX trickery
\r
68 head.insertBefore( script, head.firstChild );
\r
73 script.onload( undefined, true );
\r
80 // incorporates jquery.iecors MSIE asynchronous cross-domain request for MSIE < 10
\r
82 $.extend( $.support, { iecors: !!window.XDomainRequest });
\r
84 if ($.support.iecors) {
\r
85 // source: https://github.com/dkastner/jquery.iecors
\r
86 // author: Derek Kastner dkastner@gmail.com http://dkastner.github.com
\r
87 $.ajaxTransport(function(s) {
\r
90 send: function( headers, complete ) {
\r
91 // Note that xdr is not synchronous.
\r
92 // This is only being used in JSmol for transport of java code packages.
\r
93 var xdr = new window.XDomainRequest();
\r
94 xdr.onload = function() {
\r
95 var headers = { 'Content-Type': xdr.contentType };
\r
96 complete(200, 'OK', { text: xdr.responseText }, headers);
\r
98 if ( s.xhrFields ) {
\r
99 xdr.onerror = s.xhrFields.error;
\r
100 xdr.ontimeout = s.xhrFields.timeout;
\r
102 xdr.open( s.type, s.url );
\r
103 xdr.send( ( s.hasContent && s.data ) || null );
\r
105 abort: function() {
\r
113 // adds support for synchronous binary file reading
\r
116 accepts: { binary: "text/plain; charset=x-user-defined" },
\r
117 responseFields: { binary: "response" }
\r
121 $.ajaxTransport('binary', function(s) {
\r
125 // synchronous or asynchronous binary transfer only
\r
126 send: function( headers, complete ) {
\r
128 console.log("xhr.open binary async=" + s.async + " url=" + s.url);
\r
129 xhr.open( s.type, s.url, s.async );
\r
132 if (xhr.hasOwnProperty("responseType")) {
\r
133 xhr.responseType = "arraybuffer";
\r
140 if (!isOK && xhr.overrideMimeType) {
\r
141 xhr.overrideMimeType('text/plain; charset=x-user-defined');
\r
146 if ( !s.crossDomain && !headers["X-Requested-With"] ) {
\r
147 headers["X-Requested-With"] = "XMLHttpRequest";
\r
150 for (var i in headers )
\r
151 xhr.setRequestHeader( i, headers[ i ] );
\r
154 xhr.send( ( s.hasContent && s.data ) || null );
\r
157 callback = function( _, isAbort ) {
\r
160 status = xhr.status,
\r
162 responseHeaders = xhr.getAllResponseHeaders(),
\r
168 // Firefox throws exceptions when accessing properties
\r
169 // of an xhr when a network error occured
\r
170 // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
\r
171 // Was never called and is aborted or complete
\r
172 if ( callback && ( xhr.readyState === 4 ) ) {
\r
174 // Only called once
\r
175 callback = undefined;
\r
177 // When requesting binary data, IE6-9 will throw an exception
\r
178 // on any attempt to access responseText (#11426)
\r
180 responses.text = (typeof xhr.responseText === "string" ? xhr.responseText : null);
\r
184 responses.binary = xhr.response;
\r
188 // Firefox throws an exception when accessing
\r
189 // statusText for faulty cross-domain requests
\r
191 statusText = xhr.statusText;
\r
193 // We normalize with Webkit giving an empty statusText
\r
196 // Filter status for non standard behaviors
\r
198 // If the request is local and we have data: assume a success
\r
199 // (success with no data won't get notified, that's the best we
\r
200 // can do given current implementations)
\r
201 if ( !status && s.isLocal && !s.crossDomain ) {
\r
202 status = (responses.text ? 200 : 404);
\r
203 // IE - #1450: sometimes returns 1223 when it should be 204
\r
204 } else if ( status === 1223 ) {
\r
207 complete( status, statusText, responses, responseHeaders );
\r
216 // if we're in sync mode we fire the callback
\r
218 } else if ( xhr.readyState === 4 ) {
\r
219 // (IE6 & IE7) if it's in cache and has been
\r
220 // retrieved directly we need to fire the callback
\r
221 setTimeout( callback );
\r
223 // Add to the list of active xhr callbacks
\r
224 xhr.onreadystatechange = callback;
\r
228 abort: function() {}
\r
235 * jQuery outside events - v1.1 - 3/16/2010
\r
236 * http://benalman.com/projects/jquery-outside-events-plugin/
\r
238 * Copyright (c) 2010 "Cowboy" Ben Alman
\r
239 * Dual licensed under the MIT and GPL licenses.
\r
240 * http://benalman.com/about/license/
\r
242 * Modified by Bob Hanson for JSmol-specific events and to add parameter reference to actual jQuery event.
\r
243 * Used for closing the pop-up menu.
\r
247 ;(function($,doc,eventList,id){
\r
248 // was 'click dblclick mousemove mousedown mouseup mouseover mouseout change select submit keydown keypress keyup'
\r
250 eventList.split(' '),
\r
251 function( event_name ) { jq_addOutsideEvent( event_name ); }
\r
253 jq_addOutsideEvent( 'focusin', 'focus' + id );
\r
254 jq_addOutsideEvent( 'focusout', 'blur' + id );
\r
255 function jq_addOutsideEvent( event_name, outside_event_name ) {
\r
256 outside_event_name = outside_event_name || event_name + id;
\r
258 event_namespaced = event_name + '.' + outside_event_name + '-special-event';
\r
259 $.event.special[ outside_event_name ] = {
\r
261 elems = elems.add( this );
\r
262 if ( elems.length === 1 ) {
\r
263 $(doc).bind( event_namespaced, handle_event );
\r
266 teardown: function(){
\r
267 self.Jmol && Jmol._setMouseOwner(null);
\r
268 elems = elems.not( this );
\r
269 if ( elems.length === 0 ) {
\r
270 $(doc).unbind( event_namespaced );
\r
273 add: function( handleObj ) {
\r
274 var old_handler = handleObj.handler;
\r
275 handleObj.handler = function( event, elem ) {
\r
276 event.target = elem;
\r
277 old_handler.apply( this, arguments );
\r
281 function handle_event( event ) {
\r
282 $(elems).each(function(){
\r
283 self.Jmol && (outside_event_name.indexOf("mouseup") >= 0 || outside_event_name.indexOf("touchend") >= 0) && Jmol._setMouseOwner(null);
\r
284 var elem = $(this);
\r
285 if ( this !== event.target && !elem.has(event.target).length ) {
\r
286 //BH: adds event to pass that along to our handler as well.
\r
287 elem.triggerHandler( outside_event_name, [ event.target, event ] );
\r
292 })(jQuery,document,"click mousemove mouseup touchmove touchend", "outjsmol");
\r