var body = $(document.body);

var Vector2 = new Class({
	
	isVector2: true,
	
	initialize: function(options) {
		this.x = options.x || 0;
		this.y = options.y || 0;
	},
	
	normalize: function() {
		var x = this.x, y = this.y;
		var length = Math.sqrt(x * x + y * y);
		this.x = x / length;
		this.y = y / length;
	},
	
	getLength: function() {
		var x = this.x, y = this.y;
		return Math.sqrt(x * x + y * y);
	}
	
});

var Lensflare = new Class({
	
	isLensflare: true,
	
	initialize: function(options) {
		var flares = this.flares = [
			{
				src : "Lensflare/flare.png",
				distance : 50
			},
			{
				src : "Lensflare/smallest-light.png",
				distance : 200,
				zIndex : 1
			},
			{
				src : "Lensflare/smaller-light.png",
				distance : 280,
				zIndex : 1
			},
			{
				src : "Lensflare/smaller-light.png",
				distance : 300,
				zIndex : 1
			},
			{
				src : "Lensflare/smallest-light.png",
				distance : 350,
				zIndex : 1
			},
			{
				src : "Lensflare/big-yellow.png",
				distance : 480
			},
			{
				src : "Lensflare/big-orange.png",
				distance : 490
			},
			{
				src : "Lensflare/smaller-light.png",
				distance : 500
			},
			{
				src : "Lensflare/med-light.png",
				distance : 650,
				zIndex : 1
			},
			{
				src : "Lensflare/med-teal.png",
				distance : 680
			},
			{
				src : "Lensflare/big-orange.png",
				distance : 800
			},
			{
				src : "Lensflare/big-yellow.png",
				distance : 830
			},
			{
				src : "Lensflare/med-blue.png",
				distance : 850
			},
			{
				src : "Lensflare/small-green.png",
				distance : 1090
			},
			{
				src : "Lensflare/small-light.png",
				distance : 1120,
				zIndex : 1
			},
			{
				src : "Lensflare/smaller-light.png",
				distance : 1260,
				zIndex : 1
			}
		];
		for (var i = 0, l = flares.length; i < l; ++i) {
			var flare = flares[i];
			
			var element = new Element("img");
			element.setStyle('visibility', "hidden")
			element.onload = (function() {
				this.setStyles({
					position: "absolute",
					marginLeft: -this.width / 2 + "px",
					marginTop: -this.height / 2 + "px",
					zIndex: 420 + (flare.zIndex || 0)
				});
			}).bind(element);
			element.src = flare.src;
			body.appendChild(element);
			
			flare.element = element;
		}
		
		document.addEvent("mousemove", this._onMousemove = this.onMousemove.bindWithEvent(this));
	},
	
	onMousemove: function(event) {
		var flares = this.flares;
		
		var pageSize = body.getSize();
		var radius = (new Vector2(pageSize)).getLength();
		var pointer = new Vector2({x: event.client.x - (pageSize.x / 2 - 350), y: event.client.y});
		var length = pointer.getLength();
		pointer.normalize();
		
		for (var i = 0, l = flares.length; i < l; ++i) {
			var flare = flares[i];
			var element = flare.element;
			
			var flareX = 2 * pointer.x * flare.distance * (length / radius) + (pageSize.x / 2 - 350);
			var flareY = 2 * pointer.y * flare.distance * (length / radius);
			
			element.setStyles({
				position: "absolute",
				left: flareX|0 + "px",
				visibility: "visible",
				top: flareY|0 + "px"
			});
		}
	}
	
});

var Slideshow = new Class({
	
	isSlideshow: true,
	
	initialize: function(options) {
		this.slides = options.slides;
		this.index = this.slides.length - 1;
		
		this.slides.each(function(slide) {
			slide.setStyles({
				opacity: 0.00,
				visibility: "visible"
			});
			slide.set('tween', {
				duration : 2000
			});
		}, this);
		
		window.addEvent("keydown", (function(event) {
			if (event.key == "left") {
				this.previous();
			} else if (event.key == "right") {
				this.next();
			}
		}).bindWithEvent(this));
		
		this.next();
	},
	
	next: function() {
		var slides = this.slides,
			last = this.last,
			index = this.index;
		
		if (this.nextTimer) {
			clearTimeout(this.nextTimer);
			this.nextTimer = null;
		}
		
		if (last != null) {
			slides[last].setStyle('opacity', 0.00);
		}
		
		slides[index].setStyle('zIndex', 0);
		
		this.last = index;
		this.index = (index + 1) % slides.length;
		
		var slide = slides[this.index];
		
		slide.tween('opacity', slide.get('opacity'), 1.00);
		slide.setStyle('zIndex', 1);
		
		this.nextTimer = this.next.delay(5000, this);
	},
	
	previous: function() {
		var slides = this.slides,
			last = this.last,
			index = this.index;
		
		if (this.nextTimer) {
			clearTimeout(this.nextTimer);
			this.nextTimer = null;
		}
		
		if (last != null) {
			slides[last].setStyle('opacity', 0.00);
		}
		
		slides[index].setStyle('zIndex', 0);
		
		this.last = index;
		this.index = (slides.length + index - 1) % slides.length;
		
		var slide = slides[this.index];
		
		slide.tween('opacity', slide.get('opacity'), 1.00);
		slide.setStyle('zIndex', 1);
		
		this.nextTimer = this.next.delay(5000, this);
	}
	
});

document.onselectstart = document.ondragstart = document.oncontextmenu = function() { return false; };

var slides = $$(".slide");
if (slides.length > 0) {
	new Slideshow({
		slides: slides
	});
}

document.addEvent("keydown", function (event) {
	if (event.key == "f" && ! window.lensflare) {
		window.lensflare = new Lensflare({});
	}
});

	