/**
 * truncLib.js
 * copyright Xtone Ltd.
 * @author take
 */

if(typeof trunc == 'undefined') trunc = {};

// Cross Domain通信
trunc.cdRequest = {
	uidd: 'truncLib',
	initializeFlag: false,
	requestStack: [],
	poolIframe: [],
	initilaize: function() {
		var self = trunc.cdRequest;
		if(self.initializeFlag) return;
		
		if(self.canPostMessage()) window.addEventListener('message', self.receiveMessage, false);
	},
	canPostMessage: function() {
		return (window.postMessage || document.postMessage);
	},
	receiveMessage: function(event) {
		event = event || window.event;
		var stack = trunc.cdRequest.requestStack;
		var message = JSON.decode(event.data);
		var mid = message.mid;
		for(var i in stack) {
			if (!stack.hasOwnProperty(i)) continue;
			if(event.source == stack[i].target) {
				if(mid==stack[i].mid) {
					stack[i].callback(message, event.source);
				}
			}  
		}
	},
	addListener: function(targetwindow, mid, callback) {
		if(targetwindow==null) targetwindow = window.parent;
		var orgtargetwindow = targetwindow;
		
		if(targetwindow.tagName && targetwindow.tagName.toLowerCase() == 'iframe') targetwindow = targetwindow.contentWindow;
		if(trunc.browser.isOpera && trunc.browser.version<950) targetwindow = targetwindow.document;
		
		if(!this.canPostMessage()) {
			if (orgtargetwindow.id) {
				targetwindow = orgtargetwindow.id;
			}else{
				targetwindow = trunc.id;
			}
		}
		
		var stack = {target: targetwindow, 'mid': mid, 'callback': callback};
		trunc.cdRequest.requestStack.push(stack);
	},
	removeListener: function(targetwindow, mid, callback) {
		if(targetwindow.tagName && targetwindow.tagName.toLowerCase() == 'iframe') targetwindow = targetwindow.contentWindow;
		var stack = this.requestStack;
		var removetarget = false;
		for(var i in stack) {
			if (!stack.hasOwnProperty(i)) continue;
			if( targetwindow == stack[i].target && mid == stack[i].mid && callback == stack[i].callback) {
				removetarget = i;
				break;
			}  
		}
		
		if(!removetarget) return;
		
		delete this.requestStack[removetarget];
	},
	send: function(targetwindow, message) {
		if(targetwindow==null) targetwindow = window.parent;
		var orgtargetwindow = targetwindow;
		
		if(targetwindow.tagName && targetwindow.tagName.toLowerCase() == 'iframe') targetwindow = targetwindow.contentWindow;
		
		if(trunc.browser.isOpera && trunc.browser.version<950) targetwindow = targetwindow.document;
		if (!targetwindow) return;
		
		message = JSON.encode(message);
		if(this.canPostMessage()) targetwindow.postMessage(message, "*");
		else this.postIframeMessage(orgtargetwindow, message);
	},
	postIframeMessage: function(targetwindow, msg) {
		var defaulturl = 'relay.php';
		var ifid = targetwindow.id || 'null';
		var targetdomain = null;
		if(targetwindow.id) {
			targetdomain = targetwindow.id;
		}else{
			targetdomain = trunc.id;
		}
		
		var hash = targetwindow.id.substring(0,5);;
		
		window.setTimeout(function(){
			var iframe = trunc.cdRequest.createIframe();
			var url = encodeURIComponent(ifid)+','+encodeURIComponent(targetdomain)+','+encodeURIComponent(msg);
			url = 'http://ts'+hash+'.'+trunc.GADGETURL+defaulturl+'?t='+(new Date().getTime())+'#' + url+','+(new Date().getTime());
			iframe.style.display='block';
			iframe.src = url;
			document.body.appendChild(iframe);
		}, 0);
	},
	receiveIframeMessage: function(domain, msg) {
		var stack = trunc.cdRequest.requestStack;
		var message = JSON.decode(msg);
		var mid = message.mid;
		for(var i in stack) {
			if (!stack.hasOwnProperty(i)) continue;
			if(domain == stack[i].target) {
				if(mid==stack[i].mid) {
					stack[i].callback(message, domain);
				}
			}  
		}
	},
	createIframe: function(){
		var iframe = null, t = null, poolIframe = trunc.cdRequest.poolIframe;
		for(var i=0,len=poolIframe.length;i<len;i++) {
			t = poolIframe[i];
			if(t && !t.loading) {
				t.parentNode.removeChild(t);
				if(window.ActiveXObject) {
					t = null;
					poolIframe[i] = null;
					poolIframe.splice(0,1);
				}else{
					t.loading = true;
					iframe = t;
					iframe.id = 'cdif'+(new Date().getTime());
					break;
				}
			}
		}
		if(iframe) return iframe;

		var tmp = document.createElement('div');
		tmp.innerHTML = '<iframe onload="this.loading=false" border="0"></iframe>';
		iframe = tmp.firstChild;
		iframe.style.visibility = "hidden";
		iframe.style.width = "0px";
		iframe.style.height = "0px";
		iframe.style.position = "absolute";
		iframe.style.left = "-100000px";
		iframe.style.border = "0px";
		iframe.loading = true;
		iframe.id = 'cdif'+(new Date().getTime());
		trunc.cdRequest.poolIframe[trunc.cdRequest.poolIframe.length] = iframe;
		tmp.removeChild(iframe);
		tmp = null;
		return iframe;
	}
};
trunc.cdRequest.initilaize();