﻿/**
 *  Prototype Xtensions 
 *  
 *  @author    Simon Martins
 *  @copyright (c) 2008 Netatoo SARL <http://www.netatoo.fr>
 *  @license   MIT License <http://www.prototypextensions.com/#main=license>
 * 
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 *
 */
Prototype.X={Version:"0.1.2",Required:{Prototype:"1.6.0.1",Scripty:"1.8.1"},Require:function(){if(typeof Prototype=="undefined"||typeof Element=="undefined"||typeof Element.Methods=="undefined"||this.convertVersionString(Prototype.Version||0)<this.convertVersionString(this.Required.Prototype)){throw ("Prototype.Xtensions require Prototype.js >= "+this.Required.Prototype)}if(typeof Scriptaculous=="undefined"||typeof Effect=="undefined"||this.convertVersionString(Scriptaculous.Version||0)<this.convertVersionString(this.Required.Scripty)){throw ("Prototype.Xtensions require Scriptaculous >= "+this.Required.Scripty)}},convertVersionString:function(a){var b=a.replace(/_.*|\./g,"");b=parseInt(b+"0".times(4-b.length));return a.indexOf("_")>-1?b-1:b}};Prototype.X.Require();Prototype.X.Registry={};(function(){var d=navigator;var c=ua=navigator.userAgent;var b=d.appVersion;var a=parseFloat(b);Prototype.X.Browser={IE:(Prototype.Browser.IE)?parseFloat(b.split("MSIE ")[1])||0:0,Firefox:(Prototype.Browser.Gecko)?parseFloat(ua.split("Firefox/")[1])||0:0,Camino:(Prototype.Browser.Gecko)?parseFloat(ua.split("Camino/")[1])||0:0,Flock:(Prototype.Browser.Gecko)?parseFloat(ua.split("Flock/")[1])||0:0,Opera:(Prototype.Browser.Opera)?a:0,AIR:(ua.indexOf("AdobeAIR")>=0)?1:0,Mozilla:(Prototype.Browser.Gecko||!this.Khtml)?a:0,Khtml:(b.indexOf("Konqueror")>=0&&this.safari)?a:0,Safari:(function(){var e=Math.max(b.indexOf("WebKit"),b.indexOf("Safari"),0);return(e)?(parseFloat(b.split("Version/")[1])||((parseFloat(b.substr(e+7))>=419.3)?3:2)||2):0})()}})();$unixTime=function(a){var b=new Date();b=b.getTime();if(a==true){b=b/1000}return b};Object.extend(String.prototype,{ucfirst:function(){return this.charAt(0).toUpperCase()+this.substring(1)}});Object.extend(Number.prototype,{minute:function(){return this*60},hour:function(){return this*3600},day:function(){return this*86400},week:function(){return this*604800},month:function(){return this*2629743.83},year:function(){return this*31556926},time:function(){return(this.toMs())+$unixTime()},toSeconds:function(){return this*1000},toMs:function(){return this/1000}});Object.extend(Class,{accessors:{createAccessors:function(b,a){var a=(!Object.isArray(a))?Object.keys(a):a;a.each(function(d){var c=(d.camelize()).ucfirst();(function(e,f){f["get"+c]=function(){return b[e]};f["set"+c]=function(g){b[e]=g;return f}})(d,this)},this)},setOptions:function(b,d,c){var a=(Object.isUndefined(c))?false:c;if(!b){b={}}Object.extend(b,d||{});if(c){this.createAccessors(b,b)}}}});var EventManager=Class.create({initialize:function(a){this.scope=a;this.events=new Hash()},addObserver:function(a){return this.events.set(a,new Hash())},observe:function(a,d){var c=this.events.get(a);if(!c){c=this.addObserver(a)}if(!Object.isFunction(d)){throw ("EventManager.observe : callback must be an js function")}var b=this.events.get(a).keys().length;c.set(b,d.bind(this.scope));return this},notify:function(b){var c=this.events.get(b);if(c){var a=$A(arguments).slice(1);c.each(function(d){if(Object.isFunction(d[1])){d[1].apply(this.scope,a)}})}return this}});var Cookie={events:new EventManager(this),isEnabled:function(){this.set("enabled","ok");var a=this.get("enabled");this.unset("enabled");return(a=="ok")?true:false},observe:function(a,b){this.events.observe(a,b);return this},set:function(b,h,j,g){var c="";var d=j||{};var i=(d.path)?"; path="+d.path:"; path=/";var f=(d.domain)?"; domain="+d.domain:"";var a=(d.secure==true)?"; secure":"";var e=new Date();if(Object.isNumber(d)){e.setTime(e.getTime()+(d*1000));c="; expires="+e.toGMTString()}else{if(d.expires){e.setTime(e.getTime()+(d.expires*1000));c="; expires="+e.toGMTString()}}document.cookie=b+"="+h+c+i+f+a;if(!g){this.events.notify("set",b,h,j)}return this},get:function(b){this.events.notify("get",b);var e=b+"=";var a=document.cookie.split(";");for(var d=0;d<a.length;d++){var f=a[d];while(f.charAt(0)==" "){f=f.substring(1,f.length)}if(f.indexOf(e)==0){return f.substring(e.length,f.length)}}return null},unset:function(a){this.events.notify("unset",a);this.set(a,"",-1,true);return this}};var History={__altered:false,__currentHash:null,__previousHash:null,__iframe:false,__title:false,init:function(){var a=this;var b=location.hash.substring(1);this.hash=$H(b.toQueryParams());this.__currentHash=b;this.__previousHash=b;this.__title=document.title;if(Prototype.Browser.IE&&Prototype.X.Browser.IE<8){document.observe("dom:loaded",function(c){if(!$("px-historyframe")){History.__iframe=new Element("iframe",{name:"px-historyframe",id:"px-historyframe",src:"",width:"0",height:"0",style:{visibility:"hidden"}});document.body.appendChild(History.__iframe);History.setHashOnIframe(a.hash.toQueryString())}})}},set:function(b,a){this.__previousHash=this.hash.toQueryString();this.hash.set(b,a);this.apply()},get:function(a){return this.hash.get(a)},unset:function(a){this.hash.unset(a);this.apply()},update:function(){this.__previousHash=this.hash.toQueryString();var b=window.location.hash.substring(1);if(Prototype.Browser.IE&&Prototype.X.Browser.IE<8&&this.__iframe){var a=this.getHashOnIframe();if(a!=b){b=a}}this.hash=$H(b.toQueryParams());this.__currentHash=b},apply:function(){var a=this.hash.toQueryString();window.location.hash=a;if(Prototype.Browser.IE&&Prototype.X.Browser.IE<8&&this.__iframe){if(this.__currentHash!=a){this.setHashOnIframe(a)}else{if(a!=this.getHashOnIframe()){this.setHashOnIframe(a)}}}},isAltered:function(){if(this.__altered==true){return true}this.__altered=false;return(History.__currentHash!=History.__previousHash)},setHashOnIframe:function(c){try{var b=History.__iframe.contentWindow.document;b.open();b.write('<html><body id="history">'+c+"</body></html>");b.close()}catch(a){}},getHashOnIframe:function(){var a=this.__iframe.contentWindow.document;if(a&&a.body.id=="history"){return a.body.innerText}else{return this.hash.toQueryString()}},setTitle:function(a){if(document.title){document.title=a}},getTitle:function(){return this.__title}};History.init();History.Registry={hash:new Hash(),set:function(a){if(typeof(a)!="object"){throw ("History.Registry.set : $config must be an javascript object")}if(!a.id||!Object.isString(a.id)){throw ("History.Registry.set : $config.id must be an string")}if(!a.onStateChange||!Object.isFunction(a.onStateChange)){throw ("History.Registry.set : $config.onStateChange must be an javascript callback function")}if(!a.defaultValue||!Object.isString(a.defaultValue)){a.defaultValue=""}this.hash.set(a.id,a)},get:function(a){return this.hash.get(a)},unset:function(a){this.hash.unset(a)}};History.Observer={delay:0.2,interval:null,started:false,start:function(){if(this.started){return}this.interval=new PeriodicalExecuter(History.Observer.dispatch,this.delay);this.started=true},stop:function(){if(!this.started){return}this.interval.stop();this.started=false},dispatch:function(){History.update();if(History.isAltered()){openHash();History.hash.each(function(b){var a=History.Registry.get(b.key);if(a){a.onStateChange.bind(History)(b.value)}})}}};Ajax.History={types:["Request","Updater"],observe:function(d,h,f,c){var b=Ajax.History.Registry.get(h);var a=0;var e=false;if(this.types.indexOf(d)==-1){throw ("Ajax.History.observer() -> type "+d+" is invalid !")}if(b==undefined){a=(c.history.state)?c.history.state:0;var g=new Hash();g.set(a,c);Ajax.History.Registry.set(h,g)}else{a=(c.history.state)?c.history.state:this.getCurrentVersion(h);b.set(a,c)}this.addCallback(d,h);return a},addCallback:function(a,b){History.Observer.start();History.__altered=true;if(!Object.isUndefined(History.Registry.get(b))){return}History.Registry.set({id:b,onStateChange:function(e){var c=Ajax.History.Registry.get(b).get(e.toString());var d=null;if(Object.isUndefined(c)){return}if(c.history.cache==true&&c.history.__request){new Ajax.Cache(c.history.__request)}else{if(a=="Request"){d=new Ajax.Request(c.history.__url,c)}else{if(a=="Updater"){d=new Ajax.Updater(c.container,c.history.__url,c)}}c.history.__request=d}History.__altered=false;if(Object.isFunction(c.history.onStateChange)){c.history.onStateChange(e)}}})},getCurrentVersion:function(b){var a=Ajax.History.Registry.get(b);return Object.isUndefined(a)?0:a.keys().length}};Ajax.History.Registry=new Hash();Ajax.History.Features={id:null,state:false,cache:false,onStateChange:null,__url:null,__request:null};Ajax.History.Request=Class.create({initialize:function(c,a){this.options={};Object.extend(this.options,a);if(this.options.history){var d=Object.clone(Ajax.History.Features);Object.extend(d,this.options.history);this.options.history=d;this.options.history.__url=c;if(Object.isUndefined(a.history.id)){throw ("Ajax.History.Request error : you must define historyId")}else{var e=this.options.history.id}var b=Ajax.History.observe("Request",e,c,this.options);History.set(e,b)}else{return new Ajax.Request(c,this.options)}}});Ajax.History.Updater=Class.create({initialize:function(e,c,a){this.options={};Object.extend(this.options,a);if(this.options.history){var d=Object.clone(Ajax.History.Features);Object.extend(d,this.options.history);this.options.history=d;this.options.history.__url=c;if(Object.isUndefined(a.history.id)){var f=(Object.isString(e))?e:e.id}else{var f=this.options.history.id}this.options.container=e;var b=Ajax.History.observe("Updater",f,c,this.options);History.set(f,b)}else{return new Ajax.Updater(e,c,this.options)}}});Ajax.Cache=Class.create(Ajax.Base,{_complete:false,initialize:function($super,a){$super(a.options);a._complete=false;this.transport=a.transport;this.request(a.url);return this},request:function(b){this.url=b;this.method=this.options.method;var d=Object.clone(this.options.parameters);try{var a=new Ajax.Response(this);if(this.options.onCreate){this.options.onCreate(a)}Ajax.Responders.dispatch("onCreate",this,a);if(this.options.asynchronous){this.respondToReadyState.bind(this).defer(1)}this.onStateChange()}catch(c){this.dispatchException(c)}}});Object.extend(Ajax.Cache.prototype,{respondToReadyState:Ajax.Request.prototype.respondToReadyState,onStateChange:Ajax.Request.prototype.onStateChange,success:Ajax.Request.prototype.getStatus,getStatus:Ajax.Request.prototype.getStatus,isSameOrigin:Ajax.Request.prototype.isSameOrigin,getHeader:Ajax.Request.prototype.getHeader,evalResponse:Ajax.Request.prototype.evalResponse,dispatchException:Ajax.Request.prototype.dispatchException});Ajax.Request=Class.create(Ajax.Request,{initialize:function($super,b,a){$super(b,a);return this}});Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];Ajax.Updater=Class.create(Ajax.Updater,{initialize:function($super,a,c,b){$super(a,c,b);return this}});Prototype.X.Registry.Tabs={};var Tabs=Class.create(Class.accessors,{initialize:function(c,a){var d=this;this.items=[];this.options={element:null,elementId:null,tabsId:null,tabsContainer:null,domTabs:{},requests:{},selectEvent:"click",defaultActive:0,currentActive:null,history:true,sortable:false,sortableOptions:{tag:"li",overlap:"horizontal",constraint:"horizontal"},deletable:false},this.setOptions(this.options,a,true);this.setElement(c);this.setElementId(this.getElement().id);this.setTabsId(this.getElementId().camelize());var b=this.getElement().firstDescendant().childElements();this.setDomTabs(b);this.setTabsContainer(this.getElement().firstDescendant());this.__buildItems();this.__selectByDefault()},__buildItems:function(){var c=this;var a=this.getElement().childElements();var b=this.getDomTabs();a.shift();b.each(function(g,f){if(!c.items[f]){var e={};var d=c.options.requests[a[f].id];if(d){e=d}c.items[f]=new TabsItem(c,{item:g,panel:a[f],request:e,effect:c.effect})}})},__selectByDefault:function(){var c=this;if(this.getHistory()){History.Observer.start();History.Registry.set({id:this.getTabsId(),onStateChange:function(e){var d=c.get(e,false);if(d){if(Prototype.Browser.Opera){d.__select()}else{d.select()}}this.setTitle(this.getTitle()+" ("+e.ucfirst()+")")}});var b=History.get(this.getTabsId());var a=this.get(b,false);if(b&&a){a.select()}else{this.get(this.getDefaultActive()).select()}}else{this.get(this.getDefaultActive()).select()}},makeSortable:function(a){if(this.getSortable()){return}var b=Object.extend(this.getSortableOptions(),a||{});Sortable.create(this.getTabsContainer().identify(),b);this.setSortable(true)},show:function(c,b){var a=this.get(c);if(a){a.show(b)}},hide:function(b){var a=this.get(b);if(a){a.hide()}},select:function(b){var a=this.get(b);if(a){a.select()}},selectFirst:function(){this.items.each(function(b,a){if(b.getDisplay()){b.select();throw $break}})},selectLast:function(){this.items.last().select()},unSelectAll:function(a){a=(Object.isUndefined(a))?false:a;this.items.each(function(c,b){if(a){if(c!=a){c.unSelect()}}else{c.unSelect()}})},get:function(b,d){var e=this;var a="Error on Tabs.get() : index "+b+" is undefined ! ";if(Object.isUndefined(d)){d=true}if(Object.isNumber(b)){if(!this.items[b]){if(d){throw (a)}else{return false}}return this.items[b]}else{if(Object.isString(b)){var c=false;var f=null;this.getDomTabs().each(function(h,j){if(e.items[j]){var g=e.items[j];var i=g.getPanel().id;if(i==b){c=true;f=g}}});if(!c){if(d){throw (a)}else{return false}}return f}}if(d){throw (a)}else{return false}}});var TabsItem=Class.create(Class.accessors,{initialize:function(b,a){this.options={tabs:null,item:null,panel:null,display:true,request:null,loaded:false,titleElement:null,selected:false,iframe:null};this.setOptions(this.options,a,true);this.setTabs(b);this.__getTitleElement();this.__setEvents();this.__voidAhref();this.events=new EventManager(this)},__setEvents:function(){var b=this;var a=this.getTabs().getSelectEvent();$(this.getItem()).observe(a,this.select.bindAsEventListener(this))},__getTitleElement:function(){this.setTitleElement(this.getItem().firstDescendant())},__voidAhref:function(){var b=this.getItem().firstDescendant();if(b.hasAttribute("href")){b.href="javascript:void(0)"}},observe:function(a,b){this.events.observe(a,b);return this},getTitle:function(){return this.getTitleElement().innerHTML},setTitle:function(a){this.getTitleElement().update(a)},select:function(){if(this.getTabs().getHistory()){History.set(this.getTabs().getTabsId(),this.getPanel().id);History.setTitle(History.getTitle()+" ("+this.getPanel().id.ucfirst()+")")}this.__select()},__select:function(){if(this.getTabs().getHistory()){History.setTitle(History.getTitle()+" ("+this.getPanel().id.ucfirst()+")")}this.getTabs().unSelectAll(this);this.getItem().className="tab-show";this.getPanel().className="panel-show";this.getPanel().show();this.load();this.events.notify("select",this);this.setSelected(true)},unSelect:function(){this.getItem().className="tab-hide";this.getPanel().className="panel-hide";if(this.getSelected()){this.events.notify("unselect",this)}this.setSelected(false)},show:function(a){if(this.getDisplay()){return}this.events.notify("show",this);this.getItem().show();this.getPanel().show();this.setDisplay(true);if(a===true){this.select()}},hide:function(){if(!this.getDisplay()){return}this.events.notify("hide",this);this.getItem().hide();this.getPanel().hide();this.setDisplay(false);this.getTabs().selectFirst()},toggle:function(a){if(!this.getDisplay()){return this.show(a)}this.hide()},load:function(j){var f=this;var j=Object.extend(j||{},this.getRequest().options||{});if(this.getRequest().url!=null&&!this.getLoaded()){var i=this.getRequest().type;if(i=="ajax"){j=Object.clone(Object.extend({onLoading:function(k,m,l){l.setTitle("Loading...")}},j));var e=j.onCreate;j.onCreate=(function(k){if(Object.isFunction(e)){e(k,f)}}).bind(this);var h=j.onSuccess;j.onSuccess=(function(k,l){f.setLoaded(true);if(Object.isFunction(h)){h(k,l,f)}}).bind(this);var b=j.onFailure;j.onFailure=(function(k,l){if(Object.isFunction(b)){b(k,l,f)}}).bind(this);var c=j.onComplete;j.onComplete=(function(k,l){f.setTitle(f.options.tmpTitle);if(Object.isFunction(c)){c(k,l,f)}}).bind(this);var a=j.onLoading;j.onLoading=(function(k,l){f.options.tmpTitle=f.getTitle();if(Object.isFunction(a)){a(k,l,f)}}).bind(this);var d=j.onLoaded;j.onLoaded=(function(k,l){if(Object.isFunction(d)){d(k,l,f)}}).bind(this);var g=j.onException;j.onException=(function(l,k){if(Object.isFunction(g)){g(l,k,f)}}).bind(this);new Ajax.Updater(this.getPanel(),this.getRequest().url,Object.extend({onLoading:function(k){k.setTitle("Loading...")}},j||{}))}else{if(i=="iframe"){this.iframe=new Element("iframe",{name:this.getRequest().id,id:this.getRequest().id,src:this.getRequest().url});this.getPanel().update(this.iframe);this.setLoaded(true)}}}},reload:function(a){this.setLoaded(false);this.load(a)}});Element.addMethods({tabs:function(c,b){var d=c.id.camelize();if(!Prototype.X.Registry.Tabs[d]){Prototype.X.Registry.Tabs[d]={};var a=new Tabs(c,b);Prototype.X.Registry.Tabs[d].instance=a;return a}var a=Prototype.X.Registry.Tabs[d].instance;a.setOptions(a.options,b,true);return a}});

