﻿	var WARNING_NB_ELEMENTS = 25;
	var DEFAULT_NB_INPUT_TEXT = "Number of elements";
	var MIN_TIME = 200;
	var MAX_TIME = 3000;
		
	var state = true;
	var nbBaby = 0;
	var opacity = true;
	var bgColor = COLORS[0];
	var options = new Array();
	
	
	$(document).ready(init);

	function init(){
		loadParams();				
		bgColor = randColor();
		$("#changeState").click(changeState);
		$("#newBaby").click(newBaby);
		$("#backgroundColor").click(backgroundColor);
		$("#killBaby").click(killBaby);
		$("#killAll").click(killAll);
		$("#changeOpacity").click(changeOpacity);
		$("#fadeState").click(fadeState);
		$("#toggleOptions").click(toggleOptions);
		$("#nbElem").val(DEFAULT_NB_INPUT_TEXT);
		inputNbElems();
		$("html").keyup(keyup);
		var bw = Math.round(100/$("#header input").length);
		$("#header input.btn").width((bw-3)+'%');
		$("#header input").hover(displayTooltip,hideTooltip);
		time = randInt(200,5000);
	}

	function inputNbElems(){
		$("#nbElem").focus(function(){
			if(isNaN($(this).val())){
				$(this).val('');
				$(this).focus();
			}
			$(this).removeClass("noset");
		});
		$("#nbElem").blur(function(){
			if(isNaN($(this).val()) || jQuery.trim($(this).val()) == ''){
				$(this).addClass("noset");
				$(this).val(DEFAULT_NB_INPUT_TEXT);
			}
		});
		$("#nbElem").keyup(function(e){
			if(e.keyCode==13){
				if($(this).val()<1) $(this).val(1);
				var nb = $(this).val();
				if(nb > WARNING_NB_ELEMENTS){
					if(confirm("The website will create a lot of elements ("+nb+", recomended max. : "+WARNING_NB_ELEMENTS+"), this might slow your computer, are you sure to continue ?")){
						for(var i=1;i<=nb;i++) newBaby();
					}
				}else{
					saveParams($(this).val());
					killAll();
					for(var i=1;i<=nb;i++) newBaby();
				}						
				return false;
			}
		});
	}

	function changeState(){				
		state = !state;
		if(!state){					
			$(".elem").stop();
			$(".elem").dequeue();
			$("#changeState").val("Continue");			
			$("#fadeState").val("Continue");			
		}else{
			$("#changeState").val("Stop");					
			$("#fadeState").val("Fading stop");					
			changeElems();					
		}				
	}

	function fadeState(){
		state = !state;
		if(state){
			$("#fadeState").val("Fading stop");					
			changeElems();					
		}else{
			$("#fadeState").val("Continue");	
			$("#changeState").val("Continue");	
		}
	}

	function changeOpacity(){				
		if(opacity){					
			$("#changeOpacity").val("Enable opacity");
		}else{					
			$("#changeOpacity").val("Disable opacity");
		}
		opacity = !opacity;
	}

	function applyListener(){
		$(".elem").click(killBaby);
		$("#options input").click(setOption);
	}

	function keyup(e){	
		switch(e.keyCode){
			case 17 : toggleHeader(); return false; // crtl (toggle header)
			case 18 : toggleOptions(); return false; // ALT (toggle options)
			case 83 : changeState(); return false; // s (stop)
			case 70 : fadeState(); return false; // f (fade stop)
			case 79 : changeOpacity(); return false; // o (opacity stop)
			case 13 : backgroundColor(); return false; // enter (background color)
			case 32 : case 107 : newBaby(); return false; // space and + (new elem)
			case 46 : case 109 : killBaby(); return false; // delete and - (kill elem)
			case 27 : killAll(); return false; // escape (kill all)
		}
	}

	function newBaby(){
		var color = randColor();
		var w = randInt(20,600);
		var h = randInt(20,600);
		var x = randInt(0,$("#content").width()-w);
		var y = randInt(0,$("#content").height()-h);
		var o = 1;
		if(opacity) o = randDec(0,1);
		var atts = ''+
		'top:'+y+'px;'+
		'left:'+x+'px;'+
		'width:'+w+'px;'+
		'width:'+h+'px;'+
		'background-color:'+color+';'+
		'opacity:'+o+';';
		$("#content").append('<div id="elem'+(nbBaby+1)+'" style="'+atts+'" class="elem"></div>');
		changeElem($('#elem'+(nbBaby+1)));
		nbBaby++;
		applyListener();
	}

	function killBaby(){ // nyark nyark nyark
		if(this.id == undefined || this.id == 'killBaby'){
			if(nbBaby > 0){
				var id = randInt(1,nbBaby-1);						
				var deleted = false;
				if($("#elem"+id).is('div')) deleted = true;
				$("#elem"+id).remove();
				if(id != nbBaby){ // if this is not the latest, we refresh the id, to don't let hole ;)
					$("#elem"+nbBaby).attr('id',"elem"+id);
				}
				if(deleted) nbBaby--;
			}
		}else{
			$(this).stop().fadeOut("fast",function(){$(this).remove();});
			nbBaby--;
		}
	}

	function killAll(){
		$("#content").empty();
		nbBaby = 0 ;
	}

	function changeElems(){
		$(".elem").each(function(){changeElem($(this))});
	}

	function changeElem(block){
		if(!block) block = this;
		if(!state) return;		
		var contentW = $("#content").width();
		var contentH = $("#content").height();
		if(getOption('w')) var w = randInt(20,contentW-20);
		else var w = $(block).width();
		if(getOption('h')) var h = randInt(20,contentH-20);
		else var h = $(block).height();
		if(getOption('x')) var x = randInt(0,contentW-w);
		else var x = $(block).css('left');
		if(getOption('y')) var y = randInt(0,contentH-h);
		else var y = $(block).css('top');
		var o = 1;
		if(opacity){
			if(getOption('o')) o = randDec(0,1);
			else var o = $(block).css('opacity');				 
		}
		if(getOption('c')) var bgc = randColor();
		else var bgc = $(block).css("background-color");
		var time = randInt(MIN_TIME,MAX_TIME);
		$(block).dequeue();
		$(block).animate({
			top:y,
			left:x,
			width:w,
			height:h,
			opacity:o
		},time,changeElem);
	}

	function backgroundColor(c){
		if(!c || !isColor(c) || c instanceof Object) c = randColor();
		bgColor = c;
		$("body").css('background-color',bgColor);
		saveParams();
	}

	function saveParams(nb){
		if(!nb) nb = $(".elem").length;
		var c = bgColor;
		if(bgColor[0] == '#') c = bgColor.substr(1,bgColor.length-1);
		var o = '';
		for(var i=0;i<options.length;i++) o += (options[i]?'1':'0');
		document.location.href = '#'+nb+'_'+c+'_'+o;
	}

	function loadParams(){
		for(var i=0;i<$("#options input").length;i++) options.push(true);
		var l = document.location.href;
		var tmp = new Array();
		var params = new Array();
		if(l.indexOf("#")!= -1){
			tmp = l.split("#");
			params = tmp[1].split('_');
			if(!isNaN(params[0])){
				var nb = params[0];
				if(nb<1)nb = 1;
				else $("#nbElem").val(nb);
				if(nb > WARNING_NB_ELEMENTS){
					if(confirm("The website will create a lot of elements ("+nb+", recomended max. : "+WARNING_NB_ELEMENTS+"), this might slow your computer, are you sure to continue ?")){
						for(var i=1;i<=nb;i++) newBaby();
					}else newBaby();
				}else for(var i=1;i<=nb;i++) newBaby();
			}else newBaby();
		}else newBaby();
		
		if(params.length > 1){
			var c = params[1].toLowerCase();
			if(c = isColor(c)) backgroundColor(c);
			else backgroundColor();
		}else backgroundColor();	

		if(params.length==3){
			var o = params[2];
			if(!isNaN(o)){
				for(var i=0;i<o.length;i++) options[i] = (o[i]=='1');
			}
			
		}
		applyListener();
		applyOptions();
	}
	
	function applyOptions(){
		$("#options input").each(function(i){
			if(options[i]) $(this).attr('checked','checked');
		});
		saveParams();
	}
		
	function getOption(code){
		switch(code){
			case 'x': return options[0];
			case 'y': return options[1];
			case 'w': return options[2];
			case 'h': return options[3];
			case 'o': return options[4];
			case 'c': return options[5];
		}
	}
	
	function setOption(){
		switch(this.id){
			case 'animateX': options[0] = $("#animateX").attr('checked'); break;
			case 'animateY': options[1] = $("#animateY").attr('checked'); break;
			case 'animateW': options[2] = $("#animateW").attr('checked'); break;
			case 'animateH': options[3] = $("#animateH").attr('checked'); break;
			case 'animateO': options[4] = $("#animateO").attr('checked'); break;
			case 'animateC': options[5] = $("#animateC").attr('checked'); break;
		}
		saveParams();
	}
	
	function toggleHeader(){
		if($("#header:animated").length > 0) return;
		if($("#header").css('top') != '0px') $("#header").animate({top:0});
		else $("#header").animate({top:-35});
		return false;
	}
	
	function toggleOptions(){
		if($("#options:animated").length > 0) return;
		if($("#options").css('bottom') != '0px') $("#options").animate({bottom:0,left:0});
		else $("#options").animate({bottom:-$("#options").height()-35, left: -$("#options").width()});
		return false;
	}
	
	function displayTooltip(){		
		var t = $(this).attr('title');
		$("#tooltip .a,#tooltip .b").text(t);		
		$("#tooltip").show();		
	}
	
	function hideTooltip(){
		$("#tooltip .a,#tooltip .b").empty();
		$("#tooltip").hide();		
	}
