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. 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));