var scriptLoaded=false;

var advCanvas = new Array(4), advCtx = new Array(4);
var inputPane;

var canvWid, canvHei;
var doorWid, doorHei; 
var canvLeft=0, canvTop=0;

var leftTextWidth;

var doorSrcWid=180, doorSrcHei=180;

var OPEN_STEPS=35, OPEN_EASING=3.8, OPEN_RADIUS=97;
var FLY_STEPS = 15;

var tuerch = new Array(24);

var doorImg;
var prevImgs = new Array(24);
var prevFiles;
var captions, descs;
var animationInterval;

var flyingCanvas = null, flyingCtx = null, flyingDoor = -1;
var flyStartX, flyStarty, flyDestX, flyDestY, flyStartO, flyStep = 0;

var hidingDetails=false;
var hidingDetailsStep=0;

var allLoaded = false;

var day;

var hovering = false;
var aCursor = 1;

var detailsShown = false;
var textField;

var noCanvas = false;
try {
	noCanvas = !(document.createElement('canvas').getContext('2d'));
} catch(e) {
 	noCanvas = true;
} 


var openingOne = false;

var PId200 = Math.PI/200;

function Tuerchen(number,allowed) {
	var me = this;
	me.number = number;
	if(allowed) {
		me.destOpenness=20+Math.round(Math.random()*15);
		if(number == day) {
			me.openness=-60;
		} else {
			me.openness=me.destOpenness;
		}
	} else {
		me.destOpenness=0;
		me.openness=0;
	}
	me.sneakOpening=false;
	me.sneakClosing=false;
	me.opening=false;
	me.open=false;
	me.openStep=0;
	me.sneakBlocked=0;
	me.allowed=allowed;

	me.openStepFromOpenness = function() {
		me.openStep = Math.ceil(20*(1 - Math.pow(1-me.openness/(me.destOpenness+OPEN_RADIUS),1/OPEN_EASING))) + 1;
	}
}


function redraw(i,fromAll) {

	var l = Math.floor(i/6);
	var c = (i%6);
	if(tuerch[i].openness>=100 && !fromAll) {
		if(c>0) {
			drawTuerch(advCtx[l],i-1,c*doorWid,0,doorWid,doorHei,(tuerch[i-1].openness>0?tuerch[i-1].openness:0),false,true);
		} else {
			advCtx[l].clearRect(0,0,doorWid,doorHei*1.5);
		}
	}
	drawTuerch(advCtx[l],i,(c+1)*doorWid,0,doorWid,doorHei,(tuerch[i].openness>0?tuerch[i].openness:0), false, false);
	if(c<5 && tuerch[i+1].openness>=100 && !fromAll) {
		drawTuerch(advCtx[l],i+1,(c+2)*doorWid,0,doorWid,doorHei,(tuerch[i+1].openness>0?tuerch[i+1].openness:0),true,false);
	}
}

function redrawAll() {
	for(var i = 0; i<24; i++) {
		redraw(i, true);
	}
}

function arrangeAll() {
	windWid=viewWidth(document.getElementById("aroundall"));
	windHei=viewHeight(document.getElementById("aroundall"));


	if(!detailsShown) {
		doorWid=Math.min(doorSrcWid-2,Math.min(Math.floor((windWid-40)/6), Math.floor((windHei-100)/4)));
		doorHei=doorWid;
		canvWid=6*doorWid;
		canvHei=4*doorHei;

		canvLeft=Math.floor(windWid/2-3*doorWid);
		canvTop=Math.floor(windHei-80-canvHei);

		for(var i = 0; i<4; i++) {
			advCanvas[i].width=(7*doorWid); advCanvas[i].height=doorHei*1.5;
		//      advCanvas[i].style.width=(7*doorWid)+"px"; advCanvas[i].style.height=(doorHei*1.5)+"px";
			advCanvas[i].style.left=(canvLeft-doorWid)+"px"; advCanvas[i].style.top=(i*doorHei+canvTop) + "px";
		}
		inputPane.style.left=canvLeft+"px";
		inputPane.style.top=canvTop+"px";
		inputPane.style.width=canvWid+"px";
		inputPane.style.height=canvHei+"px";
		document.getElementById("shadow").style.left=canvLeft+"px";
		//    document.getElementById("shadow").style.top=(canvTop+canvHei)+"px";
		document.getElementById("shadow").style.bottom="60px";
		document.getElementById("shadow").style.width=(canvWid)+"px";

	} else {

		textField.style.bottom=(80+doorHei+20) + "px";
		textField.style.left="20px";
		textField.style.width=leftTextWidth+"px";
		document.getElementById("intext").style.maxHeight=(windHei-doorHei-122)+"px";

		mainTextField.style.left=(leftTextWidth+40)+"px";
		mainTextField.style.bottom=(80+doorHei+20) + "px";
		mainTextField.style.width=(windWid-leftTextWidth-60)+"px";
		mainTextField.style.top ="20px";

		document.getElementById("mainlink2").style.left = (leftTextWidth + 40) + "px";
		document.getElementById("mainlink2").style.top = (windHei - doorHei - 80) + "px";
		document.getElementById("mainlink2").style.height = doorHei + "px";		
		document.getElementById("mainlink2").style.width = doorWid + "px";		

		document.getElementById("backlink2").style.left = (leftTextWidth + 20 - doorWid) + "px";
		document.getElementById("backlink2").style.top = (windHei - doorHei - 80) + "px";
		document.getElementById("backlink2").style.height = doorHei + "px";		
		document.getElementById("backlink2").style.width = doorWid + "px";		
	}
}

function loader() {
	if(noCanvas) {
		document.getElementById("message").innerHTML="In diesem Browser wird der Adventskalender leider nicht unterstützt. Ich empfehle einen moderneren Browser, z.&nbsp;B. Mozilla Firefox.";
	} else {
		if(!scriptLoaded) {
			document.getElementById("message").innerHTML="Lade...";
		}
		  
		inputPane = document.getElementById("inputpane");
		inputPane.style.cursor="pointer"; //For opera
		textField = document.getElementById("text");
		mainTextField = document.getElementById("maintext");

		for(var i = 0; i<4; i++) {
			advCanvas[i]=document.createElement("canvas");
			document.getElementById("aroundall2").appendChild(advCanvas[i]);
			advCanvas[i].style.position="absolute";advCanvas[i].style.zIndex=5-i;
			advCtx[i] = advCanvas[i].getContext("2d");
		}
		arrangeAll();

		var imgs = document.getElementById("images");
		doorImg = document.createElement("img");
		imgs.appendChild(doorImg);
		doorImg.src="advent2011/doors.jpg";

		for(var i = 0; i<(day==25?24:day); i++) {
			prevImgs[i] = document.createElement("img");
			imgs.appendChild(prevImgs[i]);
			prevImgs[i].src="advent2011/" + prevFiles[i] + ".jpg";
		}

		for(var i = 0; i<24; i++) {
			tuerch[i] = new Tuerchen(i+1,i<day);
		}
		if(day>0 && day<25) {
			tuerch[day-1].opening = true;
			openingOne=true;
		}

		leftTextWidth=viewWidth(document.getElementById("weiter"))*0.45;

		animationInterval = setInterval("animate();", 1000/15);

		window.onresize=function(evt) {
			arrangeAll();
			if(allLoaded && !detailsShown) redrawAll();
		};

		addEventHandler(inputPane,"mousemove",mh);
		addEventHandler(inputPane,"mousedown",md);

		addEventHandler(inputPane,"mouseout",function(evt) {
			hovering=false;
		});

		addEventHandler(document.getElementById("backlink"),"click",backClick);
		addEventHandler(document.getElementById("backlink2"),"click",backClick);
	}
}

function mh(evt) {
	var x = evt.pageX - canvLeft;
	var y = evt.pageY - canvTop;
	var c = Math.floor(x/doorWid);
	var l = Math.floor(y/doorHei);
	if(c>5) c=5; if(c<0) c=0;
	if(l>3) l=3; if(l<0) l=0;
	var i = l*6+c;
	if(tuerch[i].allowed) {
		hovering=true;
		sneakIfPossible(i);
		setCursor(1);
	} else {
		hovering=false;
		setCursor(0);
	}
}

function md(evt) {
	var x = evt.pageX - canvLeft;
	var y = evt.pageY - canvTop;
	var c = Math.floor(x/doorWid);
	var l = Math.floor(y/doorHei);
	if(c>5 || c<0 || l>3 || l<0) {

	} else {
		var i = l*6+c;
		if(tuerch[i].allowed) {
			if(!tuerch[i].open && !tuerch[i].opening) {
				tuerch[i].sneakClosing=false; tuerch[i].sneakOpening=false; tuerch[i].opening=true;
				tuerch[i].openStepFromOpenness();
				openingOne=true;
			} else {
				openDoor(i);
			}
		} else {
			alert("Hey, wir wollen doch nicht spicken...");
		}
	}
	stopProp(evt);
	prevDef(evt);
}

function setCursor(newCursor) {
	if(!isOpera) {
		if(newCursor!=aCursor) {
			switch(newCursor) {
				case 0: inputPane.style.cursor="default"; break;
				case 1: inputPane.style.cursor="pointer"; break;
				case 2: inputPane.style.cursor="move"; break;
			}
			aCursor = newCursor;
		}
	}
}


function sneakIfPossible(doorIndex) {
	if(!tuerch[doorIndex].opening && !tuerch[doorIndex].sneakOpening && !tuerch[doorIndex].sneakClosing && tuerch[doorIndex].allowed && !tuerch[doorIndex].open) {
		tuerch[doorIndex].sneakOpening = true;
	} else if(tuerch[doorIndex].sneakClosing) {
		if(tuerch[doorIndex].openness<tuerch[doorIndex].destOpenness+20) {
			tuerch[doorIndex].sneakClosing = false;
			tuerch[doorIndex].sneakOpening = true;
		} else {
			tuerch[doorIndex].sneakBlocked = 3;
		}
	}
}

function animate() {
	if(!allLoaded) {
		allLoaded=true;
		for(var i = 0; i<24; i++) {
			if(!(viewWidth(doorImg)>150)) allLoaded=false;
		}

		for(var i = 0; i<(day==25?24:day); i++) {
			if(!(viewWidth(prevImgs[i])>150)) allLoaded=false;
		}
		if(allLoaded) {
			document.getElementById("throbber").style.display="none";
			document.getElementById("message").style.display="none";
			inputPane.style.display="block";
			document.getElementById("shadow").style.display="block";
			redrawAll();
		}
	} else {
		if(hidingDetails) {
			if(hidingDetailsStep==6) {
				semiHideDetails();
			} if(hidingDetailsStep==12) {
				hideDetails();
			}
			hidingDetailsStep++;
			if(hidingDetailsStep<=6) {
				var opa = 1-(hidingDetailsStep/6)*(hidingDetailsStep/6);
				flyingCanvas.style.opacity=opa;
			} else if(hidingDetailsStep<=12) {
				var opa = 1-((12-hidingDetailsStep)/6);
				document.getElementById("aroundall2").style.opacity=opa;
				document.getElementById("shadow").style.opacity=opa;
			}
		} else if(detailsShown) {
			arrangeAll();
		} else if(flyingDoor != -1) {
			if(flyStep==FLY_STEPS) {
				showDetails();
			} else {
				flyStep++;

				var s =(flyStep/FLY_STEPS)*(flyStep/FLY_STEPS);
				var x = Math.round(flyStartX + s*(flyDestX-flyStartX));
				var y = Math.round(flyStartY + s*(flyDestY-flyStartY));
				flyingCanvas.style.left=(x-doorWid)+"px";
				flyingCanvas.style.top=y+"px";
				var o = Math.round(flyStartO * (1-flyStep/FLY_STEPS));
				flyingCtx.clearRect(0,0,3*doorWid + 20,1.5*doorHei);
				flyingCtx.drawImage(prevImgs[flyingDoor],1,1,doorSrcWid-2,doorSrcHei-2,doorWid + s*(doorWid + 20) ,0,doorWid,doorHei);
				drawTuerch(flyingCtx,flyingDoor, doorWid,0,doorWid,doorHei,o,true,false);
				if(flyStep==FLY_STEPS) {
					flyingCanvas.style.top="auto";
					flyingCanvas.style.bottom=(80-doorHei/2) +"px";//top=(windHei-60-doorHei)+"px";
					flyingCtx.drawImage(document.getElementById("shadowimg"),0,0,doorWid,20,doorWid,doorHei,doorWid,20);
					flyingCtx.drawImage(document.getElementById("shadowimg"),0,0,doorWid,20,2*doorWid + 20,doorHei,doorWid,20);
				}
			}
		} else {
			if(!hovering && !openingOne && flyingDoor==-1) {
				var rand = Math.floor(Math.random()*day*20);

				if(rand<24) {
					if(!tuerch[rand].sneakClosing) sneakIfPossible(rand);
				}
			}
			for(var i = 0; i<24; i++) {
				if(tuerch[i].sneakOpening) {
					tuerch[i].openness++;
					if(tuerch[i].openness==tuerch[i].destOpenness+20) {
						tuerch[i].sneakOpening=false;
						tuerch[i].sneakClosing=true;
					}
					redraw(i, false);
				} else if(tuerch[i].opening) {
					tuerch[i].openStep++;
					tuerch[i].openness = (tuerch[i].destOpenness+OPEN_RADIUS) * (1-Math.pow(1 - tuerch[i].openStep / OPEN_STEPS,OPEN_EASING));
					if(tuerch[i].openStep == OPEN_STEPS) {
						tuerch[i].opening=false;
						openingOne=false;
						tuerch[i].open=true;
					}
					redraw(i, false);
				} else if(tuerch[i].sneakClosing) {
					if(tuerch[i].sneakBlocked>0) {
						tuerch[i].sneakBlocked--;
					} else {
						tuerch[i].openness--;
						if(tuerch[i].openness==tuerch[i].destOpenness) {
							tuerch[i].sneakClosing=false;
						}
						redraw(i, false);
					}
				}

			}

		}
	}
}

function drawTuerch(ctx,i,x,y,w,h,o,od,neod) {
	//od:onlyDoor; neod:noExtremelyOpenDoor;

	if(o>0 && !od) {
		ctx.clearRect(x,y+h,w,h*.5);
		try {
			ctx.drawImage(prevImgs[i],1,1,doorSrcWid-2,doorSrcHei-2,x,y,w,h);
		} catch(e) {
			allLoaded=false;
		}
	}


	if(o!=100 && !(neod && o>100)) {

		ctx.save();
		var arc = PId200*o;
		ctx.setTransform(Math.cos(arc),Math.sin(arc)/4,0,1,x,y);

		var srcl = (i%6) * doorSrcWid;
		var srct = Math.floor(i/6) * doorSrcHei;

		try {
			ctx.drawImage(doorImg,srcl+1,srct+1,doorSrcWid-2,doorSrcHei-2,0,0,w,h);
		} catch(e) {
			allLoaded=false;
		}

		ctx.restore();
	}

}

function openDoor(index) {
	tuerch[index].sneakOpening = false;
	tuerch[index].sneakClosing = false;
	tuerch[index].opening = false;

	if(flyingCanvas != null) return;
	flyingDoor=index;
	flyingCanvas=document.createElement("canvas");
	document.getElementById("aroundall").appendChild(flyingCanvas);
	flyingCanvas.style.position="absolute";flyingCanvas.style.zIndex=30;
	flyingCtx = flyingCanvas.getContext("2d");
	var l = Math.floor(index/6);
	var c = (index%6);
	flyStartX = canvLeft+c*doorWid;
	flyStartY = canvTop+l*doorHei;
	flyStartO = tuerch[index].openness;
	flyDestX=20+leftTextWidth-doorWid; flyDestY=windHei-80-doorHei; flyStep=0;

	flyingCanvas.width=3*doorWid + 20;
	flyingCanvas.height=1.5*doorHei;

	flyingCanvas.style.left=(flyStartX - doorWid) + "px";
	flyingCanvas.style.top=flyStartY+"px";

	drawTuerch(flyingCtx,index, doorWid,0,doorWid,doorHei,flyStartO,true,false);

	//tuerch[index].openness=100;
	//redraw(index,false);

	document.getElementById("aroundall2").style.display="none";
	document.getElementById("shadow").style.display="none";


	tuerch[flyingDoor].openness=tuerch[flyingDoor].destOpenness;
	tuerch[flyingDoor].open=false;
}

function showDetails() {
	detailsShown=true;
	document.getElementById("caption").innerHTML = (flyingDoor + 1) + ". Dezember";
	document.getElementById("description").innerHTML = "<p>" + descs[flyingDoor] + "</p>";
	/*if(largeImgLoaded==false) {
		if(viewWidth(largeImg) > 200) {
			largeImgLoaded=true;
			largeImgWid=viewWidth(largeImg);
			largeImgHei=viewHeight(largeImg);
		}
	}*/
	arrangeAll();
	textField.style.display="block";
	mainTextField.style.display="block";
	document.getElementById("maincaption").innerHTML = captions[flyingDoor];
	document.getElementById("maindescription").innerHTML = mainDescs[flyingDoor];
	if(links[flyingDoor] == '')
	{
		document.getElementById("mainlink").style.display="none";
		document.getElementById("mainlink2").style.display="none";
	} else {
		document.getElementById("mainlink").style.display="inline";
		document.getElementById("mainlink").href = links[flyingDoor];
		document.getElementById("mainlink2").style.display="block";
		document.getElementById("mainlink2").href = links[flyingDoor];
	}
	document.getElementById("backlink2").style.display="block";
}

function backClick(evt) {
	if(detailsShown) {
		startHideDetails();
	}
	stopProp(evt);
	prevDef(evt);
}

function startHideDetails() {
	hidingDetails=true;
	hidingDetailsStep=0;
	textField.style.display="none";
	mainTextField.style.display="none";
	document.getElementById("mainlink2").style.display="none";
	document.getElementById("backlink2").style.display="none";
}

function semiHideDetails() {
	document.getElementById("aroundall").removeChild(flyingCanvas);
	flyingCanvas=null;
	flyingCtx=null;
	flyingDoor=-1;
	detailsShown=false;
	arrangeAll();
	redrawAll();
	document.getElementById("shadow").style.opacity=0;
	document.getElementById("shadow").style.display="block";
	document.getElementById("aroundall2").style.opacity=0;
	document.getElementById("aroundall2").style.display="block";
}

function hideDetails() {
	hidingDetails=false;
	document.getElementById("shadow").style.opacity=1;
}


