Team:Ciencias-UNAM/scripts/messagecenter

From 2013.igem.org

If (typeof console == 'undefined') console = {

   log: function () { }

};

// sniff chrome var CHROME_5_LOCAL = false; var CHROME = false; var WEBKIT = false; (function () {

   var chromeRegex = /Chrome\/([0-9]+).([0-9]+)/g ;
   var chromeMatch = chromeRegex.exec(navigator.userAgent);
   CHROME = Boolean(chromeMatch);
   CHROME_5_LOCAL = chromeMatch &&
               Number(chromeMatch[1]) >= 5 &&
               location.href.indexOf('file://') >= 0;
   var webkitRegex = /WebKit\//g ;
   WEBKIT = Boolean(webkitRegex.exec(navigator.userAgent));

})();


(function() {

   var _topMessageCenter;
   var _messageCenter = {};
   var _listeners = [];
   var _stateListeners = [];
   var _state = {};
   var _eventObject = null;
   var _queuedMessages = [];
   var _initialized = false;
   // this is for the non Chrome 5 local scenarios. The "top" message center will dispatch to all the bottom ones
   var _childrenMessageCenters = [];
   // create $axure if it hasn't been created
   if (!window.$axure) window.$axure = function() {};
   $axure.messageCenter = _messageCenter;
   // isolate scope, and initialize _topMessageCenter.
   (function() {
       if (!CHROME_5_LOCAL) {
           var topAxureWindow = window;
           while (topAxureWindow.parent && topAxureWindow.parent !== topAxureWindow
               && topAxureWindow.parent.$axure) topAxureWindow = topAxureWindow.parent;
           _topMessageCenter = topAxureWindow.$axure.messageCenter;
       }
   })();
   $(document).ready(function() {
       if (CHROME_5_LOCAL) {
$('body').append("" + "");

_eventObject = document.createEvent('Event'); _eventObject.initEvent('axureMessageSenderEvent', true, true);

           $('#axureEventReceiverDiv').bind('axureMessageReceiverEvent', function () {
               var request = JSON.parse($(this).text());
               _handleRequest(request);
           });
       } else {
           if (_topMessageCenter != _messageCenter) {
               _topMessageCenter.addChildMessageCenter(_messageCenter);
               console.log('adding from ' + window.location.toString());
           }
       }
   });
   var _handleRequest = function (request) {
       // route the request to all the listeners
       for(var i = 0; i < _listeners.length; i++) _listeners[i](request.message, request.data);
       // now handle the queued messages if we're initializing
       if (request.message == 'initialize') {
           _initialized = true;
           // send all the queued messages and return
           for (var i = 0; i < _queuedMessages.length; i++) {
               var qRequest = _queuedMessages[i];
               _messageCenter.postMessage(qRequest.message, qRequest.data);
           }
           _queuedMessages = [];
       }
               
       // and then handle the set state messages, if necessary
       if (request.message == 'setState') {
           _state[request.data.key] = request.data.value;
           for (var i = 0; i < _stateListeners.length; i++) {
               var keyListener = _stateListeners[i];
               // if thep passed a null or empty value, always post the message
               if (!keyListener.key || keyListener.key == request.data.key) {
                   keyListener.listener(request.data.key, request.data.value);
               }
           }
       }
   };
   // -----------------------------------------------------------------------------------------
   // This method allows for dispatching messages in the non-chromelocal scenario.
   // Each child calls this on _topMessageCenter
   // -----------------------------------------------------------------------------------------
   _messageCenter.addChildMessageCenter = function(messageCenter) {
       _childrenMessageCenters[_childrenMessageCenters.length] = messageCenter;
   };
   // -----------------------------------------------------------------------------------------
   // This method allows for dispatching messages in the non-chromelocal scenario.
   // Each child calls this on _topMessageCenter
   // -----------------------------------------------------------------------------------------
   _messageCenter.dispatchMessage = function(message, data) {
       _handleRequest({
           message: message,
           data: data
       });
   };
   // -----------------------------------------------------------------------------------------
   // -----------------------------------------------------------------------------------------
   _messageCenter.dispatchMessageRecursively = function(message, data) {
       console.log("dispatched to " + window.location.toString());
       // dispatch to the top center first
       _messageCenter.dispatchMessage(message, data);
       $('iframe').each(function(index, frame) {
           //try,catch to handle permissions error in FF when loading pages from another domain
           try {
               if (frame.contentWindow.$axure && frame.contentWindow.$axure.messageCenter) {
                   frame.contentWindow.$axure.messageCenter.dispatchMessageRecursively(message, data);
               }
           }catch(e) {}
       });
   };
   _messageCenter.postMessage = function (message, data) {
       if (!CHROME_5_LOCAL) {
           _topMessageCenter.dispatchMessageRecursively(message, data);
       } else {
           var request = {
               message : message,
               data : data
           };
  
           if (_initialized) {
               var senderDiv = document.getElementById('axureEventSenderDiv');
               var messageText = JSON.stringify(request);
               console.log('sending event: ' + messageText);
               senderDiv.innerText = messageText;
               senderDiv.dispatchEvent(_eventObject);
               console.log('event sent');
           } else {
               _queuedMessages[_queuedMessages.length] = request;
           }
       }
   }
   _messageCenter.setState = function(key, value) {
       var data = {
           key : key,
           value : value
       };
       _messageCenter.postMessage('setState', data);
   }
   _messageCenter.getState = function(key) {
       return _state[key];
   }
   _messageCenter.addMessageListener = function(listener) {
       _listeners[_listeners.length] = listener;
   }
   _messageCenter.addStateListener = function(key, listener) {
       _stateListeners[_stateListeners.length] = {
           key: key,
           listener: listener
       };
   }

})();