/*Argh!! ikke se på koden min!! den suger :P */

var jobTimer = null;

var running = "intro";
var paused = false;

//størrelse på bildematrise
var swidth  = 8;
var sheight = 5;
var size = swidth * sheight;


/******************
 * Some variables *
 ******************
 * Noen variabler som kan lekes med
 */

var springInterval = 300;
var pastSpringDelay = 2500;


var pastMessDelay = 2500;

var randSwapInterval = 600;
var blockSwapSpeed = 2000;


/***********************
 * "Buffering" stuff.. *
 ***********************
 * forsøk på å laste litt bilder før de skal brukes. Benyttet i utgangspunktet onload, men
 * opera har en bug som gjør at dette ikke kan brukes så dynamisk som jeg ønsket, så da dret
 * jeg i det og bruker heller tidsintervaller
 */

var bufList = Array();
var bufIndex = 0;
var bufTimer;

function bufImg(num){
	for(var i = 0; i < size; i++)
		bufAdd("images/"+num+"/"+i+".jpg");
}

function bufAdd(src){
	if(bufList.length < 100){
		bufList[bufList.length] = src;
		if(bufTimer == null)
			bufTimer = setInterval(bufNext, 40);
	}
}

function bufNext(){
	document.createElement('iframe').src = bufList[bufIndex++];
	if(bufIndex == bufList.length)
		bufClear();
}

function bufClear(){
	clearInterval(bufTimer);
	bufTimer = null;
	bufList = Array();
	bufIndex = 0;
}

/*******************
 * Intro functions *
 *******************
 * 'stormen' som kommer først
 */
 
var imglist;
var imgsrc;
var windIndex;

function startIntro(){
	if(jobTimer != null)
		clearTimeout(jobTimer);
		
	imglist = Array(size);
	for(var i = 0; i < size; i++)
		imglist[i] = i;
		
	for(var i = 0; i < size; i++){
		var a = Math.round(Math.random() * size - 0.5);
		var b = Math.round(Math.random() * size - 0.5);
		var t = imglist[a];
		imglist[a] = imglist[b];
		imglist[b] = t;
	}

	imgsrc = Array(size);
	windIndex = 0;
	for(var i = 0; i < size * 1.5; i++){
		imgsrc[i] = Math.round(Math.random() * imageCount -0.5);
		bufAdd("images/" + imgsrc[i] + "/" + imglist[i] + ".jpg");
	}
	jobTimer = setTimeout(introTick, 2000);
}

function introTick(){
	setImage(imglist[windIndex % size], imgsrc[windIndex]);
	windIndex++;
	if(windIndex >= size*1.5){
		stopIntro();	jobTimer = setTimeout(swapTile, Math.round(randSwapInterval * (Math.random() + 0.5)));
	}else{
		if(windIndex < 3){
			jobTimer = setTimeout(introTick, 600);
		}else
			jobTimer = setTimeout(introTick,50);
	}
}

function stopIntro(){
	clearTimeout(jobTimer);
	imglist = null;
	imgsrc = null;
	startRandom();
}


/*******************
 * Pause function *
 *******************
 * pause dingsen
 */
function pause(color){
	var kn = document.getElementById("pauseknapp");

	if(!paused){
		paused = true;
		kn.alt = "Start";
		running = "pause";
		if(jobTimer != null){
			clearTimeout(jobTimer);
			jobTimer = null;
		}
	}else{
		paused = false;
		kn.alt = "Pause";
		startRandom();
	}
	swapPause(color);
}

/********************
 * Button functions *
 ********************
 * Disse funksjonene bytter ut bildene på knapper og håndterer mouseover ol.
 */
 
function showBox(obj){
	var id = obj.id.substring(0,obj.id.length-4);
	document.getElementById(id).style.visibility = "visible";
	var b = obj.style;
	b.color = "#ff0080";
	b.textDecoration = "none";
}

function closeBox(obj){
	obj.parentNode.style.visibility = "hidden";
	var b = document.getElementById(obj.parentNode.id+"link").style;
	b.color = "#666666";
	b.textDecoration = "underline";
}
		
function swapPause(o){
	var kn = document.getElementById("pauseknapp");
	if(o){
		if(paused){
			kn.src = "knapper/playaktiv.gif";
		}else{
			kn.src = "knapper/pauseaktiv.gif";
		}
	}else{
		if(!paused){
			kn.src = "knapper/pause.gif";
		}else{
			kn.src = "knapper/play.gif";
		}
	}
}


/*********************************
 * Random tileswapping functions *
 *********************************
 * Den normale bildebyttinga, inkl blokker.
 */

function startRandom(){
	if(paused)
		return;
	if(jobTimer != null)
		clearTimeout(jobTimer);
		
	running = "random"
	jobTimer = setTimeout(swapTile, Math.round(randSwapInterval * (Math.random() + 0.5)));
	
	var r = Math.random();
	r = 1 - (r * r); r *= blockSwapSpeed;
	
	setTimeout("swapTilec();", Math.round(r));
}

function swapTile(){
	if(running != "random")
		return;
	var ri = Math.round(Math.random() * swidth * sheight - 0.5);
	var piece =  Math.round(Math.random() * imageCount - 0.5);
	
	setImage(ri, piece);
	
	jobTimer = setTimeout(swapTile, Math.round(randSwapInterval * (Math.random() + 0.5)));
}

function swapTilec(){
	if(running != "random")
		return;
	var ri = Math.round(Math.random() * swidth * sheight - 0.5);
	var piece =  Math.round(Math.random() * imageCount - 0.5);
	
	setImagec(ri, piece);
	
	var r = Math.random();
	r = 1 - (r * r); r *= blockSwapSpeed;
	
	setTimeout("swapTilec();", Math.round(r));
}

/****************************
 * Image "spring" functions *
 ****************************
 * Denne gjør så hele bildet popper fram når en trykker på det
 */

var springTimer = null;
var springCount;
var springTarget;
var springX, springY;

function prepSpring(img){
	if(jobTimer != null)
		clearTimeout(jobTimer);
		
	running = "spring"
	
	var p = img.id.substring(1);
	springTarget = getImage(p, 0);
	
	springX =  p % swidth;
	springY =  (p - springX) / swidth;
	setImage(springX + springY * swidth, springTarget);
	
	setTimeout(bufSpring, 1);
	jobTimer = setTimeout(spring, 500);
}

function bufSpring(){
	springCount = 1;
	for(var i = 1; i < 8; i++){
		for(var x = springX - i; x <= springX + i; x++){
			springBufImg(x, springY - x);
			springBufImg(x, springY + x);
		}
		
		for(var y = springY - i; y <= springY + i; y++){
			springBufImg(springX - i, y);
			springBufImg(springX + i, y);
		}
	}
}

function springBufImg(x, y){
	if(x < 0 || y < 0 || x >= swidth || y >= sheight)
		return;
	bufAdd("images/"+springTarget+"/" + x + y * swidth + ".jpg");
}

function spring(){
	for(var x = springX - springCount; x <= springX + springCount; x++){
		springImg(x, springY - springCount);
		springImg(x, springY + springCount);
	}
	
	for(var y = springY - springCount; y <= springY + springCount; y++){
		springImg(springX - springCount, y);
		springImg(springX + springCount, y);
	}
	
	springCount++;
	if(springX - springCount < 0 && springX + springCount >= swidth &&
		springY - springCount < 0 && springY + springCount >= sheight)
		stopSpring();
	else
		jobTimer = setTimeout(spring, springInterval);
}

function springImg(x, y){
	if(x < 0 || y < 0 || x >= swidth || y >= sheight)
		return;
	setImage(x + y * swidth, springTarget);
}

function stopSpring(d){
	jobTimer = setTimeout("startRandom();", pastSpringDelay);
}



/********************
 * Messup functions *
 ********************
 * Roter til bildet.
 */

var messCount;
var messQueue;
function messUp(){
	if(jobTimer != null)
		clearTimeout(jobTimer);
		
	running = "mess";
	
	messCount = 0;
	var size = swidth*sheight;
	messQueue = Array(size);
	for(var i = 0; i < size; i++)
		messQueue[i] = i;
	for(var i = 0; i < size * 2; i++){
		var a = Math.round(Math.random() * size - 0.5);
		var b = Math.round(Math.random() * size - 0.5);
		var t = messQueue[a];
		messQueue[a] = messQueue[b];
		messQueue[b] = t;
		if(a > size)
			alert(a);
	}
	
	jobTimer = setTimeout(messTile, 25);
}

function messTile(){
	if(running != "mess")
		return;
	var piece =  Math.round(Math.random() * imageCount - 0.5);
	
	setImage(messQueue[messCount++ % messQueue.length], piece);
	if(messCount >= messQueue.length *1.4)
		stopMess();
	else	
		jobTimer = setTimeout(messTile, 15);
}

function stopMess(){
	messQueue = null;
	jobTimer = setTimeout(startRandom, pastMessDelay);
}
/********************************
 * Image sourcechange functions *
 ********************************
 * gjør det å bytte bildene litt enklere når en lager de litt mer innviklede
 * funskjonene.
 */

function setImagec(img, n){
	var x = img % swidth, y = (img - x) / swidth;
	var dist = Math.round(Math.random() * 8) + 2;
	var dir = -1;
	setImage(img, n);
	while(dist > 0){
		dir = -1;
		while(dir == -1){
			dir = Math.round(Math.random() * 4 - 0.5);
			switch(dir){
				case 0: if(x > 0) x--; else dir = -1; break;
				case 1: if(y > 0) y--; else dir = -1; break;
				case 2: if(x < swidth -1) x++; else dir = -1; break;
				case 3: if(y < sheight -1) y++; else dir = -1; break;
			}
		}
		setImage(x + y * swidth, n);
		dist--;
	}
}

function setImage(img, n){
	var d = document.getElementById("i" + img);
	if(d.src != "images/" + n + "/" + img + ".jpg"){
		d.src = "images/" + n + "/" + img + ".jpg";
		window.status='';
	}
}

function getImage(img, alt){
	var p = document.getElementById("i" + img).src.split("/");
	if(p[p.length-1] == "white.gif")
		return alt;
	else
		return p[p.length - 2];
}




function thumbs(){
	if(jobTimer != null){
		clearTimeout(jobTimer);
		jobTimer = null;
	}
	if(paused != true)
		pause();
	for(var i = 0; i < swidth * sheight && i < imageCount; i++)
		document.getElementById("i"+i).src = "images/"+i+"/thumbs.jpg";
}
