lib.Queue={};lib.Queue.THREADS=0;lib.Queue.MAX_THREADS=2;lib.Queue.Job=new Class({Implements:Options,initialize:function(queue,options){this.queue=queue;if(!this.queue)throw new lib.Exceptions.Value({desc:"A queue object is required"});lib.Queue.THREADS++;this._call_executer();},options:{retry_delay:100},_call_executer:function(){var job=this.queue.get();var rerun=this._call_executer.bind(this);if(!job){rerun.delay(this.options.retry_delay);return;}
var jobresult=this.executer(job);lib.Queue.THREADS--;return jobresult;},executer:function(job){throw new lib.Exceptions.NotImplemented({desc:"No executer method implemented"});}});lib.Queue.MultiJob=new Class({Extends:lib.Queue.Job,initialize:function(queue,options){this.retries=this.options.retries;this.parent(queue,options);},options:{retry_delay:100,retries:3},_call_executer:function(){var job=this.queue.get();var rerun=this._call_executer.bind(this);if(!job){this.retries--;if(this.retries>0){rerun.delay(this.options.retry_delay*(this.options.retries-this.retries));return;}else{lib.Queue.THREADS--;return;}}
this.retries=this.options.retries;return this.executer(job);}});lib.Queue.PersistentJob=new Class({Extends:lib.Queue.MultiJob,options:{retry_delay:100},_call_executer:function(){var job=this.queue.get();this.rerun=this._call_executer.bind(this);if(!job){this.rerun.delay(this.options.retry_delay);return;}else{return this.executer(job);}},kill:function(){$clear(this.rerun);lib.Queue.THREADS--;}});lib.Queue.SimpleQueue=new Class({initialize:function(){this._jobs=[];this._accepted=0;this._delivery=0;},size:function(){return this._jobs.length;},empty:function(){this._jobs.length=0;},isEmpty:function(){return(this._jobs.length==0);},get:function(){if(!this._jobs.length)return;this._delivery++;var result=this._jobs.shift();return result;},put:function(job){jobidx=this._jobs.push(job);this._accepted++;}});lib.Queue.PriorityQueue=new Class({Extends:lib.Queue.SimpleQueue,initialize:function(){this.parent();this._protected=[];},get:function(){if(!this._jobs.length)return;this._delivery++;var result=this._jobs.shift();this._decrement_protected();return result;},_decrement_protected:function(){var new_protected=this._protected.map(function(job_idx,idx){var new_idx=--job_idx;if(new_idx<0){return undefined;}else{return new_idx;}});this._protected=new_protected.filter(function(val,idx){if(!isNaN(val))return true;});},put:function(job,protected_job){jobidx=this._jobs.push(job);this._accepted++;if(protected_job==true){this._protected.push(jobidx);}},put_priority:function(job,index,protected_job){var preferred_index=(index)?index:0;var available_index=this._get_avail_index(preferred_index);if(protected_job){this._protected.push(available_index);}
this._jobs.splice(available_index,0,job);this._accepted++;},_get_avail_index:function(preferred_index){var prot=this._protected.copy();var high_protected=prot.sort()[prot.length-1];if(!isNaN(high_protected)){return high_protected;}else{return preferred_index;}}});lib.Images={};lib.Images.CachedImage=new Class({Implements:[Options,Events],initialize:function(url,options){this.loaded=false;this.url=url;this.setOptions(options);this._create_img_tag();this.timeleft=this.options.load_timeout||true;},options:{onImgLoad:$empty,onImgTooBig:$empty,onImgTooSmall:$empty,onImgInvalid:$empty,encoded_url:false,max_dimensions:{x:-1,y:-1},min_dimensions:{x:-1,y:-1},preload:true,load_timeout:20000},_encode_url:function(url){var urllist=url.split('://');if(!this.options.encoded_url&&urllist.length==2){return urllist[0]+"://"+escape(urllist[1]);}else if(!this.options.encoded_url){return escape(url);}else{return url;}},_create_img_tag:function(){this.imgtag=new Element('img');if(this.options.preload){this.load();}},load:function(){if(!this.imgtag.src){var encurl=this._encode_url(this.url);try{this.imgtag.src=encurl;}catch(err){this.fireEvent('onImgInvalid',this);}
this._wait_to_load();}},_wait_to_load:function(){var _timer=function(){if(this.imgtag.complete){$clear(_timer);this.loaded=true;this.valid=this._test_dimensions();if(this.valid){this.fireEvent('onImgLoad',this,50);}}else{if(this._decrement_timeout(50))$clear(_timer);}}.bind(this).periodical(50);},_decrement_timeout:function(msec){if(this.timeleft==true)return false;if(this.timeleft>0){this.timeleft-=50;return false;}else{this.fireEvent('onImgInvalid',this);return true;}},_test_dimensions:function(){this.dimensions={x:this.imgtag.width,y:this.imgtag.height};if((this.dimensions.x==0)||(this.dimensions.y==0)){this.fireEvent('onImgInvalid',this);return false;}
if((this.options.min_dimensions.x!=-1)&&(this.options.min_dimensions.x>this.dimensions.x)||(this.options.min_dimensions.y!=-1)&&(this.options.min_dimensions.y>this.dimensions.y)){this.fireEvent('onImgTooSmall',this);return false;}
if((this.options.max_dimensions.x!=-1)&&(this.options.max_dimensions.x<this.dimensions.x)||(this.options.max_dimensions.y!=-1)&&(this.options.max_dimensions.y<this.dimensions.y)){this.fireEvent('onImgTooBig',this);return false;}
return true;},isValid:function(callback){var _timer=function(){if(this.loaded){$clear(_timer);callback.bind(this.valid,50);}else{if(this._decrement_timeout(50))$clear(_timer);}}.bind(this).periodical(50);},getSize:function(callback){var _timer=function(){if(this.loaded){$clear(_timer);callback.bind(this.dimensions,50);}else{if(this._decrement_timeout(50))$clear(_timer);}}.bind(this).periodical(50);}});String.implement({stripTags:function(){return this.replace(/<\/?[^>]+>/gi,'');},escapeHTML:function(){var div=document.createElement('div');var text=document.createTextNode(this);div.appendChild(text);return div.innerHTML;},unescapeHTML:function(){var div=document.createElement('div');var text="";div.innerHTML=this.stripTags();for(var i=0;i<div.childNodes.length;i++){text+=div.childNodes[i].nodeValue;}
return text;},escapeJavaScript:function(){return this.replace(/(["'\f\b\n\t\r])/gm,"\\$1");},lstrip:function(s,chars){if(!s)s=' ';var esc_s=s.escapeRegExp();var regexp;if(chars){regexp=new RegExp('^'+esc_s+'{1,'+chars+'}','g');}else{regexp=new RegExp('^'+esc_s+'+','g');}
return this.replace(regexp,'');},rstrip:function(s,chars){if(!s)s=' ';var esc_s=s.escapeRegExp();var regexp;if(chars){regexp=new RegExp(esc_s+'{1,'+chars+'}$','g');}else{regexp=new RegExp(esc_s+'+$','g');}
return this.replace(regexp,'');},strip:function(s){if(!s)s=' ';var lstripped=this.lstrip(s);return lstripped.rstrip(s);}});Hash.implement({getKeyIndex:function(key){var keyIdx=this.getKeys().indexOf(key);if(keyIdx!=-1){return keyIdx;}else{return null;}},getNextKey:function(key){var current_index=this.getKeyIndex(key);if(current_index===null)return null;var next_index=current_index+1;var max_index=this.getLength()-1;if(next_index<=max_index){return this.getKeys()[next_index];}else{return this.getFirstKey();}},getPreviousKey:function(key){var current_index=this.getKeyIndex(key);if(current_index===null)return null;var prev_index=current_index-1;var min_index=0;if(prev_index>=min_index){return this.getKeys()[prev_index];}else{return this.getLastKey();}},getFirstKey:function(){return this.getKeys()[0];},getLastKey:function(){return this.getKeys()[this.getLength()-1];},getRandomKey:function(but_not_this_key){choice_keys=this.getKeys();if(but_not_this_key)choice_keys.remove(but_not_this_key);random_index=Math.floor(Math.random()*choice_keys.length)
return choice_keys[random_index];}});lib.Images.SlideDeck=new Class({Implements:[Options,Events],options:{displayCallback:false,onShow:$empty,onDoesNotExist:$empty,hashPrefix:'slide:',controls:{first:'a#slide_first',back:'a#slide_back',next:'a#slide_next',last:'a#slide_last',random:'a#slide_random',slides:'a.slide_direct_link'}},initialize:function(slidedeck,options){this.deck=this._get_deck(slidedeck);this.setOptions(options);this.display=this._set_display();this._bind_controls();var hash=this._parseanchor();var result;if(hash)result=this._autoshow(hash);if(!result)this.first();return;},_bind_controls:function(){var boundFirst=this.first.bindWithEvent(this);var boundLast=this.last.bindWithEvent(this);var boundNext=this.next.bindWithEvent(this);var boundBack=this.back.bindWithEvent(this);var boundRandom=this.random.bindWithEvent(this);$$(this.options.controls.first).each(function(el){el.addEvent('click',boundFirst);});$$(this.options.controls.last).each(function(el){el.addEvent('click',boundLast);});$$(this.options.controls.next).each(function(el){el.addEvent('click',boundNext);});$$(this.options.controls.back).each(function(el){el.addEvent('click',boundBack);});$$(this.options.controls.random).each(function(el){el.addEvent('click',boundRandom);});this._set_first_href();this._set_last_href();this._bind_thumbnails();return;},_bind_thumbnails:function(){$$(this.options.controls.slides).each(function(el,idx){var href=el.get('href');if(!href)return false;var slide_id=href.replace('#'+this.options.hashPrefix,'');if(slide_id.strip()=='')return false;this._set_slide_href(el,slide_id);}.bind(this));return;},_set_first_href:function(){$$(this.options.controls.first).each(function(el){el.set('href','#'+this.options.hashPrefix+this.deck.getFirstKey());}.bind(this));return;},_set_last_href:function(){$$(this.options.controls.last).each(function(el){el.set('href','#'+this.options.hashPrefix+this.deck.getLastKey());}.bind(this));return;},_set_back_href:function(current_slide_id){$$(this.options.controls.back).each(function(el){el.set('href','#'+this.options.hashPrefix+this.deck.getPreviousKey(current_slide_id));}.bind(this));return;},_set_next_href:function(current_slide_id){$$(this.options.controls.next).each(function(el){el.set('href','#'+this.options.hashPrefix+this.deck.getNextKey(current_slide_id));}.bind(this));return;},_set_random_href:function(next_random){$$(this.options.controls.random).each(function(el){el.set('href','#'+this.options.hashPrefix+next_random);}.bind(this));return;},_set_slide_href:function(el,slide_id){el=$(el);var boundShow=this.show.bindWithEvent(this,[slide_id]);el.set('href','#'+this.options.hashPrefix+slide_id);el.addEvent('click',boundShow);return;},_get_deck:function(slidedeck){var returndeck;var decktype=$type(slidedeck);switch(decktype){case'array':var newdeck={};slidedeck.each(function(val,idx){newdeck[idx]=val;});returndeck=new Hash(newdeck);break;case'object':returndeck=new Hash(slidedeck);break;case'hash':returndeck=new Hash(slidedeck);break;default:var errmsg="I don't know how to handle a deck of type "+$type(slidedeck);throw new lib.Exceptions.Value({'desc':errmsg});break;}
return returndeck;},_set_display:function(){if(!this.options.displayCallback){var errmsg="You must specify a callback that handles slide display";throw new lib.Exceptions.Value({'desc':errmsg});}
return this.options.displayCallback;},_parseanchor:function(){return location.hash.replace(/#/,'');},_autoshow:function(hash){if(!hash)return false;if(hash.search(this.options.hashPrefix)!=0)return false;var slide_id=hash.replace(this.options.hashPrefix,'');this.show(null,slide_id);return true;},_handle_event:function(ev){return;},first:function(ev){this._handle_event(ev);return this.show(null,this.deck.getFirstKey());},back:function(ev){this._handle_event(ev);return this.show(null,this.deck.getPreviousKey(this.visible));},previous:function(ev){this._handle_event(ev);return this.back();},next:function(ev){this._handle_event(ev);return this.show(null,this.deck.getNextKey(this.visible));},forward:function(ev){this._handle_event(ev);return this.next();},last:function(ev){this._handle_event(ev);return this.show(null,this.deck.getLastKey());},random:function(ev){this._handle_event(ev);return this.show(null,this.next_random);},getrandom:function(){return this.deck.getRandomKey(this.visible);},show:function(ev,slide_id){this._handle_event(ev);if(!slide_id)return false;if(slide_id==this.visible)return false;if(!this.deck.hasKey(slide_id)){this.first();this.fireEvent('doesNotExist',slide_id);return false;}
result=this.display(this.deck.get(slide_id),slide_id);this.visible=slide_id;var slide_idx=this.deck.getKeyIndex(this.visible)
this.fireEvent('show',[this.visible,slide_idx]);function delayedSettings(){this._set_back_href(slide_id);this._set_next_href(slide_id);this.next_random=this.getrandom();this._set_random_href(this.next_random);}
delayedSettings.delay(50,this);return result;}});lib.Images.SlideDeckQueue=new lib.Queue.PriorityQueue();lib.Images.SlideImageJob=new Class({Extends:lib.Queue.MultiJob,executer:function(job){var rerun=this._call_executer.bind(this);if(job.loaded){rerun.delay(0);return;}
job.load();var _timer=function(){if(job.imgtag.complete){$clear(_timer);job.loaded=true;job.valid=job._test_dimensions();if(job.valid){}
var jobdelay=job.jobdelay||100;rerun.delay(jobdelay);}else{if(job._decrement_timeout(50))$clear(_timer);}}.periodical(50);}});lib.Images.CreateThreadPool=function(){if(lib.Queue.THREADS<lib.Queue.MAX_THREADS){var new_threads=lib.Queue.MAX_THREADS-lib.Queue.THREADS;for(var t=0;t<new_threads;t++){new lib.Images.SlideImageJob(lib.Images.SlideDeckQueue);}}};lib.Images.Slide=new Class({Implements:[Events],Extends:lib.Images.CachedImage,initialize:function(slideid,slideurl,options){this.setOptions(options);if(slideurl.contains("http")){this.url=slideurl;}else{this.url=this.options.baseurl.rstrip('/')+'/'+slideurl.lstrip('/');}
this.parent(this.url,this.options);this.containerEl=$(this.options.containerEl);if(this.options.crossfade){var disableAnimation=this.options.bannedForAnimation.some(function(brow){return(brow==true);});if(disableAnimation)this.options.crossfade=false;}
this.visible=false;this.dimensions=this.options.dimensions;this._repr=this._create_placeholder();if(this.options.autoshow==true){this.show();}else{this.hide();}
if(this.containerEl){this._inject_placeholder();this.addEvent('onImgLoad',this._create_div_tag);}},options:{containerEl:'slide-container',dimensions:false,crossfade:true,bannedForAnimation:[Browser.Engine.trident4,Browser.Engine.presto],placeHolderClass:'slide-placeholder',slideClass:'slide',slideWrapperClass:'slide-wrapper',baseurl:'',preload:false,autoshow:false,encoded_url:true,onShow:$empty,onHide:$empty},priority_queue:function(queueidx,protected_job){this.jobpriority=queueidx;this.queue(protected_job);},queue:function(protected_job){lib.Images.CreateThreadPool.delay(10);if(this.jobpriority!=undefined){lib.Images.SlideDeckQueue.put_priority(this,this.jobpriority,protected_job);}else{lib.Images.SlideDeckQueue.put(this,protected_job);}},_inject_placeholder:function(){var lastpage=this.containerEl.getLast();if(lastpage){this._repr.injectAfter(lastpage);}else{this._repr.injectInside(this.containerEl);}},_create_placeholder:function(){var divtag=new Element('div');divtag.addClass(this.options.placeHolderClass);if(this.options.dimensions){divtag.setStyles({width:this.dimensions.x,height:this.dimensions.y});}
var _repr=divtag;return _repr;},_create_image_tag:function(){var imgtag=this.imgtag;imgtag.setStyles(this.options.tagStyles);if(!this.visible&&!this.options.autoshow){if(this.options.crossfade){this.imgtag.fade('hide');}else{this.imgtag.setStyle('display','none');}}else{this.visible=true;}
imgtag.addClass(this.options.slideClass);imgtag.replaces(this._repr);this._repr=imgtag;return this._repr;},_create_div_tag:function(){var imgtag=this.imgtag;var divtag=new Element('span',{'class':this.options.slideWrapperClass,'styles':{'background-image':'url('+imgtag.get('src')+')'}});if(!this.visible&&!this.options.autoshow){if(this.options.crossfade){divtag.fade('hide');}else{divtag.setStyle('display','none');}}else{this.visible=true;}
divtag.replaces(this._repr);this._repr=divtag;return this._repr;},getTag:function(){return this._repr;},remove:function(){this._repr.dispose();},_showfade:function(){this._repr.fade('in');},_hidefade:function(){function delayed(){this._repr.fade('out');};delayed.delay(50,this);},show:function(){if(!this.loaded)this.priority_queue(0,false);if(this.options.crossfade){this._showfade();}else{this._repr.setStyle('display','');}
this.visible=true;this.fireEvent('onShow',this);},hide:function(){if(this.options.crossfade){this._hidefade();}else{this._repr.setStyle('display','none');}
this.visible=false;this.fireEvent('onHide',this);}});lib.Images.SpiralLoader=new Class({initialize:function(slides,visible_idx){this.slides=slides;if($type(visible_idx)=='number'){visible_idx=[visible_idx];}
this._spiral(visible_idx);},_load_slides:function(slide_array){var slides=this.slides;slide_array.each(function(slide_idx,idx){var slide=slides[slide_idx];if(slide&&slide.queue){slide.queue();}});},_spiral:function(slides){var low_idx=0;var high_idx=this.slides.length-1;var lowest_slide=slides[0];var highest_slide=slides[slides.length-1];var before_left=lowest_slide;var after_left=high_idx-highest_slide;while((before_left>0)||(after_left>0)){if(after_left>0){slides.push(++highest_slide);after_left--;}
if(before_left>0){slides.push(--lowest_slide);before_left--;}}
this._load_slides(slides);}});lib.Images.SpiralCachedDeck=new Class({Extends:lib.Images.SlideDeck,initialize:function(slidedeck,options){this.parent(slidedeck,options);if(!this.slides)this.slides=this._get_slides();this._slide_loader();if(this.options.autoplay){this.autoplay=this.next.periodical(this.options.duration,this,[false]);}},options:{displayCallback:function(slide,slide_id){if(!this.slides)this.slides=this._get_slides();var keyIdx=this.deck.getKeyIndex(slide_id);this.visible_slide=this.slides[this.deck.getKeyIndex(this.visible)];if(this.visible_slide)this.visible_slide.hide();return this.slides[keyIdx].show();},autoplay:true,duration:5000},_handle_event:function(ev){this.parent(ev);if(ev)$clear(this.autoplay);},_get_slides:function(){var slides=[];this.deck.each(function(value,key,hash){var slide=new lib.Images.Slide(key,value,{preload:false,load_timeout:0});slides.push(slide);});return slides;},_slide_loader:function(){var visidx=this.deck.getKeyIndex(this.visible);if(!visidx)visidx=0;this.smartloader=new lib.Images.SpiralLoader(this.slides,visidx);}});lib.Images.ThumbnailControl=new Class({Implements:[Options,Events],initialize:function(options){this.setOptions(options);this.elMask=document.getElement(this.options.elMask);this.elContainer=document.getElement(this.options.elContainer);this.elThumbnails=$$(this.options.elThumbnails);if(!this.elMask||!this.elContainer||this.elThumbnails.length==0)return false;this.elNext=$(this.options.elNext);this.elBack=$(this.options.elBack);this.fx=new Fx.Scroll(this.elMask,{duration:500,transition:Fx.Transitions.Quad.easeInOut,wait:false});this.pages=Math.ceil(this.elThumbnails.length/this.options.thumbsPerPage);this.pageWidth=this.elMask.getSize().x;this.currentPage=0;this._bind_controls();this._bind_thumbnails();this._fade_thumbnails();this._enable_controls();},options:{onPage:$empty,thumbsPerPage:10,blurOpacity:0.5,focusOpacity:1.0,elMask:'div#visible_thumbs',elContainer:'div#all_thumbs',elThumbnails:'div#all_thumbs a.thumbnail',elBack:'back_thumbs',elNext:'next_thumbs'},_bind_controls:function(){if(this.elNext){var boundNext=this.next.bindWithEvent(this);this.elNext.addEvent('click',boundNext);}
if(this.elBack){var boundBack=this.back.bindWithEvent(this);this.elBack.addEvent('click',boundBack);}},_bind_thumbnails:function(){this.elThumbnails.each(function(el){var boundFocus=this._focus_thumbnail.bind(this,el);var boundBlur=this._blur_thumbnail.bind(this,el);el.addEvent('mouseenter',boundFocus);el.addEvent('mouseleave',boundBlur);}.bind(this));},_fade_thumbnails:function(){this.elThumbnails.each(function(el){el.getElement('img').set('opacity',this.options.blurOpacity);}.bind(this));},_focus_thumbnail:function(el){el.getElement('img').set('opacity',this.options.focusOpacity);},_blur_thumbnail:function(el){if(el==this.elSelected)return false;el.getElement('img').fade(this.options.blurOpacity);},_enable_controls:function(){if(this.currentPage==0&&this.pages>1){this.elBack.fade('out');this.elNext.fade('in');}else if(this.pages>1&&this.currentPage==this.pages-1){this.elBack.fade('in');this.elNext.fade('out');}else if(this.pages>2){this.elBack.fade('in');this.elNext.fade('in');}else{this.elBack.fade('out');this.elNext.fade('out');}},to_page:function(pageidx){var x_coord=pageidx*this.pageWidth;if(pageidx<0||pageidx>this.pages-1)return false;if(pageidx==this.currentPage)return false;this.currentPage=pageidx;this._enable_controls();this.fireEvent('page',this);return this.fx.start(x_coord,0);},to_thumbnail:function(thumbidx){if(thumbidx<0||thumbidx>this.elThumbnails.length-1)return false;var requestedPage=Math.floor(thumbidx/this.options.thumbsPerPage);return this.to_page(requestedPage);},first:function(ev){if(ev)ev.stop();return this.to_page(0);},last:function(ev){if(ev)ev.stop();return this.to_page(this.pages-1);},next:function(ev){if(ev)ev.stop();return this.to_page(this.currentPage+1);},back:function(ev){if(ev)ev.stop();return this.to_page(this.currentPage-1);}});