(function(){
	Array.implement({
		'shuffle': function(){
			for(var v=this.slice(0), j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
			return v;
		}
	});

	var animate = function(){};

	var events = ['imageLoad', 'layout'];
	var eventReady = function(event){
		events.erase(event);
		if(events.length == 0){
			animate();
		}
	};

	var bgImage = document.id(new Image()).addEvent('load', function(){
		eventReady('imageLoad');
	}).set('src', 'http://www.heinzschweizer.at.host1.sevenspire.net/assets/templates/current/img/element/bg_main.jpg');

	window.addEvent('domready', function(){
		var master = document.id('master-of-all');
		if(!document.getElement('.gallery-grid')){
			return;
		}
		master.fade('hide');
		var menu = document.getElement('.menu').fade('hide');
		var footer = document.getElement('div.footer').fade('hide');
		var footer_text = document.getElements('.footer p').fade('hide');


		var ptWidth = 170;
		var ptHeight = 120;
		var maxBig = 3;
		var gridWidth = 6;
		var gridHeight = 4;
		var itemsCount = document.getElements('.gallery-grid li').slice(0,gridWidth * gridHeight).length;
		var midPoint = [gridWidth/2, gridHeight/2];

		var initGrid = function(w, h){
			var grid = [];
			(w).times(function(){
				grid.push(new Array(h));
			});
			return grid;
		};

		var initItems = function(maxBig){
			var els = document.getElements('.gallery-grid li').slice(0,gridWidth * gridHeight).shuffle();
			var items = [];
			var count = els.length;
			var bigs = ((count/3).toInt() < maxBig && (count/3).toInt() >= 0 ? (count/3).toInt() : maxBig);
			els.each(function(item){
				if(0 < bigs--){
					items.push({el: item, width: 2, height: 2});
				}
				else{
					items.push({el: item, width: 1, height: 1});
				}
			});
			return items;
		};

		var calcDistances = function(gridWidth, gridHeight, calcPt){
			var dists = [];
			for(var x=0;x<gridWidth;x++){
				for(var y=0;y<gridHeight;y++){
					dists.push({
						'dist': Math.sqrt(Math.pow((x + 0.5) - calcPt[0], 2) + Math.pow((y + 0.5) - calcPt[1], 2)),
						'pt': [x, y]
					});
				}
			}
			return dists.sort(function(a, b){
				return a.dist - b.dist;
			});
		};

		var placeItems = function(items, gridWidth, gridHeight, dists){
			var grid = initGrid(gridWidth, gridHeight);
			var checkSpace = function(grid, item, pos){
				var check = function(startPos, width, height){
					for(var i=0;i<width;i++){
						for(var j=0;j<height;j++){
							var pos=[startPos[0]+i,startPos[1]+j];
							if(pos[0]<0 || pos[1]<0 || pos[0]>=grid.length || pos[1]>=grid[0].length || grid[pos[0]][pos[1]]){
								return false;
							}
						}
					}
					return true;
				};
				var dirs=[[0,0], [-item.width,0],[0,-item.height],[-item.width,-item.height]];
				for(var i=0;i<dirs.length;i++){
					if(check([pos[0]+dirs[i][0],pos[1]+dirs[i][1]], item.width, item.height)){
						return [pos[0]+dirs[i][0],pos[1]+dirs[i][1]];
					}
				}
				return false;
			};

			var placedItems = [];
			var placeable = false;
			for(var k=0; k<items.length; k++){
				placeable = false;
				for(var i=0; i<dists.length; i++){
					var startPt = checkSpace(grid, items[k], dists[i].pt);
					if(startPt !== false){
						placedItems.push({pt: startPt, item: items[k]});
						for(var x=startPt[0];x<items[k].width+startPt[0];x++){
							for(var y=startPt[1];y<items[k].height+startPt[1];grid[x][y++]=1);
						}
						//dists.splice(i,1);
						placeable = true;
						break;
					}
				}
				if(!placeable){
					return false;
				}
			}
			return placedItems;
		};

		var items = initItems(maxBig);
		var dists = calcDistances(gridWidth, gridHeight, midPoint);
		var renderObj = placeItems(items.shuffle(), gridWidth, gridHeight, dists);
		var trys = 0;
		while(renderObj === false){
			while(renderObj === false && trys<3){
				renderObj = placeItems(items.shuffle(), gridWidth, gridHeight, dists);
				trys++;
			}
			if(renderObj === false){
				trys = 0;
				items = initItems(itemsCount, --maxBig);
			}
		}

		document.getElement('.gallery-grid').setStyles({
			'width': ptWidth * gridWidth,
			'height': ptHeight * gridHeight,
			'position': 'relative'
		});
		renderObj.each(function(obj, i){
			obj.item.el.getElement('img').setStyles({
				'height': (obj.item.height * ptHeight) - 1,
				'width': (obj.item.width * ptWidth) - 1
			});
			obj.item.el.setStyles({
				'position': 'absolute',
				'left': obj.pt[0] * ptWidth,
				'top': obj.pt[1] * ptHeight,
				'height': obj.item.height * ptHeight,
				'width': obj.item.width * ptWidth
			}).fade('hide');
		});

		animate = function(){
			bgImage.addClass('big-gallery-img').fade('hide').inject(master, 'top');
			master.set('tween', {
				'duration': 1000,
				'onComplete': function(){
					bgImage.set('tween', {
						'duration': 1000,
						'onComplete': function(){
							menu.set('tween', {
								'duration': 500,
								'onComplete': function(){
									//var delay = (5000 / renderObj.length).toInt();
									var delay = 800;
									renderObj.each(function(obj, i){
										obj.item.el.fade.delay(delay * (i+1), obj.item.el, [1]);
									});
								}
							}).fade(1);
							footer_text.set('tween', {'duration': 500}).fade(1);
						}
					}).fade(1);
				}
			}).fade.delay(1000, master, [1]);
			footer.set('tween', {'duration': 1000}).fade.delay(1000, footer, [1]);
		};
		eventReady('layout');
	});
})();