var ImageViewer=Class.create({initialize:function(links){this.options=Object.extend({langCaption:'',langPrevious:'',langNext:'',langPlay:'',langPause:'',langEnlarge:'',langClose:'',imgBlankSrc:'',imgMenuSrc:'',imgPlaySrc:'',imgPreviousSrc:'',imgNextSrc:'',imgEnlargeSrc:'',imgPauseSrc:'',imgCloseSrc:'',imgPlayHoverSrc:'',imgPreviousHoverSrc:'',imgNextHoverSrc:'',imgEnlargeHoverSrc:'',imgPauseHoverSrc:'',imgCloseHoverSrc:'',slideShowDuration:5},arguments[1]||{});this.links=links;this.currentIndex=0;this.maxWidth=document.viewport.getWidth()-60;this.maxHeight=document.viewport.getHeight()-60;this.isOpen=false;this.isPlaying=false;this.isOverMenu=false;this.currentImage=null;this.menuIsAppearing=false;this.createFrame();links.invoke('observe','click',this.open.bindAsEventListener(this));this.cacheBoundingFunctions();},open:function(evt){element=evt.findElement();if(element.nodeName.toLowerCase()=='a'){this.currentLink=element;}
else{this.currentLink=element.parentNode;}
this.links.each(function(link,index){if(this.currentLink==link){this.currentIndex=index;}}.bind(this));this.show(true);evt.stop();},show:function(startFromCurrentLink){var startFromCurrentLink=arguments[0]?arguments[0]:false;this.background.appear({duration:0.2,to:0.6});if(IS_IE6){$$('select').invoke('setStyle','visibility: hidden');}
if(startFromCurrentLink&&this.currentLink.down('img')&&!IS_IE6&&!IS_SAFARI_MOBILE){var left=this.currentLink.down('img').viewportOffset()['left'];var top=this.currentLink.down('img').viewportOffset()['top'];if(IS_OPERA){var topOffset=document.viewport.getScrollOffsets();top-=topOffset.top;}
this.currentImage=new Element('img',{'src':this.options.imgBlankSrc,'style':'left: '+left+'px; top: '+top+'px; width: '+this.currentLink.down('img').getWidth()+'px; height: '+this.currentLink.down('img').getHeight()+'px;'}).addClassName('imageViewerCurrentImage');}
else{var left=document.viewport.getWidth()/2-200;var top=document.viewport.getHeight()/2-100+(IS_IE6||IS_SAFARI_MOBILE?document.viewport.getScrollOffsets().top:0);this.currentImage=new Element('img',{'src':this.options.imgBlankSrc,'style':'left: '+left+'px; top: '+top+'px;'}).addClassName('imageViewerCurrentImage');}
$$('body')[0].insert(this.currentImage);this.isOpen=true;this.showMenu();this.writeInfoLine();this.registerEventHandlers();this.loadImage(this.currentLink.href);},close:function(evt){if(evt!=null&&evt.type=='keyup'&&evt.keyCode!=Event.KEY_ESC&&evt.keyCode!=Event.KEY_BACKSPACE){return;}
this.isOpen=false;this.unregisterEventHandlers();if(this.menuTimer){this.menuTimer.stop();}
this.menu.hide();this.currentImage.remove();if(this.isPlaying){this.play();}
this.resetButtons();this.background.fade({duration:0.2});if(IS_IE6){$$('select').invoke('setStyle','visibility: visible');}
evt.stop();},cacheBoundingFunctions:function(){this._changeWindow=this.changeWindow.bindAsEventListener(this);this._showMenu=this.showMenu.bindAsEventListener(this);this._close=this.close.bindAsEventListener(this);this._enlarge=this.enlarge.bindAsEventListener(this);this._hoverMenu=this.hoverMenu.bindAsEventListener(this);this._hoverCloseButton=this.hoverCloseButton.bindAsEventListener(this);this._hoverEnlargeButton=this.hoverEnlargeButton.bindAsEventListener(this);this._hoverPlayButton=this.hoverPlayButton.bindAsEventListener(this);this._hoverPreviousButton=this.hoverPreviousButton.bindAsEventListener(this);this._hoverNextButton=this.hoverNextButton.bindAsEventListener(this);this._previous=this.previous.bindAsEventListener(this);this._play=this.play.bindAsEventListener(this);this._next=this.next.bindAsEventListener(this);},registerEventHandlers:function(){Event.observe(window,'resize',this._changeWindow);document.observe('mousemove',this._showMenu);document.observe('keyup',this._close);this.menu.observe('mouseover',this._hoverMenu);this.menu.observe('mouseout',this._hoverMenu);this.closeButton.observe('click',this._close);this.closeButton.observe('mouseover',this._hoverCloseButton);this.closeButton.observe('mouseout',this._hoverCloseButton);this.enlargeButton.observe('click',this._enlarge);this.enlargeButton.observe('mouseover',this._hoverEnlargeButton);this.enlargeButton.observe('mouseout',this._hoverEnlargeButton);this.background.observe('click',this._close);if(this.links.length>1){document.observe('keyup',this._next);document.observe('keyup',this._previous);document.observe('keydown',this._play);this.previousButton.observe('click',this._previous);this.previousButton.observe('mouseover',this._hoverPreviousButton);this.previousButton.observe('mouseout',this._hoverPreviousButton);this.playButton.observe('click',this._play);this.playButton.observe('mouseover',this._hoverPlayButton);this.playButton.observe('mouseout',this._hoverPlayButton);this.nextButton.observe('click',this._next);this.nextButton.observe('mouseover',this._hoverNextButton);this.nextButton.observe('mouseout',this._hoverNextButton);this.currentImage.observe('click',this._next);}},unregisterEventHandlers:function(){Event.stopObserving(window,'resize',this._changeWindow);document.stopObserving('mousemove',this._showMenu);document.stopObserving('keyup',this._close);this.menu.stopObserving();this.closeButton.stopObserving();this.enlargeButton.stopObserving();this.background.stopObserving();if(this.links.length>1){document.stopObserving('keyup',this._next);document.stopObserving('keyup',this._previous);document.stopObserving('keydown',this._play);this.previousButton.stopObserving();this.playButton.stopObserving();this.nextButton.stopObserving();this.currentImage.stopObserving();}},enlarge:function(){location.href=this.currentLink.href;},loadImage:function(url){this.currentImage.addClassName('imageViewerLoading');this.newImage=new Image();this.newImage.onload=function(){this.exchangeImage();}.bindAsEventListener(this);this.newImage.onerror=function(){if(this.currentLink.down('img')){this.newImage.src=this.currentLink.down('img').src;}
else{this.newImage.src=this.options.imgCloseSrc;}
this.exchangeImage();}.bindAsEventListener(this);this.newImage.src=url;},writeInfoLine:function(){this.caption.update(eval(this.options.langCaption));},exchangeImage:function(){var size=this.calculateSize(this.newImage);var left=document.viewport.getWidth()/2-size['width']/2;var top=document.viewport.getHeight()/2-size['height']/2;if(IS_IE){this.caption.setStyle('top: '+(document.viewport.getScrollOffsets().top+5)+'px; width: '+$$('body')[0].getWidth()+'px;');}
new Effect.Morph(this.currentImage,{duration:0.5,style:'height: '+size['height']+'px; width: '+size['width']+'px; left: '+left+'px; top: '+(IS_IE6||IS_SAFARI_MOBILE?document.viewport.getScrollOffsets().top+top:top)+'px;',afterFinish:function(){this.currentImage.src=this.newImage.src;this.currentImage.removeClassName('imageViewerLoading');if(this.isPlaying)this.playingTimer=window.setTimeout(this.next.bind(this),this.options.slideShowDuration*1000);this.changeWindow();}.bind(this)});},calculateSize:function(image){if(image.width>this.maxWidth||image.height>this.maxHeight){if(this.maxWidth/image.width<this.maxHeight/image.height){width=this.maxWidth;height=Math.round(image.height*(width/image.width));}
else{height=this.maxHeight;width=Math.round(image.width*(height/image.height));}}
else{width=image.width;height=image.height;}
return{'width':width,'height':height};},createFrame:function(){this.background=new Element('div').addClassName('imageViewerBackground');if(IS_IE6||IS_SAFARI_MOBILE){this.background.setStyle('height: '+$$('body')[0].getHeight()+'px; width: '+$$('body')[0].getWidth()+'px;');}
this.background.hide();$$('body')[0].insert(this.background);this.caption=new Element('p').addClassName('imageViewerCaption');this.background.insert(this.caption);this.menu=new Element('div',{'style':'left: '+(document.viewport.getWidth()/2-200/2)+'px;'}).addClassName('imageViewerMenu');this.menu.hide();this.previousButton=new Element('img',{'id':'previousImage','src':this.options.imgPreviousSrc,'style':'margin: 0 10px; cursor: pointer','title':this.options.langPrevious});if(this.links.length==1){this.previousButton.setOpacity(0.2);this.previousButton.setStyle({cursor:'default'});this.previousButton.title='';}
this.menu.insert(this.previousButton);this.playButton=new Element('img',{'id':'playImage','src':this.options.imgPlaySrc,'style':'margin: 0 10px; cursor: pointer','title':this.options.langPlay});if(this.links.length==1){this.playButton.setOpacity(0.2);this.playButton.setStyle({cursor:'default'});this.playButton.title='';}
this.menu.insert(this.playButton);this.nextButton=new Element('img',{'id':'nextImage','src':this.options.imgNextSrc,'style':'margin: 0 10px; cursor: pointer','title':this.options.langNext});if(this.links.length==1){this.nextButton.setOpacity(0.2);this.nextButton.setStyle({cursor:'default'});this.nextButton.title='';}
this.menu.insert(this.nextButton);this.enlargeButton=new Element('img',{'id':'enlargeButton','src':this.options.imgEnlargeSrc,'style':'margin: 0 10px; cursor: pointer','title':this.options.langEnlarge});this.menu.insert(this.enlargeButton);this.closeButton=new Element('img',{'id':'closeImageViewer','src':this.options.imgCloseSrc,'style':'margin: 0 10px; cursor: pointer','title':this.options.langClose});this.menu.insert(this.closeButton);$$('body')[0].insert(this.menu);},resetButtons:function(){if(this.links.length>1){this.previousButton.src=this.options.imgPreviousSrc;this.playButton.src=this.options.imgPlaySrc;this.nextButton.src=this.options.imgNextSrc;}
this.enlargeButton.src=this.options.imgEnlargeSrc;this.closeButton.src=this.options.imgCloseSrc;},hoverMenu:function(evt){if(evt.type=='mouseover'){this.isOverMenu=true;}
else{this.isOverMenu=false;}},hoverCloseButton:function(evt){this.closeButton.src=evt.type=='mouseout'?this.options.imgCloseSrc:this.options.imgCloseHoverSrc;},hoverEnlargeButton:function(evt){this.enlargeButton.src=evt.type=='mouseout'?this.options.imgEnlargeSrc:this.options.imgEnlargeHoverSrc;},hoverPreviousButton:function(evt){this.previousButton.src=evt.type=='mouseout'?this.options.imgPreviousSrc:this.options.imgPreviousHoverSrc;},hoverNextButton:function(evt){this.nextButton.src=evt.type=='mouseout'?this.options.imgNextSrc:this.options.imgNextHoverSrc;},hoverPlayButton:function(evt){if(this.isPlaying){this.playButton.src=evt.type=='mouseout'?this.options.imgPauseSrc:this.options.imgPauseHoverSrc;}
else{this.playButton.src=evt.type=='mouseout'?this.options.imgPlaySrc:this.options.imgPlayHoverSrc;}},play:function(evt){if(evt!=null&&evt.type=='keydown'&&evt.keyCode!=32){return;}
if(this.isPlaying){window.clearTimeout(this.playingTimer);if(evt!=null&&evt.type=='keydown'){this.showMenu();setTimeout(function(){this.playButton.src=this.options.imgPauseHoverSrc;setTimeout(function(){this.playButton.src=this.options.imgPlayHoverSrc;setTimeout(function(){this.playButton.src=this.options.imgPlaySrc;}.bind(this),100);}.bind(this),100);}.bind(this),100);}
else{this.playButton.src=this.options.imgPlayHoverSrc;}
this.playButton.title=this.options.langPlay;this.isPlaying=false;}
else{this.playingTimer=window.setTimeout(this.next.bind(this),this.options.slideShowDuration*1000);if(evt!=null&&evt.type=='keydown'){this.showMenu();setTimeout(function(){this.playButton.src=this.options.imgPlayHoverSrc;setTimeout(function(){this.playButton.src=this.options.imgPauseHoverSrc;setTimeout(function(){this.playButton.src=this.options.imgPauseSrc;}.bind(this),100);}.bind(this),100);}.bind(this),100);}
else{if(this.isOverMenu){this.playButton.src=this.options.imgPauseHoverSrc;}
else{this.playButton.src=this.options.imgPauseSrc;}}
this.playButton.title=this.options.langPause;this.isPlaying=true;}
if(evt!=null&&evt.type=='keydown')evt.stop();},showMenu:function(){if(this.isOpen&&!this.menuIsAppearing){this.menu.appear({duration:0.1,to:0.6,beforeStart:function(){this.menuIsAppearing=true;}.bind(this),afterFinish:function(){this.menuIsAppearing=false;if(!this.isOpen){this.hideMenu();}}.bind(this)});if(this.menuTimer!=null){this.menuTimer.stop();}
if(!this.isOverMenu){this.menuTimer=new PeriodicalExecuter(this.hideMenu.bind(this),2);}}},hideMenu:function(){if(this.menu&&!IS_SAFARI_MOBILE){this.menu.fade({duration:0.1});}
if(this.menuTimer){this.menuTimer.stop();}},next:function(evt){if(evt!=null&&evt.type=='keyup'&&evt.keyCode!=Event.KEY_RIGHT){return;}
window.clearTimeout(this.playingTimer);if(evt!=null&&evt.type=='keyup'){this.showMenu();setTimeout(function(){this.nextButton.src=this.options.imgNextHoverSrc;setTimeout(function(){this.nextButton.src=this.options.imgNextSrc;}.bind(this),100);}.bind(this),100);}
this.currentImage.src=this.options.imgBlankSrc;if(this.currentIndex+1==this.links.size()){this.currentIndex=0;}
else{this.currentIndex++;}
this.currentLink=this.links[this.currentIndex];this.scrollToCurrentImage();this.writeInfoLine();this.loadImage(this.currentLink.href);},previous:function(evt){if(evt!=null&&evt.type=='keyup'&&evt.keyCode!=Event.KEY_LEFT){return;}
if(evt!=null&&evt.type=='keyup'){this.showMenu();setTimeout(function(){this.previousButton.src=this.options.imgPreviousHoverSrc;setTimeout(function(){this.previousButton.src=this.options.imgPreviousSrc;}.bind(this),100);}.bind(this),100);}
this.currentImage.src=this.options.imgBlankSrc;if(this.currentIndex==0){this.currentIndex=this.links.size()-1;}
else{this.currentIndex--;}
this.currentLink=this.links[this.currentIndex];this.scrollToCurrentImage();this.writeInfoLine();this.loadImage(this.currentLink.href);},scrollToCurrentImage:function(){var linkPos1=this.currentLink.cumulativeOffset()[1];var linkPos2=linkPos1+this.currentLink.getHeight();var viewportPos1=document.viewport.getScrollOffsets()[1];var viewportPos2=viewportPos1+document.viewport.getHeight();if(!IS_IE6&&!IS_SAFARI_MOBILE&&!(linkPos1>viewportPos1&&linkPos1<viewportPos2||linkPos2>viewportPos1&&linkPos2<viewportPos2)){this.currentLink.scrollTo();}},changeWindow:function(){this.maxWidth=document.viewport.getWidth()-60;this.maxHeight=document.viewport.getHeight()-60;var size=this.calculateSize(this.newImage);var left=document.viewport.getWidth()/2-size['width']/2;var top=document.viewport.getHeight()/2-size['height']/2+ +(IS_IE6||IS_SAFARI_MOBILE?document.viewport.getScrollOffsets().top:0);this.currentImage.setStyle('height: '+size['height']+'px; width: '+size['width']+'px; left: '+left+'px; top: '+top+'px;');this.menu.setStyle('left: '+(document.viewport.getWidth()/2-this.menu.getWidth()/2)+'px;');if(IS_SAFARI_MOBILE)this.menu.setStyle('top: '+(document.viewport.getScrollOffsets().top+document.viewport.getHeight()-this.menu.getHeight()-20)+'px;');}});
