/*
 * easyXDM 
 * http://easyxdm.net/
 * Copyright(c) 2009, Øyvind Sean Kinsey, oyvind@kinsey.no.
 * 
 * MIT Licensed - http://easyxdm.net/license/mit.txt
 * 
 */
 easyXDM={version:"1.8.0.66",apply:function(c,b){if(!b){return}for(var a in b){if(b.hasOwnProperty(a)){c[a]=b[a]}}},applyBehaviors:function(e,b){var d;if(!b||b.length===0){e.down.up=e.down.down=e.up;e.up.up=e.up.down=e.down}else{if(b.length===1){d=b[0];d.down=d.up=e.up;e.down.down=e.down.up=d;e.up.down=e.up.up=d}else{for(var c=0,a=b.length;c<a;c++){d=b[c];if(c===0){e.down.up=d;d.down=e.up;d.up=b[c+1]}else{if(c===a-1){e.down.down=d;d.down=b[c-1];d.up=e.up}else{d.up=b[c+1];d.down=b[c-1]}}}}}},Interface:function(b,c,g){var f;var i=0,h={};function e(k,j){if(typeof k.scope==="undefined"){k.scope=window}if(k.isVoid){return function(){var l=Array.prototype.slice.call(arguments,0);window.setTimeout(function(){f.sendData({name:j,params:l})},0)}}else{return function(){h[""+(++i)]=arguments[arguments.length-1];var l={name:j,id:(i),params:Array.prototype.slice.call(arguments,0,arguments.length-1)};window.setTimeout(function(){f.sendData(l)},0)}}}function d(j,m,l,k){if(!l){throw new Error("The method "+j+" is not implemented.")}if(l.isAsync){k.push(function(n){f.sendData({id:m,response:n})});l.method.apply(l.scope,k)}else{if(l.isVoid){l.method.apply(l.scope,k)}else{f.sendData({id:m,response:l.method.apply(l.scope,k)})}}}b.converter=c.serializer||JSON;b.onData=function(k,j){if(k.name){d(k.name,k.id,c.local[k.name],k.params)}else{h[k.id](k.response);delete h[k.id]}};this.destroy=function(){f.destroy();for(var j in this){if(this.hasOwnProperty(j)){delete this[j]}}};if(c.remote){for(var a in c.remote){if(c.remote.hasOwnProperty(a)){this[a]=e(c.remote[a],a)}}}window.setTimeout(function(){f=new easyXDM.Channel(b,g)},5)},Channel:function(a,c){a.serializer=a.serializer||a.converter;if(!a.serializer){throw new Error("No serializer present. You should use the easyXDM.transport classes directly.")}a.onMessage=function(e,d){this.onData(this.serializer.parse(e),d)};this.transport=null;this.destroy=function(){this.transport.destroy()};this.sendData=function(d){this.transport.postMessage(a.serializer.stringify(d))};var b=this;window.setTimeout(function(){b.transport=new easyXDM.transport.BestAvailableTransport(a,c)},5)},Fn:{map:{},set:function(a,b){this.map[a]=b},get:function(b,a){var c=this.map[b];if(a){delete this.map[b]}return c}}};easyXDM.DomHelper={createFrame:function(c,a,e,b){var g;function f(){e(g.contentWindow)}if(b&&window.attachEvent){var d=document.createElement("span");document.body.appendChild(d);if(a){d.innerHTML='<iframe src="'+c+'" id="'+b+'" name="'+b+'"></iframe>';g=d.firstChild;a.appendChild(g);document.body.removeChild(d)}else{d.innerHTML='<iframe style="position:absolute;left:-2000px;" src="'+c+'" id="'+b+'" name="'+b+'"></iframe>';g=d.firstChild}if(e){g.loadFn=f;this.addEventListener(g,"load",f)}}else{g=document.createElement("IFRAME");g.src=c;if(e){g.loadFn=f;this.addEventListener(g,"load",f)}if(a){a.appendChild(g)}else{g.style.position="absolute";g.style.left="-2000px";document.body.appendChild(g)}}if(b){g.id=g.name=b}return g},addEventListener:function(d,b,c,a){if(window.addEventListener){easyXDM.DomHelper.addEventListener=function(h,f,g,e){h.addEventListener(f,g,e)}}else{easyXDM.DomHelper.addEventListener=function(e,g,f){e.attachEvent("on"+g,f)}}easyXDM.DomHelper.addEventListener(d,b,c)},removeEventListener:function(e,b,d,a){var c;if(window.removeEventListener){c=function(i,g,h,f){i.removeEventListener(g,h,f)}}else{c=function(f,h,g){f.detachEvent("on"+h,g)}}c(e,b,d);easyXDM.DomHelper.removeEventListener=c},requiresJSON:function(a){if(typeof JSON=="undefined"||!JSON){document.write('<script type="text/javascript" src="'+a+'"><\/script>')}}};easyXDM.transport={};easyXDM.transport.behaviors={};easyXDM.transport.behaviors.ReliableBehavior=function(c){var d,a,h,f,j=0,e=0,g=c.tries||5,i=c.timeout,b=0,k;return(d={incomming:function(n,l){var m=n.indexOf("_"),p=parseInt(n.substring(0,m),10),o;n=n.substring(m+1);m=n.indexOf("_");o=parseInt(n.substring(0,m),10);m=n.indexOf("_");n=n.substring(m+1);if(a&&p===j){window.clearTimeout(a);a=null;if(k){window.setTimeout(function(){k(true)},0)}}if(o!==0){if(o!==b){b=o;n=n.substring(o.length+1);d.down.outgoing(o+"_0_ack",l);window.setTimeout(function(){d.up.incomming(n,l)},c.timeout/2)}}},outgoing:function(n,l,m){k=m;e=0;h={data:b+"_"+(++j)+"_"+n,origin:l};(function o(){a=null;if(++e>g){if(k){window.setTimeout(function(){k(false)},0)}}else{d.down.outgoing(h.data,h.origin);a=window.setTimeout(o,c.timeout)}}())},destroy:function(){if(a){window.clearInterval(a)}d.up.destroy()},callback:function(l){d.up.callback(l)}})};easyXDM.transport.behaviors.QueueBehavior=function(e){var f,a=[],h=false,d="",g,b=(e)?e.maxLength:0;function c(){if(h||a.length===0||g){return}h=true;var i=a.shift();f.down.outgoing(i.data,i.origin,function(j){h=false;if(i.callback){window.setTimeout(function(){i.callback(j)},0)}c()})}return(f={incomming:function(l,j){var k=l.indexOf("_"),i=parseInt(l.substring(0,k),10);d+=l.substring(k+1);if(i===0){f.up.incomming(d,j);d=""}},outgoing:function(m,j,l){var i=[],k;if(b){while(m.length!==0){k=m.substring(0,b);m=m.substring(k.length);i.push(k)}}else{i.push(m)}while((k=i.shift())){a.push({data:i.length+"_"+k,origin:j,callback:i.length===0?l:null})}c()},destroy:function(){g=true;f.up.destroy()},callback:function(i){f.up.callback(i)}})};easyXDM.transport.behaviors.VerifyBehavior=function(e){var f,d,b,c=false;if(typeof e.initiate==="undefined"){throw new Error("settings.initiate is not set")}function a(){d=Math.random().toString(16).substring(2);f.down.outgoing(d)}return(f={incomming:function(i,g){var h=i.indexOf("_");if(h===-1){if(i===d){f.up.callback(true)}else{if(!b){b=i;if(!e.initiate){a()}f.down.outgoing(i)}}}else{if(i.substring(0,h)===b){f.up.incomming(i.substring(h+1),g)}}},outgoing:function(i,g,h){f.down.outgoing(d+"_"+i,g,h)},destroy:function(){f.up.destroy()},callback:function(g){if(e.initiate){a()}}})};(function(){easyXDM.transport.HashTransport=function(u,f){var v=this,i=easyXDM.Url.Query(),q=(typeof i.xdm_p==="undefined");if(!q){u.channel=i.xdm_c;u.remote=decodeURIComponent(i.xdm_e)}var b,a=u.interval||300,g=false,o=false,c=true;var p="#"+u.channel,e=0,m,s;var l,h=easyXDM.Url.getLocation(u.remote);if(q){var j={xdm_c:u.channel,xdm_p:0};if(u.local===window){g=true;o=true;j.xdm_e=encodeURIComponent(u.local=location.protocol+"//"+location.host+location.pathname+location.search);j.xdm_pa=1}else{j.xdm_e=easyXDM.Url.resolveUrl(u.local)}if(u.container){c=false;j.xdm_po=1}l=easyXDM.Url.appendQueryParameters(u.remote,j)}else{m=window;o=(typeof i.xdm_pa!=="undefined");if(o){c=false}g=(typeof i.xdm_po!=="undefined");l=u.remote}function d(x){if(!s){return}var w=l+"#"+(e++)+"_"+x;if(q||!o){s.contentWindow.location=w;if(c){s.width=s.width>75?50:100}}else{s.location=w}}this.up={incomming:function(x,w){u.onMessage(decodeURIComponent(x),w)},outgoing:function(w){d(encodeURIComponent(w))},callback:function(w){if(f){window.setTimeout(f,10)}},destroy:function(){}};this.down={incomming:function(x,w){this.up.incomming(x,w)},outgoing:function(x,w){this.down.outgoing(x,w)},callback:function(w){this.up.callback(w)},destroy:function(){this.down.destroy()}};easyXDM.applyBehaviors(this,[new easyXDM.transport.behaviors.ReliableBehavior({timeout:((c?50:a*1.5)+(g?a*1.5:50))}),new easyXDM.transport.behaviors.QueueBehavior({maxLength:4000-l.length}),new easyXDM.transport.behaviors.VerifyBehavior({initiate:q})]);function t(w){p=w;v.down.incomming(p.substring(p.indexOf("_")+1),h)}function k(w){t(m.location.hash)}function r(){if(m.location.hash&&m.location.hash!=p){t(m.location.hash)}}function n(){if(q){if(o){m=window}else{if(u.readyAfter){try{m=s.contentWindow.frames["remote_"+u.channel]}catch(x){m=window.open("","remote_"+u.channel)}}else{m=easyXDM.transport.HashTransport.getWindow(u.channel)}}if(!m){throw new Error("Failed to obtain a reference to the window")}}(function w(){if(m&&m.document&&m.document.body){if(g){b=window.setInterval(r,a)}else{if((!q&&!g)||u.readyAfter){easyXDM.DomHelper.addEventListener(m,"resize",k)}}v.down.callback(true)}else{window.setTimeout(w,10)}}())}this.postMessage=function(w){v.down.outgoing(w,h)};this.destroy=function(){v.down.destroy();if(g){window.clearInterval(b)}else{if((!q&&!g)||u.readyAfter){easyXDM.DomHelper.removeEventListener(m,"resize",r)}}if(q||!o){s.parentNode.removeChild(s)}s=null};if(q){if(u.readyAfter){window.setTimeout(n,u.readyAfter)}else{easyXDM.Fn.set(u.channel,n);easyXDM.Fn.set(u.channel+"_onresize",t)}}else{}if(!q&&o){s=parent;n()}else{s=easyXDM.DomHelper.createFrame((q?l:l+"#"+u.channel),u.container,(q&&!o)?null:n,(q?"local_":"remote_")+u.channel)}};easyXDM.transport.HashTransport.windows={};easyXDM.transport.HashTransport.channelReady=function(c,a){var b=easyXDM.transport.HashTransport;b.windows[c]=a;easyXDM.Fn.get(c,true)()};easyXDM.transport.HashTransport.getWindow=function(a){return easyXDM.transport.HashTransport.windows[a]}}());easyXDM.transport.PostMessageTransport=function(a,f){if(!window.postMessage){throw new Error("This browser does not support window.postMessage")}var h=easyXDM.Url.Query(),e=(typeof h.xdm_p==="undefined");if(!e){a.channel=h.xdm_c;a.remote=decodeURIComponent(h.xdm_e)}var l,d=easyXDM.Url.getLocation(a.remote),i;function b(m){if(m.origin){return m.origin}if(m.uri){return easyXDM.Url.getLocation(m.uri)}if(m.domain){return location.protocol+"//"+m.domain}throw"Unable to retrieve the origin of the event"}function c(){if(f){window.setTimeout(f,5)}}function j(m){i(m)}easyXDM.DomHelper.addEventListener(window,"message",j);function k(n){var m=b(n);if(m==d&&n.data.substring(0,a.channel.length+1)==a.channel+" "){a.onMessage(n.data.substring(a.channel.length+1),m)}}function g(m){if(m.data==a.channel+"-ready"){i=k;c()}}this.destroy=function(){easyXDM.DomHelper.removeEventListener(window,"message",j);if(e){l.parentNode.removeChild(l);l=null}};this.postMessage=(function(){if(e){i=g;l=easyXDM.DomHelper.createFrame(easyXDM.Url.appendQueryParameters(a.remote,{xdm_e:location.protocol+"//"+location.host,xdm_c:a.channel,xdm_p:1}),a.container);return function(m){l.contentWindow.postMessage(a.channel+" "+m,d)}}else{i=k;window.parent.postMessage(a.channel+"-ready",d);c();return function(m){window.parent.postMessage(a.channel+" "+m,d)}}}())};easyXDM.transport.NameTransport=function(e,h){var j=this;var i=easyXDM.Url.Query(),g=(typeof i.xdm_p==="undefined");if(!g){e.channel=i.xdm_c;e.remote=decodeURIComponent(i.xdm_e)}var n,d,m=0,l;var b=easyXDM.Url.getLocation(e.remote),a;e.local=easyXDM.Url.resolveUrl(e.local);function k(q){var p=e.remoteHelper+(g?("#_3"+encodeURIComponent(a+"#"+e.channel)):("#_2"+e.channel));n.contentWindow.sendMessage(q,p)}function f(){if(g){if(++m===2||!g){j.down.callback(true)}}else{k("ready");if(h){j.down.callback(true)}}}function o(p){j.down.incomming(p,b)}function c(){if(l){window.setTimeout(function(){l(true)},0)}}if(g){easyXDM.Fn.set(e.channel,function(p){if(g&&p==="ready"){easyXDM.Fn.set(e.channel,o);f()}});a=easyXDM.Url.appendQueryParameters(e.remote,{xdm_e:e.local,xdm_c:e.channel,xdm_p:2});d=easyXDM.DomHelper.createFrame(a+"#"+e.channel,e.container,null,e.channel)}else{e.remoteHelper=e.remote;easyXDM.Fn.set(e.channel,o)}this.postMessage=function(p){j.down.outgoing(p,b)};this.destroy=function(){j.down.destroy();n.parentNode.removeChild(n);n=null;if(g){d.parentNode.removeChild(d);d=null}};this.up={incomming:function(q,p){e.onMessage(q,p)},outgoing:function(r,p,q){l=q;k(r)},callback:function(p){if(h){window.setTimeout(h,10)}},destroy:function(){}};this.down={incomming:function(q,p){this.up.incomming(q,p)},outgoing:function(q,p){this.down.outgoing(q,p)},callback:function(p){this.up.callback(p)},destroy:function(){this.down.destroy()}};easyXDM.applyBehaviors(this,[new easyXDM.transport.behaviors.QueueBehavior(),new easyXDM.transport.behaviors.VerifyBehavior({initiate:g})]);n=easyXDM.DomHelper.createFrame(e.local+"#_4"+e.channel,null,function(){easyXDM.DomHelper.removeEventListener(n,"load",n.loadFn);easyXDM.Fn.set(e.channel+"_load",c);f()})};easyXDM.transport.BestAvailableTransport=function(a,c){var b=easyXDM.Url.Query(),d;if(typeof b.xdm_p==="undefined"){a.channel=(a.channel)?a.channel:"default";if(window.postMessage){d=easyXDM.transport.PostMessageTransport}else{if(a.remoteHelper){d=easyXDM.transport.NameTransport}else{d=easyXDM.transport.HashTransport}}}else{switch(b.xdm_p){case"0":d=easyXDM.transport.HashTransport;break;case"1":d=easyXDM.transport.PostMessageTransport;break;case"2":d=easyXDM.transport.NameTransport;break}}return new d(a,c)};easyXDM.Url={Query:function(){if(this._query){return this._query}this._query={};var f,d,e,c=location.search.substring(1).split("&");for(var b=0,a=c.length;b<a;b++){f=c[b];d=f.substring(0,f.indexOf("="));e=f.substring(d.length+1);this._query[d]=e}return this._query},getDomainName:function(a){var c=a.substring(a.indexOf("//")+2);c=c.substring(0,c.indexOf("/"));var b=c.indexOf(":");if(b!=-1){c=c.substring(0,b)}return c},getLocation:function(a){var b=a.indexOf("//");var c=a.substring(b+2);if(c.indexOf("/")==-1){return a}c=c.substring(0,c.indexOf("/"));return a.substring(0,b+2)+c},resolveUrl:function(b){var c=/\/[\d\w+%_\-]+\/\.\.\//;if(b.match(/^(http||https):\/\//)){return b}var d=(b.substring(0,1)==="/")?"":location.pathname;if(d.substring(d.length-1)!=="/"){d=d.substring(0,d.lastIndexOf("/")+1)}d=d+b;while(c.test(d)){d=d.replace(c,"/")}var a=location.protocol+"//"+location.host+d;return a},appendQueryParameters:function(a,c){var d="";for(var b in c){if(c.hasOwnProperty(b)){d+=b+"="+c[b]+"&"}}return a+((a.indexOf("?")==-1)?"?":"&")+d.substring(0,d.length-1)}};easyXDM.serializing={hashTableSerializer:{stringify:function(c){var b="";for(var a in c){if(c.hasOwnProperty(a)){b+=a+"="+escape(c[a])+"&"}}return b.substring(0,b.length-1)},parse:function(e){var g={};var j=e.split("&");var h,c,f;for(var b=0,a=j.length;b<a;b++){h=j[b];c=h.substring(0,h.indexOf("="));f=h.substring(c.length+1);g[c]=unescape(f)}return g}}};
