JAL-1807 includes ?j2sdebug flag and DebugJS._(msg)
[jalviewjs.git] / site / js / SwingJSjQueryExt.js
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
5 \r
6 ;(function($) {\r
7 \r
8         function createXHR(isMSIE) {\r
9                 try {\r
10                         return (isMSIE ? new window.ActiveXObject( "Microsoft.XMLHTTP" ) : new window.XMLHttpRequest());\r
11                 } catch( e ) {}\r
12         }\r
13 \r
14  $.ajaxSettings.xhr = (window.ActiveXObject === undefined ? createXHR :  \r
15         function() {\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
19         });\r
20 \r
21 \r
22 // Bind script tag hack transport\r
23                 $.ajaxTransport( "+script", function(s) {\r
24 \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
28 \r
29                 var script,\r
30                         head = document.head || jQuery("head")[0] || document.documentElement;\r
31 \r
32                 return {\r
33 \r
34                         send: function( _, callback ) {\r
35                                 script = document.createElement("script");\r
36                                 //script.async = true;\r
37 \r
38                                 if ( s.scriptCharset ) {\r
39                                         script.charset = s.scriptCharset;\r
40                                 }\r
41 \r
42                                 script.src = s.url;\r
43 \r
44                                 // Attach handlers for all browsers\r
45                                 script.onload = script.onreadystatechange = function( _, isAbort ) {\r
46 \r
47                                         if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\r
48 \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
54                                                 }\r
55 \r
56                                                 // Dereference the script\r
57                                                 script = null;\r
58 \r
59                                                 // Callback if not abort\r
60                                                 if ( !isAbort ) {\r
61                                                         callback( 200, "success" );\r
62                                                 }\r
63                                         }\r
64                                 };\r
65 \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
69                         },\r
70 \r
71                         abort: function() {\r
72                                 if ( script ) {\r
73                                         script.onload( undefined, true );\r
74                                 }\r
75                         }\r
76                 };\r
77         }\r
78 });\r
79  \r
80         // incorporates jquery.iecors MSIE asynchronous cross-domain request for MSIE < 10\r
81 \r
82         $.extend( $.support, { iecors: !!window.XDomainRequest });\r
83 \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
88                 \r
89                         return {\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
97                                         };\r
98                                         if ( s.xhrFields ) {\r
99                                                 xdr.onerror = s.xhrFields.error;\r
100                                                 xdr.ontimeout = s.xhrFields.timeout;\r
101                                         }\r
102                                         xdr.open( s.type, s.url );\r
103                                         xdr.send( ( s.hasContent && s.data ) || null );\r
104                                 },\r
105                                 abort: function() {        \r
106                                         xdr.abort();\r
107                                 }\r
108                         };\r
109                 });\r
110 \r
111         } else {\r
112 \r
113         // adds support for synchronous binary file reading\r
114 \r
115                 $.ajaxSetup({\r
116                         accepts: { binary: "text/plain; charset=x-user-defined" },\r
117                         responseFields: { binary: "response" }\r
118                 })\r
119 \r
120 \r
121                 $.ajaxTransport('binary', function(s) {\r
122                 \r
123                         var callback;\r
124                         return {\r
125                                 // synchronous or asynchronous binary transfer only\r
126                                 send: function( headers, complete ) {        \r
127                                         var xhr = s.xhr();\r
128                                         console.log("xhr.open binary async=" + s.async + " url=" + s.url);\r
129                                         xhr.open( s.type, s.url, s.async );                                     \r
130                                         var isOK = false;\r
131                                         try {\r
132                                                 if (xhr.hasOwnProperty("responseType")) {\r
133                                                                 xhr.responseType = "arraybuffer";\r
134                                                                 isOK = true;\r
135                                                 } \r
136                                         } catch(e) {\r
137                                           //\r
138                                         }\r
139                                         try {\r
140                                                 if (!isOK && xhr.overrideMimeType) {\r
141                                                         xhr.overrideMimeType('text/plain; charset=x-user-defined');\r
142                                                 }\r
143                                         } catch(e) {\r
144                                                         //\r
145                                         }\r
146                                         if ( !s.crossDomain && !headers["X-Requested-With"] ) {\r
147                                                 headers["X-Requested-With"] = "XMLHttpRequest";\r
148                                         }\r
149                                         try {\r
150                                                 for (var i in headers )\r
151                                                         xhr.setRequestHeader( i, headers[ i ] );\r
152                                         } catch(_) {}\r
153 \r
154                                         xhr.send( ( s.hasContent && s.data ) || null );\r
155 \r
156                                         // Listener\r
157                                         callback = function( _, isAbort ) {\r
158 \r
159                                         var \r
160                                                 status = xhr.status,\r
161                                                 statusText = "",\r
162                                                 responseHeaders = xhr.getAllResponseHeaders(),\r
163                                                 responses = {},\r
164                                                 xml;\r
165 \r
166                                         try {\r
167 \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
173 \r
174                                                         // Only called once\r
175                                                         callback = undefined;\r
176 \r
177                                                         // When requesting binary data, IE6-9 will throw an exception\r
178                                                         // on any attempt to access responseText (#11426)\r
179                                                         try {\r
180                                                                 responses.text = (typeof xhr.responseText === "string" ? xhr.responseText : null);\r
181                                                         } catch( _ ) {\r
182                                                         }\r
183                                                         try {\r
184                                                                 responses.binary = xhr.response;\r
185                                                         } catch( _ ) {\r
186                                                         }\r
187 \r
188                                                         // Firefox throws an exception when accessing\r
189                                                         // statusText for faulty cross-domain requests\r
190                                                         try {\r
191                                                                 statusText = xhr.statusText;\r
192                                                         } catch( _ ) {\r
193                                                                 // We normalize with Webkit giving an empty statusText\r
194                                                                 statusText = "";\r
195                                                         }\r
196                                                         // Filter status for non standard behaviors\r
197 \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
205                                                                 status = 204;\r
206                                                         }\r
207                                                         complete( status, statusText, responses, responseHeaders );\r
208                                                 }\r
209                                         } catch( e ) {\r
210                                                 alert(e)\r
211                                                 complete( -1, e );\r
212                                         }\r
213                                         };\r
214                                         \r
215                                         if ( !s.async ) {\r
216                                                 // if we're in sync mode we fire the callback\r
217                                                 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
222                                         } else {\r
223                                                 // Add to the list of active xhr callbacks\r
224                                                 xhr.onreadystatechange = callback;\r
225                                         }\r
226                                         \r
227                                 },\r
228                                 abort: function() {}\r
229                         };\r
230                 });\r
231         }\r
232 })( jQuery );\r
233          \r
234 /*\r
235  * jQuery outside events - v1.1 - 3/16/2010\r
236  * http://benalman.com/projects/jquery-outside-events-plugin/\r
237  * \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
241  * \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
244  *   \r
245  */\r
246 \r
247 ;(function($,doc,eventList,id){  \r
248         // was 'click dblclick mousemove mousedown mouseup mouseover mouseout change select submit keydown keypress keyup'\r
249         $.map(\r
250                 eventList.split(' '),\r
251                 function( event_name ) { jq_addOutsideEvent( event_name ); }\r
252         );\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
257                 var elems = $(),\r
258                         event_namespaced = event_name + '.' + outside_event_name + '-special-event';\r
259                 $.event.special[ outside_event_name ] = {    \r
260                         setup: function(){\r
261                                 elems = elems.add( this );\r
262                                 if ( elems.length === 1 ) {\r
263                                         $(doc).bind( event_namespaced, handle_event );\r
264                                 }\r
265                         },\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
271                                 }\r
272                         },\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
278                                 };\r
279                         }\r
280                 };\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
288                                 }\r
289                         });\r
290                 };\r
291         };\r
292 })(jQuery,document,"click mousemove mouseup touchmove touchend", "outjsmol");\r