      1 /**
      2  * @ignore
      3  * @namespace
      4  * @since OWF 5.0
      5  */
      6 OWF = window.OWF ? window.OWF : {};
      7
      8 (function (window, document, undefined) {
      9
     10     /**
     11      * @namespace
     12      */
     13     OWF.Intents = function () {
     14         var INTENTS_SERVICE_NAME = '_intents',
     15             INTENTS_SERVICE_RECEIVE_NAME = '_intents_receive',
     16             intentReceiverMap = {};
     17
     18         return /** @lends OWF.Intents */ {
     19
     20             /**
     21              * Starts an Intent.  This will send the intent and data to one or more widgets.  If this launches a widget, it sets the launch data to the JSON string { intents: true }.
     22              * @param {Object} intent Object representing the Intent
     23              * @param {String} intent.action Name of the Intent
     24              * @param {String} intent.dataType Describes the data that will be sent with the intent.  It is recommended
     25              *   that this be a MIME type.
     26              * @param {Object} data Data to be sent with the intent
     27              * @param {Function} handler Function to be executed once the Intent has been sent to a destination widget
     28              * @param {Object[]} [handler.dest] The first argument passed to the handler function is the id(s) of the recipient(s)
     29              *   of the message. See <a href="./OWF.html#.getIframeId">OWF.getIframeId</a>
     30              *   for a description of this id.
     31              * @param {Object[]} [dest] Explicitly define which widgets will get this intent using Widget Proxies
     32              * @example
     33              * OWF.Intents.startActivity(
     34              *   {
     35              *    action: 'Plot',
     36              *    dataType: 'application/vnd.owf.latlon'
     37              *   },
     38              *   {
     39              *     lat: 0,
     40              *     lon: 0
     41              *   },
     42              *   function(dest) {
     43              *     //dest is an array of destination widget proxies
     44              *   }
     45              * );
     46              */
     47             startActivity:function (intent, data, handler, dest) {
     48                 var destIds = [];
     49
     50                 //pull destIds from any proxies passed in
     51                 if (dest != null) {
     52                     for (var i = 0; i < dest.length; i++) {
     53                         destIds.push(dest[i].id);
     54                     }
     55                 }
     56
     57                 gadgets.rpc.call('..', INTENTS_SERVICE_NAME,
     58                     //callback for when an intent has reached the destination widget(s)
     59                     function (ids) {
     60                         //exec handler
     61                         if (handler != null) {
     62                             var widgets = [];
     63                             if (ids != null) {
     64                                 var destWidgetIds = [].concat(ids);
     65                                 for (var i = 0; i < destWidgetIds.length; i++) {
     66                                     //get dest widget proxy
     67                                     var widget = Ozone.eventing.getWidgetProxyMap()[destWidgetIds];
     68                                     if (widget != null) {
     69                                         widgets.push(widget);
     70                                         if (widgets.length == destWidgetIds.length) {
     71                                             handler(widgets);
     72                                         }
     73                                     }
     74                                     //if null create new widget proxy
     75                                     else {
     76                                         Ozone.eventing.importWidget(destWidgetIds[i], function (wproxy) {
     77                                             widgets.push(wproxy);
     78                                             if (widgets.length == destWidgetIds.length) {
     79                                                 handler(widgets);
     80                                             }
     81                                         });
     82                                     }
     83
     84                                 }
     85                                 if (destWidgetIds.length < 1) {
     86                                     //no dest ids were sent send back an empty array
     87                                     handler(widgets);
     88                                 }
     89                             }
     90                             else {
     91                                 //no dest ids were sent send back an empty array
     92                                 handler(widgets);
     93                             }
     94                         }
     95                     }, OWF.getIframeId(), intent, data, destIds);
     96             },
     97
     98             /**
     99              * Register to receive an Intent
    100              * @param {Object} intent Object representing the Intent
    101              * @param {String} intent.action Name of the Intent
    102              * @param {String} intent.dataType Describes the data that will be sent with the intent.  It is recommended
    103              *   that this be a MIME type.
    104              * @param {Function} handler Function to be executed once an Intent has been received
    105              * @param {String} [handler.sender] The first argument passed to the handler function is the id of the sender
    106              *   of the message. See <a href="./OWF.html#.getIframeId">OWF.getIframeId</a>
    107              *   for a description of this id.
    108              * @param {Object} [handler.intent] The second argument passed to the handler function is the intent itself.
    109              * @param {Object} [handler.data] The third argument passed to the handler function is the intent data.
    110              * @example
    111              * OWF.Intents.receive(
    112              *   {
    113              *     action: 'Plot',
    114              *    dataType: 'application/vnd.owf.latlon'
    115              *   },
    116              *   function(sender,intent, data) {
    117              *     //do something with the data
    118              *   }
    119              * );
    120              */
    121             receive:function (intent, handler) {
    122                 var intentKey = owfdojo.toJson(intent);
    123
    124                 //save a list of handlers per intent
    125                 intentReceiverMap[intentKey] = handler;
    126
    127                 //register with shindig for when the intent message is sent
    128                 gadgets.rpc.register(INTENTS_SERVICE_NAME, function(sender, intent, data) {
    129                      var intentKey = owfdojo.toJson(intent);
    130
    131                     //execute the handler that matches the intent
    132                     var receiverHandler = intentReceiverMap[intentKey];
    133                     if (intentReceiverMap[intentKey] != null) {
    134                         receiverHandler.call(this, sender, intent, data);
    135                     }
    136
    137                 });
    138                 gadgets.rpc.call('..', INTENTS_SERVICE_RECEIVE_NAME, null, intent, OWF.getIframeId());
    139             }
    140         };
    141
    142     }();
    143
    144
    145 }(window, document));