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