Cityjet - Cross Domian Messaging

by Ben Clayton

JavaScript

var _cityjet = {domain:"hello"};

_cityjet.messaging = {
	debug: 0,
	delay: null,
	idx: { receive:0, send:0 },
	// _cityjet.messaging.add
	add: function(ident,data){
		data.id = this.idx.send++;
		data.ident = ident;
 		var i = 0;
 		while(i < this.messages.length){
			if(this.messages[i].ident == ident){ //splice out duplicate messages (only keep the last one)
				this.messages.splice(i,1);
			}else{ i++ }
 		}
		this.messages.push(data);
		var p = this;
		if(this.delay){ clearTimeout(this.delay); }
		this.delay = setTimeout(function(){
			if(p.messages.length == 0) return;
			p.send(p.dumper(p.messages));
			p.messages = [];	//reset messages array after each send
		},1000); // increased to counter race condition: losing messages - this actually exposes a fundamental flaw in the messaging
	},
	// _cityjet.messaging.dumper
	dumper: function(objarr){
		var sb = new Array();
		for(var i=0;i<objarr.length;i++){
			var obj = objarr[i];
			var s = "";
			var sa = new Array();
			for (var p in obj){
				sa.push('"'+p+'":'+((typeof(obj[p]) == 'number' || typeof(obj[p]) == 'boolean')?obj[p]:'"'+obj[p]+'"'));
			}
			sb.push("{"+(sa.join(','))+"}");
		}
		return "["+(sb.join(','))+"]";
	},
	// _cityjet.messaging.send
	send: function(messages){
		var elem = document.getElementById('parentProxy');
		if(elem){
			if( 1 ){ console.log('_cityjet.messaging.send messages: "'+messages+'"'); }
			elem.contentWindow.location = '//'+_cityjet.domain+'/eRetail/proxy-'+_cityjet.version+'.html' + "#" + messages;
			// change the dimensions which triggers the resize event to pass on the message to the parent website
			elem.width = elem.width > 20 ? 20 : 30;
		}
	},
	// array which keeps track of all the messages we need to send so they can be queued
	messages: []
};

_cityjet.messaging.add(1,{height:1234});