// Documentation of methods used here are at:
// https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Interaction_between_privileged_and_non-privileged_pages

var pktPanelMessaging = (function() {

 function panelIdFromURL(url) {
   var panelId = url.match(/panelId=([\w|\d|\.]*)&?/);
        if (panelId && panelId.length > 1) {
            return panelId[1];
        }

        return 0;
 }

 function prefixedMessageId(messageId) {
   return 'PKT_' + messageId;
 }

 function panelPrefixedMessageId(panelId, messageId) {
   return prefixedMessageId(panelId + '_' + messageId);
 }

 function addMessageListener(panelId, messageId, callback) {
   document.addEventListener(panelPrefixedMessageId(panelId, messageId), function(e) {

			callback(JSON.parse(e.target.getAttribute("payload"))[0]);

			// TODO: Figure out why e.target.parentNode is null
			// e.target.parentNode.removeChild(e.target);

		},false);

	}

	function removeMessageListener(panelId, messageId, callback) {
   document.removeEventListener(panelPrefixedMessageId(panelId, messageId), callback);
	}

 function sendMessage(panelId, messageId, payload, callback) {
   // Payload needs to be an object in format:
   // { panelId: panelId, data: {} }
   var messagePayload = {
     panelId: panelId,
     data: (payload || {})
   };

		// Create a callback to listen for a response
		if (callback) {
	        var messageResponseId = messageId + "Response";
	        var responseListener = function(responsePayload) {
	            callback(responsePayload);
	            removeMessageListener(panelId, messageResponseId, responseListener);
	        }

	        addMessageListener(panelId, messageResponseId, responseListener);
	    }

	    // Send message
		var element = document.createElement("PKTMessageFromPanelElement");
		element.setAttribute("payload", JSON.stringify([messagePayload]));
		document.documentElement.appendChild(element);

		var evt = document.createEvent("Events");
		evt.initEvent(prefixedMessageId(messageId), true, false);
		element.dispatchEvent(evt);
	}


    /**
     * Public functions
     */
    return {
      panelIdFromURL: panelIdFromURL,
        addMessageListener : addMessageListener,
        removeMessageListener : removeMessageListener,
        sendMessage: sendMessage
    };
}());