/*
Copyright (c) 2007-2008 the OTHER media Limited
Licensed under the BSD license, http://ojay.othermedia.org/license.html
*/
// @require ojay/core-min
Ojay.HTTP=JS.Singleton({include:Ojay.Observable,READY_STATE:{UNINITIALIZED:0,LOADING:1,LOADED:2,INTERACTIVE:3,COMPLETE:4},VERBS:'GET POST PUT DELETE HEAD'.split(/\s+/)});Ojay.HTTP.VERBS.forEach(function(d){Ojay.HTTP[d]=function(b,a,c){var e=new Ojay.HTTP.Request(d,b,a,c);e._3();return e.chain}});Ojay.HTTP.Request=JS.Class({initialize:function(b,a,c,e){this.verb=b.toUpperCase();if(Ojay.HTTP.VERBS.indexOf(this.verb)==-1)return;this._5=a;this._4=c||{};this._0=e||{};this.chain=new JS.MethodChain()},getURI:function(){if(this.uri)return this.uri;return this.uri=Ojay.URI.build(this._5,this._4)},_3:function(){var f=this.getURI();var i=(this.verb=='POST')?f._1():f.toString();var h=(this.verb=='POST')?f.getQueryString():undefined;Ojay.HTTP.notifyObservers('request',{receiver:this});YAHOO.util.Connect.asyncRequest(this.verb,i,{scope:this,success:function(b){var a=new Ojay.HTTP.Response(this,b);var c=this._0.onSuccess;var e=this._0['on'+a.status];var d=this._0.onComplete;c&&Function.from(c)(a);e&&Function.from(e)(a);d&&Function.from(d)(a);this.chain.fire(a);Ojay.HTTP.notifyObservers('success',{receiver:a});Ojay.HTTP.notifyObservers(a.status,{receiver:a});Ojay.HTTP.notifyObservers('complete',{receiver:a})},failure:function(b){var a=new Ojay.HTTP.Response(this,b);var c=this._0.onFailure;var e=this._0['on'+a.status];var d=this._0.onComplete;c&&Function.from(c)(a);e&&Function.from(e)(a);d&&Function.from(d)(a);Ojay.HTTP.notifyObservers('failure',{receiver:a});Ojay.HTTP.notifyObservers(a.status,{receiver:a});Ojay.HTTP.notifyObservers('complete',{receiver:a})}},h)}});Ojay.HTTP.Response=JS.Class({initialize:function(a,c){'status statusText responseText responseXML readyState'.split(/\s+/).forEach(function(b){this[b]=c[b]},this);this.request=a;this.transport=c},insertInto:function(b,a){b=b.setContent?b:Ojay(b);var c=(this.responseText||'').stripScripts();if(!a)b.setContent(c);else b.insert(c,a);return this},evalScripts:function(){if(this.responseText)this.responseText.evalScripts();return this},parseJSON:function(){return(this.responseText||'').parseJSON()},evalScriptTags:function(){return this.evalScripts()}.traced('evalScriptTags() is deprecated. Use evalScripts() instead.','warn')});(function(){var g=Ojay.HTTP;var j={JS:/\.js$/i,CSS:/\.css$/i};var k='__ojay_cross_domain__';var n=function(){Ojay(document.body).insert('<iframe name="'+k+'" style="display: none;"></iframe>','top')}.runs(1);var m=function(b){switch(true){case j.JS.test(b):return'script';break;case j.CSS.test(b):return'css';break;default:return'script';break}};JS.extend(g,{GET:g.GET.wrap(function(b,a,c,e){if(Ojay.URI.parse(a).isLocal()||!YAHOO.util.Get)return b(a,c,e);this.load(a,c,e)}),POST:g.POST.wrap(function(b,a,c,e){if(Ojay.URI.parse(a).isLocal())return b(a,c,e);this.send(a,c)}),load:function(b,a,c){var e=Ojay.URI.parse(b).path,d=m(e);YAHOO.util.Get[d](Ojay.URI.build(b,a).toString(),c||{})},send:function(b,a){var c=this._2(b,a,true);n();Ojay(document.body).insert(c.node,'top');c.node.submit();c.remove()},_2:function(c,e,d){var f=Ojay.URI.build(c,e),i=f._1(),h=f.params;var l={action:i,method:'POST'};if(d)l.target=k;return Ojay(Ojay.HTML.form(l,function(b){for(var a in h)b.input({type:'hidden',name:a,value:String(h[a])})})).hide()}});g.GET.redirectTo=function(b,a){window.location.href=Ojay.URI.build(b,a).toString()};g.POST.redirectTo=function(b,a){var c=g._2(b,a,false).node;Ojay(document.body).insert(c,'top');c.submit()};JS.MethodChain.addMethods(g)})();Ojay.URI=JS.Class({extend:{sanitize:function(b){return String(b).trim().replace('&amp;','&').replace('&#38;','&')},parse:function(e){if(e instanceof this)return e;var d=new this;e=this.sanitize(e).replace(/^(\w+)(:\/+)/,function(b,a,c){d.protocol=a;return c}).replace(/^:\/+([^\:\/]+)/,function(b,a){d.domain=a;return''}).replace(/^:(\d+)/,function(b,a){d.port=a;return''}).replace(/^[^\?\#]+/,function(b,a){d.path=b;return''}).replace(/#(.*)$/,function(b,a){d.hash=a;return''});if(!d.port)d.port=(d.domain==this.local.domain)?this.local.port:this.DEFAULT_PORTS[d.protocol];if(d.path.charAt(0)!='/'&&d.domain==this.local.domain)d.path=this.local.directory+d.path;if(/^\?/.test(e))e.slice(1).split('&').forEach(function(pair){var f=pair.split('=');d.setParam(f[0],f[1])});return d},build:function(b,a){var c=this.parse(b),a=a||{},e;for(var d in a){e=(typeof a[d]=='function')?a[d]():a[d];c.setParam(d,e)}return c},compare:function(b,a){return this.parse(b).equals(a)},DEFAULT_PORTS:{http:'80',https:'443'}},initialize:function(){this.protocol=this.klass.local.protocol;this.domain=this.klass.local.domain;this.path='';this.keys=[];this.params={};this.toString=this._6},_6:function(){var b=this._1(),a=[];var c=this.getQueryString();if(c.length)b+='?'+c;if(this.hash)b+='#'+this.hash;return b},_1:function(){return this._7()+(this.domain||'')+this._8()+(this.path||'')},getQueryString:function(){return this.keys.sort().map(function(b){return encodeURIComponent(b)+'='+encodeURIComponent(this.params[b])},this).join('&')},_7:function(){return this.protocol?this.protocol+'://':''},_8:function(){if(!this.port||this.port==this.klass.DEFAULT_PORTS[this.protocol])return'';return':'+this.port},equals:function(b){b=this.klass.parse(b);if(this.domain!=b.domain||this.protocol!=b.protocol||this.port!=b.port||this.path!=b.path||this.hash!=b.hash)return false;if(!this.paramsEqual(b))return false;return true},setParam:function(b,a){var c=[b,a].map(decodeURIComponent).map('trim');if(this.keys.indexOf(c[0])==-1)this.keys.push(c[0]);this.params[c[0]]=c[1]},paramsEqual:function(b){b=this.klass.parse(b);for(var a in this.params){if(this.params[a]!=b.params[a])return false}for(a in b.params){if(this.params[a]!=b.params[a])return false}return true},isLocal:function(){return this.protocol==this.klass.local.protocol&&this.domain==this.klass.local.domain&&this.port==this.klass.local.port}});Ojay.URI.extend({local:{protocol:window.location.protocol.replace(/\W/g,''),domain:window.location.hostname,directory:window.location.pathname.replace(/[^\/]*$/,'')}});Ojay.URI.local.port=window.location.port||Ojay.URI.DEFAULT_PORTS[Ojay.URI.local.protocol||'http'];JS.extend(String.prototype,{parseURI:Ojay.URI.method('parse').methodize(),equalsURI:Ojay.URI.method('compare').methodize()});