/** 
  * @name: FD.gallery  
  * @package: Fairfax Digital Javascript Framework  
  * @version: 1.0  
  * @author: Dave Elkan  
  * @copyright: Copyright 2008. Fairfax Digital.  
  * * * * * * * * * * * * * * * * * * * * * * * * * *  
  *             DO NOT ALTER THIS FILE.  
  *                ---                   
  * If your requirements are not met by this widget  
  * or this widget does not work please ask  
  * Dave Elkan <delkan@fairfaxdigital.com.au>.  
  * This widget is designed to to be used across  
  * the Fairfax Digital Network and contains no   
  * site specific code.  
  * Altering this file will render it unsupportable.  
  * * * * * * * * * * * * * * * * * * * * * * * * * *   
  * Created: 2008-11-21T09:03:03+11:00   
  * Revision: 15   
  * * * * * * * * * * * * * * * * * * * * * * * * * *   
  **/ 
if(window['FD']){FD.Gallery=new Class({Implements:Options,options:{idScroll:"FDGThumbs",idMainImg:"mImg",idImgDesc:"mImgDesc",idSwitch:"FDGSwitch",idRotate:"rotate",idGallery:"gallery",idNav:"nav",classSelected:"selected",classPrev:"prev",classNext:"next",classPageNo:"page",classHidden:"hidden",classReset:"reset",rotateDur:1500,preload:true,galW:800,galH:600,dur:200,hotZone:50,hotZoneDelay:2000,coldZone:125,openPos:0,imgMThreshold:50,itemsAtOnce:6,adSwapCount:3,pageOf:"of",navElementType:"a"},navW:100,navH:115,imgC:0,imgPos:0,imgLoaded:[],navPos:0,navOn:true,navTrans:false,clickNo:0,rotating:false,disabled:false,mainMargins:[],initialize:function(options){this.setOptions(options);var gal=this.getGal();var nav=this.getNav();if(gal&&nav&&window['FDGalleryImages']){var gCds=gal.getCoordinates();this.galLeft=gCds.left;this.galTop=gCds.top;this.imgArr=FDGalleryImages;this.constructNav();this.autoAdjustMargin($(this.options.idMainImg),0);if(this.options.hotZone>0){nav.addEvent("mouseover",this.setNavOver.bind(this));this.appendMouseE.delay(this.options.hotZoneDelay,this,gal);this.closeDelay=this.closeNav.delay(this.options.hotZoneDelay,this)}else{nav.addEvent("click",this.toggleNav.bind(this))}gal.addEvent("click",this.moveBy.bindWithEvent(this,1));document.addEvent("keydown",this.doKeyPress.bindWithEvent(this));if(this.options.preload){var imageAssetObj={onProgress:this.setImgLoaded.bind(this)};Asset.images(FDGalleryImages,imageAssetObj);nav.addEvent("click",this.catchClick.bindWithEvent(this))}var reset=$$("."+this.options.classReset);for(var i=0,c=reset.length;i<c;i++){reset[i].addEvent("click",this.reset.bindWithEvent(this))}}},appendMouseE:function(gal){if(gal){gal.addEvent("mousemove",this.checkNav.bind(this))}},doKeyPress:function(e){if(!this.disabled){var key=e.key;var move=0;if(!e.control&&!e.shift&&!e.alt){if(key=="left"||key=="space"||key=="right"){if(key=="left"){move=-1}else if(key=="right"||key=="space"){move=1}this.moveBy(e,move)}else if(key=="esc"){this.closeNav()}}}},setNavOver:function(){if(this.closeDelay){$clear(this.closeDelay)}if(!this.navOver){this.navOver=true}},autoAdjustMargin:function(el,a){if(el){if(!a){var a=0}if(!this.mainMargins[a]){var mImgH=el.height;if(mImgH>100&&mImgH<this.options.galH){var mImgM=Math.round((this.options.galH-mImgH)/2);this.mainMargins[a]=mImgM}}if(this.mainMargins[a]){FD.log("Adusting margin for image "+el.src);el.setStyle("margin-top",this.mainMargins[a]+"px")}}},catchClick:function(e){new Event(e).stop()},setImgLoaded:function(i,x){var img=$("FDGalThumb_"+x);if(img){this.imgLoaded[x]=true;img.setStyle("opacity",1);img.removeClass("loading")}},openNav:function(){if(!this.navOn){if(!this.navTrans){var nav=this.getNav();var top=nav.getStyle("top").toInt();this.navTrans=true;var fxOpts={onComplete:this.navComplete.bind(this),duration:this.options.dur};var fx=new Fx.Morph(nav,fxOpts).start({top:[top,this.options.openPos]});this.transBuffer=""}else{this.transBuffer="open"}}},closeNav:function(){if(this.navOn){if(!this.navTrans){var nav=this.getNav();var top=nav.getStyle("top").toInt();this.navTrans=true;var fxOpts={onComplete:this.navComplete.bind(this),duration:this.options.dur};var to=this.navH*-1;if(this.options.openPos>0){to=this.navH+this.options.openPos}FD.log("Closing nav");var fx=new Fx.Morph(nav,fxOpts).start({top:[top,to]});this.transBuffer=""}else{this.transBuffer="close"}}},navComplete:function(){this.navTrans=false;var t=this.transBuffer;FD.log("Nav trans finished");if(t=="close"){this.closeNav()}else if(t=="open"){this.openNav()}else{var nav=this.getNav();var top=nav.getStyle("top").toInt();if(top==this.options.openPos){this.navOn=true;this.fireEvent("navOpen")}else{this.navOn=false;this.fireEvent("navClosed")}}},constructNav:function(){var scroller=this.getScroller();if(scroller){var scrollerProps=scroller.getCoordinates();this.navH=scrollerProps.height;var thumbs=scroller.getElements(this.options.navElementType);this.imgC=thumbs.length;for(var a=0,i=thumbs.length;a<i;a++){if(a==0){this.navW=thumbs[a].offsetWidth;if(this.options.startImg){if(thumbs[this.options.startImg]){thumbs[this.options.startImg].addClass(this.options.classSelected)}}else{thumbs[a].addClass(this.options.classSelected)}}thumbs[a].addEvent("click",this.swap.bindWithEvent(this,a));var img=thumbs[a].getElements("img")[0];img.id="FDGalThumb_"+a;if(img.offsetHeight<this.navH){var diff=Math.floor((this.navH-img.offsetHeight)/2);if(diff>1){img.setStyle("margin-top",diff+"px")}}}var nav=this.getNav();var nW=nav.getStyle("width").toInt();this.thumbsVisible=nW/this.navW;this.parseButtons();if(this.options.startImg){var sImg=this.options.startImg;if(sImg<=this.imgC){this.imgPos=this.options.startImg;this.moveNavToCurrentImage()}}var galSwitch=$(this.options.idSwitch);if(galSwitch){scroller.addEvent("click",this.toggleNav.bindWithEvent(this));galSwitch.addEvent("click",this.toggleNav.bindWithEvent(this))}}},toggleNav:function(e){if(e){new Event(e).stop()}var text="Show Thumbnails";if(!this.navOn){text="Hide Thumbnails";this.navOn=true;this.openNav()}else{this.navOn=false;this.closeNav()}var galSwitch=$(this.options.idSwitch);if(galSwitch){galSwitch.empty().innerHTML=text}},parseButtons:function(){var scrollPrev=$("scrollPrev");var scrollNext=$("scrollNext");if(scrollPrev){scrollPrev.addEvent("click",this.doMoveNavClick.bindWithEvent(this,(-1*this.options.itemsAtOnce)));scrollPrev.addClass(this.options.classHidden)}if(scrollNext){if(this.imgC<=this.options.itemsAtOnce){scrollNext.addClass(this.options.classHidden)}scrollNext.addEvent("click",this.doMoveNavClick.bindWithEvent(this,this.options.itemsAtOnce))}var moveLinks=$$(".move");for(var a=0,i=moveLinks.length;a<i;a++){var l=moveLinks[a];var dir=1;if(l.hasClass(this.options.classPrev)){dir=-1}l.addEvent("click",this.moveBy.bindWithEvent(this,dir))}this.initRotate()},initRotate:function(){var rotate=$(this.options.idRotate);if(rotate){rotate.addEvent("click",this.rotate.bindWithEvent(this))}},moveBy:function(e,i){if(e){new Event(e).stop()}else{var e=null}if(this.options.hotZone>0){if(e){this.closeNav()}}else if(this.navOn){this.toggleNav()}var pos=this.imgPos+i;if(pos==this.imgC){pos=0}else if(pos<0){pos=this.imgC-1}this.swap(e,pos);this.moveNavToCurrentImage()},reset:function(e){if(e){new Event(e).stop()}var move=-1*this.imgPos;this.moveBy(e,move)},rotate:function(e){if(e){new Event(e).stop()}var rotateSwitch=$(this.options.idRotate+"Switch");if(rotateSwitch){if(!this.rotating){this.rotating=true;this.rotateID=this.moveBy.periodical(this.options.rotateDur,this,[null,1]);rotateSwitch.addClass(this.options.classSelected)}else{$clear(this.rotateID);this.rotateID=false;this.rotating=false;rotateSwitch.removeClass(this.options.classSelected)}}},moveNavToCurrentImage:function(){var move=0;if((this.imgPos+1)>(this.thumbsVisible+this.navPos)||this.imgPos<this.navPos){if(this.imgPos+1>0){move=this.imgPos+1-this.navPos-Math.floor(this.thumbsVisible/2);this.moveNav(move)}}},checkNav:function(e){if(!e){this.closeNav();return}var scroll=document.getScroll().y;var pos=(e.client.y+scroll-this.galTop);if(!this.navTrans&&!this.disabled){if(this.options.openPos==0){if(!this.navOn&&pos<this.options.hotZone){this.openNav()}else if(this.navOn&&this.navOver&&pos>this.options.coldZone){this.closeNav()}}else{if(!this.navOn&&pos>this.options.openPos){this.openNav()}else if(this.navOn&&pos<this.options.openPos){this.closeNav()}}}},doMoveNavClick:function(e,i){if(e){new Event(e).stop();this.moveNav(i)}},moveNav:function(i){var pos=this.navPos+i;if(i>0){if((pos+this.thumbsVisible)>=this.imgC){pos=this.imgC-this.thumbsVisible}}else{if(pos<0){pos=0}}if(pos==(this.imgC-this.thumbsVisible)){$("scrollNext").addClass(this.options.classHidden)}else{$("scrollNext").removeClass(this.options.classHidden)}if(pos==0){$("scrollPrev").addClass(this.options.classHidden)}else{$("scrollPrev").removeClass(this.options.classHidden)}this.navPos=pos;var to=(pos*this.navW)*-1;var nav=this.getScroller();var from=nav.getStyle("left").toInt();if(from!=to&&to<this.options.galW){var fxOpts={duration:this.options.dur};var fx=new Fx.Morph(nav,fxOpts).start({left:[from,to]})}},swap:function(e,a){if(e){new Event(e).stop();if(this.rotateID){this.rotate()}}if(!isNaN(a)&&this.imgArr[a]){this.clickNo++;var gal=this.getGal();if(this.options.preload){if(this.imgLoaded[a]){gal.removeClass("loading")}else{gal.addClass("loading")}}this.setSelected(a);var desc=this.getImgDesc();if(desc){desc.empty().innerHTML=FDGalleryDesc[a]}var mImg=$('mImg');var nImg=new Element("img");nImg.src=this.imgArr[a];nImg.inject(mImg,'before');this.autoAdjustMargin(nImg,a);mImg.remove();Garbage.trash(mImg);nImg.id="mImg";this.setImageNumber(a);this.fireEvent("swap")}},setImageNumber:function(pageNo){var pages=$$('.'+this.options.classPageNo);var page=(pageNo+1)+" "+this.options.pageOf+" "+this.imgC;for(var i=0,c=pages.length;i<c;i++){pages[i].empty().innerHTML=page}},setSelected:function(i){if(!isNaN(i)){this.imgPos=i;var thumbs=$(this.options.idScroll).getElements("a");for(var a=0,g=thumbs.length;a<g;a++){if(a==i){thumbs[a].addClass(this.options.classSelected)}else{thumbs[a].removeClass(this.options.classSelected)}}}},getGal:function(){return $(this.options.idGallery)},getNav:function(){return $(this.options.idNav)},getScroller:function(){return $(this.options.idScroll)},getImgDesc:function(){if(window['FDGalleryDesc']){return $(this.options.idImgDesc)}}})}