/*
 * easyXDM 
 * http://easyxdm.net/
 * Copyright(c) 2009, Øyvind Sean Kinsey, oyvind@kinsey.no.
 * 
 * MIT Licensed - http://easyxdm.net/license/mit.txt
 * 
 */
 easyXDM={version:"1.7.2.52",apply:function(c,b){if(!b){return}for(var a in b){if(b.hasOwnProperty(a)){c[a]=b[a]}}},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);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={BestAvailableTransport:function(a,d){var c=easyXDM.Url.Query();var b=(typeof c.xdm_p==="undefined");var e;if(b){a.channel=(a.channel)?a.channel:"default";if(window.postMessage){e=easyXDM.transport.PostMessageTransport}else{if(a.remoteHelper){e=easyXDM.transport.NameTransport}else{e=easyXDM.transport.HashTransport}}}else{if(typeof c.xdm_e!=="string"){throw ("No remote specified")}a.channel=c.xdm_c;a.remote=decodeURIComponent(c.xdm_e);switch(c.xdm_p){case"0":e=easyXDM.transport.HashTransport;break;case"1":e=easyXDM.transport.PostMessageTransport;break;case"2":e=easyXDM.transport.NameTransport;break}}return new e(a,d)},PostMessageTransport:function(a,f){if(!window.postMessage){throw new Error("This browser does not support window.postMessage")}var e=(typeof easyXDM.Url.Query().xdm_p==="undefined");var k,d=easyXDM.Url.getLocation(a.remote),h;function b(l){if(l.origin){return l.origin}if(l.uri){return easyXDM.Url.getLocation(l.uri)}if(l.domain){return location.protocol+"//"+l.domain}throw"Unable to retrieve the origin of the event"}function c(){if(f){window.setTimeout(f,5)}}function i(l){h(l)}easyXDM.DomHelper.addEventListener(window,"message",i);function j(m){var l=b(m);if(l==d&&m.data.substring(0,a.channel.length+1)==a.channel+" "){a.onMessage(m.data.substring(a.channel.length+1),l)}}function g(l){if(l.data==a.channel+"-ready"){h=j;c()}}this.destroy=function(){easyXDM.DomHelper.removeEventListener(window,"message",i);if(e){k.parentNode.removeChild(k);k=null}};this.postMessage=(function(){if(e){h=g;k=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(l){k.contentWindow.postMessage(a.channel+" "+l,d)}}else{h=j;window.parent.postMessage(a.channel+"-ready",d);c();return function(l){window.parent.postMessage(a.channel+" "+l,d)}}}())},HashTransport:function(r,e){var p=(typeof easyXDM.Url.Query().xdm_p==="undefined");var b,a=r.interval||300,f=false,n=false,c=true;var o="#"+r.channel,d=0,k,q;var j,g=easyXDM.Url.getLocation(r.remote);if(p){var i={xdm_c:r.channel,xdm_p:0};if(r.local===window){f=true;n=true;i.xdm_e=encodeURIComponent(r.local=location.protocol+"//"+location.host+location.pathname+location.search);i.xdm_pa=1}else{i.xdm_e=easyXDM.Url.resolveUrl(r.local)}if(r.container){c=false;i.xdm_po=1}j=easyXDM.Url.appendQueryParameters(r.remote,i)}else{var h=easyXDM.Url.Query();k=window;n=(typeof h.xdm_pa!=="undefined");f=(typeof h.xdm_po!=="undefined");j=r.remote+"#"+r.channel}function l(){try{if(k.location.hash&&k.location.hash!=o){o=k.location.hash;r.onMessage(decodeURIComponent(o.substring(o.indexOf("_")+1)),g)}}catch(s){}}function m(){if(p){if(n){k=window}else{if(r.readyAfter){k=window.open(r.local+"#"+r.channel,"remote_"+r.channel)}else{k=easyXDM.transport.HashTransport.getWindow(r.channel)}if(!k){throw new Error("Failed to obtain a reference to the window")}}}if(f){b=window.setInterval(function(){l()},a)}else{easyXDM.DomHelper.addEventListener(k,"resize",l)}if(e){window.setTimeout(e,10)}}this.postMessage=function(s){if(p||!n){q.src=j+"#"+(d++)+"_"+encodeURIComponent(s);if(c){q.width=q.width>75?50:100}}else{q.location=j+"#"+(d++)+"_"+encodeURIComponent(s)}};this.destroy=function(){if(f){window.clearInterval(b)}else{if(k){easyXDM.DomHelper.removeEventListener(k,"resize",l)}}if(p||!n){q.parentNode.removeChild(q)}q=null};if(p){if(r.readyAfter){window.setTimeout(m,r.readyAfter)}else{easyXDM.Fn.set(r.channel,m)}}if(!p&&n){q=parent;m()}else{q=easyXDM.DomHelper.createFrame(j,r.container,(p&&!n)?null:m,(p?"local_":"remote_")+r.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.NameTransport=function(d,g){var h=this;var f=(typeof easyXDM.Url.Query().xdm_p==="undefined");var j,c,i=0;var b=easyXDM.Url.getLocation(d.remote),a;d.local=easyXDM.Url.resolveUrl(d.local);function e(){if(f){if(++i===2||!f&&g){window.setTimeout(g,10)}}else{if(!f){h.postMessage("ready")}if(g){window.setTimeout(g,10)}}}if(f){easyXDM.Fn.set(d.channel,function(k){if(f&&k==="ready"){easyXDM.Fn.set(d.channel,function(l){d.onMessage(l,b)});e()}});a=easyXDM.Url.appendQueryParameters(d.remote,{xdm_e:d.local,xdm_c:d.channel,xdm_p:2});c=easyXDM.DomHelper.createFrame(a+"#"+d.channel,d.container,null,d.channel)}else{d.remoteHelper=d.remote;easyXDM.Fn.set(d.channel,function(k){d.onMessage(k,b)})}j=easyXDM.DomHelper.createFrame(d.local,null,function(){easyXDM.DomHelper.removeEventListener(j,"load",j.loadFn);e()});this.postMessage=function(k){j.name=k;if(f){j.src=d.remoteHelper+"#_3"+encodeURIComponent(a+"#"+d.channel)}else{j.src=d.remoteHelper+"#_2"+d.channel}};this.destroy=function(){j.parentNode.removeChild(j);j=null;if(f){c.parentNode.removeChild(c);c=null}}};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){if(b.match(/^(http||https):\/\//)){return b}var c=(b.substring(0,1)==="/")?"":location.pathname;if(c.substring(c.length-1)!=="/"){c=c.substring(0,c.lastIndexOf("/")+1)}var a=location.protocol+"//"+location.host+c+b;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}}};