//Script by Eirik Backer (http://www.klippoglim.no/ or http://www.kirie.no/)

var ScaleView=new Class({
	Implements:[Events,Options],
	options:{
		css:'scaler', //the css-class name you want as a base (default: scaler, scaler-nav, scaler-float, scaler-next, scaler-prev)
		current:'cur', //the classname to add to the current photo in the navigation-element
		footheight:150, //the pixelheight of space without the floating navitation at the bottom for menus
		operafix:true, //opera really want to scroll, but we don't. Be aware: this stops ALL scrolling with the wheel, also on other elements
		letterbox:false //Should vertical images be letterboxed with blank space on the sides? false makes them strech to fit window width,
	},
	initialize:function(options){
		var self=this.setOptions(options);
		this.el=document.getElement('.'+this.options.css+' img');
		this.needHelp=Browser.Engine.trident?(Browser.Engine.version<5||(document.documentMode||0)<8):Browser.Engine.webkit;
		this.links=$$('.'+this.options.css+'-nav a').addEvent('click',function(){self.goto(self.links.indexOf(this));return false});
		this.loads=$$(Array.combine([this.el.get('src')],this.links.get('href')).map(function(src){return $extend(new Image(),{src:src})}));

		if(this.links.length){
			this.float=new Element('a',{href:'javascript:void(0)','class':this.options.css+'-float'}).inject(document.body);
			this.offset=Hash.map(this.float.addEvent('click',function(e){self.goto(self.dir=='next')}).getSize(),function(v){return v/2});
			document.addEvents({
				mousemove:this.mouse.bind(this),
				keydown:function(e){if(e.code==37||e.code==39)self.goto(e.code==39)}
			});
		}
		this.goto(0);

		window.addEvents({
			keypress:function(e){if(e.code==32||e.code==39||e.code==40)return $type(e.target.value)=='string'},
			mousewheel:$lambda(!(Browser.Engine.presto&&this.options.operafix)),
			resize:this.scale.bind(this)
		});
	},
	set:function(s){
		if(this.el.src==(this.size=s).src&&this.el.retrieve('js'))return;
		this.el.store('js',this.el.style.width=this.el.style.height='auto');
		try{this.el.style.minWidth=this.el.style.minHeight='inherit'}catch(e){}
		if(!this.needHelp)this.el.setStyles((s.width>s.height||!this.options.letterbox)?{minWidth:'50%',minHeight:'50%'}:{height:'50%'});
		this.scale();this.el.set('src',this.size.get('src'));
	},
	scale:function(v){
		if(this.needHelp&&((v=window.getSize()).x!=this.x||v.y!=this.y||this.el.src!=this.size.src)){
			var s=this.size,width=Math.round(v.y*(s.width/s.height));this.x=v.x;this.y=v.y;
			if((s.width>s.height||!this.options.letterbox)&&v.x>width)width='50%';
			this.el.setStyle('width',width);
		}
	},
	goto:function(i){
		if($type(i)!='number')i=this.loads.get('src').indexOf(this.el.get('src'))+(i?1:-1);
		var i=this.loads.length==i?0:(i<0?this.loads.length-1:i),self=this;
		$$(this.links.removeClass(this.options.current)[i]).addClass(this.options.current);
		if(i=this.loads[i])i.complete?this.set(i):(i.onload=function(){self.set(i)});
	},
	mouse:function(e,dir){
		if((document.body.clientHeight-e.client.y)>this.options.footheight){
			this.float.style.left=e.client.x-this.offset.x+'px';
			this.float.style.top=e.client.y-this.offset.y+'px';
			dir=e.client.x<(document.body.clientWidth/2)?'prev':'next';
		}
		if(this.dir!=dir){
			this.float.style.display=dir?'block':'none';
			if(this.dir=dir)this.float.className=this.options.css+'-float '+this.options.css+'-'+dir;
		}
	}
});

window.addEvent('domready',function(){new ScaleView()});
