var rotateImages = {
	init : function(contextPath, imageTemplate, range, targets) {
		
		var imgTemplate	= new Template(imageTemplate);
		rotateImages.targets	= targets
		rotateImages.images		= new Array();
		range.each( function(index) {
			var anImg = new Image();
			anImg.src = contextPath + imgTemplate.evaluate({index: index});
			rotateImages.images.push(anImg)
		});
		rotateImages.nextIndex	= rotateImages.targets.length;
		rotateImages.currRound	= 0; 
	},
	ready : function() {
		var ready = true;
		rotateImages.images.each(function(image) {
			ready &= image.complete;
		});
		return ready;
	},
	rotate : function() {
		if(rotateImages.ready()) {
			rotateImages.currRound = (++rotateImages.currRound) % 2;
			new Effect.Fade(rotateImages.targets[rotateImages.currRound], {afterFinish: function() {
				rotateImages.targets[rotateImages.currRound].src = rotateImages.images[rotateImages.nextIndex].src;
				new Effect.Appear(rotateImages.targets[rotateImages.currRound]);
				rotateImages.nextIndex++;
				rotateImages.nextIndex = (rotateImages.nextIndex >= rotateImages.images.length) ? 0 : rotateImages.nextIndex; 
				rotateImages.rotate.delay(2);
			}});
		} else {
			rotateImages.rotate.delay(2);
		}
	}
};

function appearCells(selector) {
	var counter = 0;
	$$(selector).each(function(cell) {
		cell.appear.bindAsEventListener(cell).delay(counter * 0.25);
		counter++;
	});
	ProjectsListManager.init.delay(counter * 0.25, selector);
}

String.prototype.evalValue = function() {
	return parseInt(this.replace(/px/gi, ""));
}

var ProjectsListManager = {
	currentSelectedCell : null,
	previousSelectedCell : null,
	options : {
		frequency 	: 0.032,
		reduceBy	:  8,
		moveBy		: 60,
		
		nbCols		: 4,
		nbRows		: 3,
		
		hfactor 	: 3,
		wfactor		: 4
	},
	
	init : function(selector) {
		ProjectsListManager.cells = $$(selector); 
		ProjectsListManager.computeConstants();
		ProjectsListManager.prepareCells();
		ProjectsListManager.bindEvents();
		ProjectsListManager.tick.delay(ProjectsListManager.options.frequency);
		if(document.location.hash.length > 0) {
			var tmp = document.location.hash.replace(/#/g, "");
			if($(tmp)) {
				ProjectsListManager.handleCellClick.bindAsEventListener($(tmp))();
			} else {
				tmp = $$("." + tmp);
				if(tmp.length > 0) {
					ProjectsListManager.handleCellClick.bindAsEventListener(tmp.first())();
				}
			}
		}
	},
	
	prepareCells : function() {
		var counter = 0;
		ProjectsListManager.cells.each( function(cell) {
			cell.colIndex = counter % ProjectsListManager.options.nbCols;
			cell.rowIndex = (counter / ProjectsListManager.options.nbCols).floor();
			counter++;
		});
		
		ProjectsListManager.computeTargetPositions(ProjectsListManager.cells);
	},
	
	tick : function() {
		var globalW 		= null;
		var globalH 		= null;
		var growingNextW	= null;
		var growingNextH	= null;
		var aCell = ProjectsListManager.cells.first();
		if( aCell.targetWidth != aCell.getStyle("width").evalValue() 
		    || aCell.targetHeight != aCell.getStyle("height").evalValue() ) {
			ProjectsListManager.cells.each(function(cell) {
				if(ProjectsListManager.previousSelectedCell != null) {
					if(cell != ProjectsListManager.previousSelectedCell) {
						if(! (globalW && globalH && growingNextW && growingNextH)) {
							globalW = ProjectsListManager.getNextLinearValue(cell.targetWidth, cell.getStyle("width").evalValue(), ProjectsListManager.options.moveBy / ProjectsListManager.options.hfactor);
							globalH = ProjectsListManager.getNextLinearValue(cell.targetHeight, cell.getStyle("height").evalValue(), ProjectsListManager.options.moveBy / ProjectsListManager.options.wfactor);
							growingNextW = ProjectsListManager.options.nbCols * ProjectsListManager.standardWidth - ((ProjectsListManager.options.nbCols - 1) * globalW);
							growingNextH = ProjectsListManager.options.nbRows * ProjectsListManager.standardHeight - ((ProjectsListManager.options.nbRows - 1) * globalH);
						}
						cell.setStyle( {
							width: globalW + "px", 
							height:  globalH + "px" ,
							marginLeft: ((cell.targetMarginLeft != cell.getStyle("margin-left").evalValue()) ? (ProjectsListManager.standardMarginL + growingNextW - globalW) : cell.getStyle("margin-left").evalValue()) + "px",
							marginTop: ((cell.targetMarginTop != cell.getStyle("margin-top").evalValue()) ? (growingNextH - globalH) : cell.getStyle("margin-top").evalValue()) + "px"
						} );
					}
				} else {
					if(cell != ProjectsListManager.currentSelectedCell)  {
						if(! (globalW && globalH && growingNextW && growingNextH)) {
							globalW = ProjectsListManager.getNextSlowingValue(cell.targetWidth, cell.getStyle("width").evalValue(), ProjectsListManager.options.moveBy / ProjectsListManager.options.hfactor, ProjectsListManager.standardWidth);
							globalH = ProjectsListManager.getNextSlowingValue(cell.targetHeight, cell.getStyle("height").evalValue(), ProjectsListManager.options.moveBy / ProjectsListManager.options.wfactor, ProjectsListManager.standardHeight);
							growingNextW = ProjectsListManager.options.nbCols * ProjectsListManager.standardWidth - ((ProjectsListManager.options.nbCols - 1) * globalW);
							growingNextH = ProjectsListManager.options.nbRows * ProjectsListManager.standardHeight - ((ProjectsListManager.options.nbRows - 1) * globalH);
						}
						cell.setStyle( {
							width: globalW + "px", 
							height:  globalH + "px" ,
							marginLeft: ((cell.targetMarginLeft != cell.getStyle("margin-left").evalValue()) ? (ProjectsListManager.standardMarginL + growingNextW - globalW) : cell.getStyle("margin-left").evalValue()) + "px",
							marginTop: ((cell.targetMarginTop != cell.getStyle("margin-top").evalValue()) ? (growingNextH - globalH) : cell.getStyle("margin-top").evalValue()) + "px"
						} );					
					}
				}
			});
			if(ProjectsListManager.currentSelectedCell && ! ProjectsListManager.previousSelectedCell) {
				ProjectsListManager.currentSelectedCell.setStyle({
					width: growingNextW + "px", 
					height: growingNextH + "px" });
			}
			if(ProjectsListManager.previousSelectedCell) {
				ProjectsListManager.previousSelectedCell.setStyle({
					width: growingNextW + "px", 
					height: growingNextH + "px" });
			}
		} else {
			if(ProjectsListManager.previousSelectedCell != null) {
				ProjectsListManager.previousSelectedCell = null;
				ProjectsListManager.computeTargetPositions(ProjectsListManager.cells);
			}
		}
		ProjectsListManager.tick.delay(ProjectsListManager.options.frequency);
	},
	
	bindEvents : function() {
		ProjectsListManager.cells.each(function(cell) {
			var prjcts = cell.select(".blocItem"); 
			if(prjcts.length > 0) {
				var project =prjcts.first();
				project.observe("click", ProjectsListManager.handleCellClick.bindAsEventListener(cell));
			}
		});
	},

	getTargetLeft : function(cell) {
		if( ProjectsListManager.currentSelectedCell ) {
			return cell
		}
	},
	
	checkForProjectLoad : function() {
	      var _ajaxhref = ProjectsListManager.currentSelectedCell.down("a");
	      pageTracker._trackPageview(ProjectsListManager.currentSelectedCell.down("a").href);

		if(ProjectsListManager.currentSelectedCell.select(".details").length == 0) {
			var pid = ProjectsListManager.currentSelectedCell.select(".blocItem").first().identify().replace(/project_/gi,"");
			new Ajax.Updater(ProjectsListManager.currentSelectedCell,
					"front/coline-design/templates/_objects/project/components/project-details.jspz", {
					method: "get",
					insertion: Insertion.Bottom,
					parameters: {projectID: pid},
					evalScripts: true,
					onComplete : function() {
						ProjectsListManager.currentSelectedCell.select(".wait").invoke("remove");
					}
			});
		}
	},
	
	handleCellClick : function(e) {
		if(e) {
			e.stop();
		}
		$$(".moreElements").invoke("hide");
		if(this == ProjectsListManager.currentSelectedCell) {
			ProjectsListManager.currentSelectedCell = null;
			if(e) {
				document.location.hash = "#";
			}
			ProjectsListManager.previousSelectedCell = this;
		} else if(ProjectsListManager.currentSelectedCell != null) {
			ProjectsListManager.previousSelectedCell = ProjectsListManager.currentSelectedCell;
			ProjectsListManager.currentSelectedCell = this;
			if(e) {
				document.location.hash = "#" + this.identify();
			}
		} else {
			ProjectsListManager.currentSelectedCell = this;
			ProjectsListManager.previousSelectedCell = null;
			if(e) {
				document.location.hash = "#" + this.identify();
			}
		}
		if(ProjectsListManager.currentSelectedCell != null) {
			ProjectsListManager.checkForProjectLoad();
		}
		ProjectsListManager.computeTargetPositions(ProjectsListManager.cells);
	},
	
	computeConstants : function() {
		var aCell = ProjectsListManager.cells.last();
		ProjectsListManager.standardWidth 	= aCell.getWidth();
		ProjectsListManager.standardHeight 	= aCell.getHeight();
		ProjectsListManager.standardMarginL	= aCell.getStyle("margin-left").evalValue();
		ProjectsListManager.standardMarginT	= aCell.getStyle("margin-top").evalValue();
		
		ProjectsListManager.miniWidth		= Math.round(ProjectsListManager.standardWidth / ProjectsListManager.options.reduceBy);
		ProjectsListManager.miniHeight		= Math.round(ProjectsListManager.standardHeight / ProjectsListManager.options.reduceBy);
		ProjectsListManager.bigWidth		= (ProjectsListManager.standardWidth * ProjectsListManager.options.nbCols) - (ProjectsListManager.miniWidth * (ProjectsListManager.options.nbCols - 1));
		ProjectsListManager.bigHeight		= (ProjectsListManager.standardHeight * ProjectsListManager.options.nbRows) - (ProjectsListManager.miniHeight * (ProjectsListManager.options.nbRows - 1));
	},
	
	getNextLinearValue : function(target, current, step) {
		var factor = (target > current) ? 1 : -1 ;
		var diff =  (target - current).abs().floor();
		return current + factor * Math.min(diff, step);
	},
	
	getNextSlowingValue : function(target, current, step, initial) {
		var done 	= initial - current;
		var toDo	= initial - target;
		var ratio	= done / toDo;
		var move 	= Math.max(1,Math.round(step * Math.cos((ratio * Math.PI) / 2)));
		if((current - move) < target) {
			return target;
		} else {
			return current - move;	
		}
	},
	
	computeTargetPositions : function(elements) {
		elements.each(function(element) {
			if( ProjectsListManager.currentSelectedCell != null && ProjectsListManager.previousSelectedCell == null) {
				var selectedCellColIndex = ProjectsListManager.currentSelectedCell.colIndex;
				if(element == ProjectsListManager.currentSelectedCell) {
					element.targetWidth 	= ProjectsListManager.bigWidth;
					element.targetHeight 	= ProjectsListManager.bigHeight;
					element.targetMarginTop	= 0;
					if(! element.hasClassName("first")) {
						element.targetMarginLeft = ProjectsListManager.standardMarginL;
					} else {
						element.targetMarginLeft = 0;
					}
				} else {
					element.targetWidth = ProjectsListManager.miniWidth;
					element.targetHeight = ProjectsListManager.miniHeight;
					if(! element.hasClassName("first")) {
						if(ProjectsListManager.currentSelectedCell.rowIndex != element.rowIndex 
						   && ProjectsListManager.currentSelectedCell.colIndex == 0 
						   && element.colIndex - 1 == ProjectsListManager.currentSelectedCell.colIndex) {
							element.targetMarginLeft = ProjectsListManager.standardMarginL + ProjectsListManager.bigWidth - ProjectsListManager.miniWidth;
						} else if(element.colIndex == ProjectsListManager.currentSelectedCell.colIndex) {
							element.targetMarginLeft = ProjectsListManager.standardMarginL + ProjectsListManager.bigWidth - ProjectsListManager.miniWidth;
						} else {
							element.targetMarginLeft = ProjectsListManager.standardMarginL;
						}
					} else {
						element.targetMarginLeft = 0;
					}
					if(ProjectsListManager.currentSelectedCell.rowIndex == ProjectsListManager.options.nbRows - 1 && element.rowIndex == ProjectsListManager.currentSelectedCell.rowIndex) {
						element.targetMarginTop	=  ProjectsListManager.bigHeight - ProjectsListManager.miniHeight;
					} else {
						element.targetMarginTop	= 0;
					}
				}
			} else {
				element.targetWidth		= ProjectsListManager.standardWidth;
				element.targetHeight 	= ProjectsListManager.standardHeight;
				element.targetMarginTop	= 0;
				if(! element.hasClassName("first")) {
					element.targetMarginLeft = ProjectsListManager.standardMarginL;
				} else {
					element.targetMarginLeft = 0;
				}
			}
		});
	}
}



