UNPKG

biojs-vis-pdbviewer

Version:

A BioJS 2.0 component to view protein structures

229 lines (205 loc) 7.35 kB
// 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); }); // 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(); 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");