var boot = '1';
var timeout = 5;
var kernels = [['Web Linux 0.6.2 - Runlevel 5','kernels/kernel-0.2.js',5,'filesystem/hda1.php'],['Web Linux 0.6.2 - Runlevel 3','kernels/kernel-0.2.js',3,'filesystem/hda1.php']];

Array.prototype.inArray = function(val) {
	for (var i=0; i<this.length; i++) {
		if (this[i] == val) {
			return true;
		}
	}
	return false;
}

grub = function() {
	var me = this;
	this.counter;
	var bkernel = boot;

	function sleep(time) {
		var date = new Date();
		do {
			curDate = new Date();
		}
		while(curDate-date < time);
	}

	this.timer = function(opts) {
		if (boot) {
		this.msg('starting timer');
			if (timeout == 0) {
				this.msg('Booting ' + kernels[boot][0]);
				this.boot(kernels[boot]);
			}else{
				this.counter.setTimeout("timer",1000);
				var mul = (timeout>1) ? 's' : '';
				this.msg('Booting ' + kernels[boot][0] + ' in ' + timeout + ' second' + mul);
				timeout = timeout-1;
			}
		}
	}

	this.msg = function(msg) {
		document.getElementById('grubMsg').innerHTML = msg;
	}

	this.boot = function(opts) {
		document.body.style.textAlign = 'left';
		document.body.innerHTML = 'Grub: Loading the kernel...';
		grubFetch(opts);
	}

	function gload(xmlReq,opts) {
		if (xmlReq.readyState == 4 && (xmlReq.status==200 || window.location.href.indexOf("http")==-1)) {
			window.kernel = xmlReq.responseText;
			if (navigator.userAgent.indexOf('MSIE') != -1) {
				//make the kernel global in ie
				window.execScript(kernel);
			}else{
				window.eval(kernel);
			}
			document.body.innerHTML += '<br />' + kVer;
			setTimeout("boot('" + opts[2] + "','" + opts[3] + "');",1000);
		}
	}

	function grubFetch(opts) {
		var url = opts[1];
		var rootdomain = 'http://' + window.location.hostname;
		var xmlRequest = false;
		if (window.XMLHttpRequest) {
			xmlRequest = new XMLHttpRequest();
		}else if (window.ActiveXObject) {
			try {
				xmlRequest = new ActiveXObject("Msxml2.XMLHTTP");
			}catch (e){
				try{
					xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
				}catch (e) {}
			}
		}else return false;
		xmlRequest.onreadystatechange = function() {
			gload(xmlRequest,opts);
		}
		var cacheBuster = '?' + new Date().getTime();
		xmlRequest.open('GET', url + cacheBuster, true);
		xmlRequest.send(null);
	}

	this.keyDown = function(e) {
		if (!e) var e = window.event;
		if (e.keyCode == 13) {
			boot = false;
			me.msg('Booting ' + kernels[bkernel][0]);
			me.boot(kernels[bkernel]);
		}else if (e.keyCode == 38) {
			boot = false;
			if ((bkernel*1) >0) {
				document.getElementById(bkernel).className = 'grubItem';
				bkernel = (bkernel*1)-1;
				document.getElementById(bkernel).className = 'grubItemOver';
				me.msg('Press enter to boot ' + kernels[bkernel][0]);
			}
		}else if (e.keyCode == 40) {
			boot = false;
			if ((bkernel*1) < ((kernels.length*1)-1)) {
				document.getElementById(bkernel).className = 'grubItem';
				bkernel = (bkernel*1)+1;
				document.getElementById(bkernel).className = 'grubItemOver';
				me.msg('Press enter to boot ' + kernels[bkernel][0]);
			}
		}else return false;
	}

	this.init = function() {
		var menu = document.createElement('div');
		 menu.className = 'grub';
		 menu.id = 'menu';
		document.body.appendChild(menu);
		for (var i=0;i<kernels.length;i++) {
			var item = document.createElement('div');
			 item.className = 'grubItem';
			 item.id = i;
			 item.innerHTML = kernels[i][0];
			menu.appendChild(item);
		}
		document.getElementById(boot).className = 'grubItemOver';
		menu = document.createElement('div');
		 menu.className = 'grubMsg';
		 menu.id = 'grubInst';
		 menu.innerHTML = 'Use UP and DOWN arrows to select a kernel, ENTER to boot';
		document.body.appendChild(menu);
		menu = document.createElement('div');
		 menu.className = 'grubMsg';
		 menu.id = 'grubMsg';
		document.body.appendChild(menu);
		document.onkeydown = this.keyDown;
		this.counter = new Timer(this);
		this.timer();
	}

	this.init();
	return this;
}

function startGrub() {
	window.bootLoader = new grub();
}

function Timer(){
	this.obj = (arguments.length)?arguments[0]:window;
	return this;
}

Timer.prototype.setInterval = function(func, msec){
	var i = Timer.getNew();
	var t = Timer.buildCall(this.obj, i, arguments);
	Timer.set[i].timer = window.setInterval(t,msec);
	return i;
}
Timer.prototype.setTimeout = function(func, msec){
	var i = Timer.getNew();
	Timer.buildCall(this.obj, i, arguments);
	Timer.set[i].timer = window.setTimeout("Timer.callOnce("+i+");",msec);
	return i;
}
Timer.prototype.clearInterval = function(i){
	if(!Timer.set[i]) return;
	window.clearInterval(Timer.set[i].timer);
	Timer.set[i] = null;
}
Timer.prototype.clearTimeout = function(i){
	if(!Timer.set[i]) return;
	window.clearTimeout(Timer.set[i].timer);
	Timer.set[i] = null;
}

Timer.set = new Array();
Timer.buildCall = function(obj, i, args){
	var t = "";
	Timer.set[i] = new Array();
	if(obj != window){
		Timer.set[i].obj = obj;
		t = "Timer.set["+i+"].obj.";
	}
	t += args[0]+"(";
	if(args.length > 2){
		Timer.set[i][0] = args[2];
		t += "Timer.set["+i+"][0]";
		for(var j=1; (j+2)<args.length; j++){
		Timer.set[i][j] = args[j+2];
		t += ", Timer.set["+i+"]["+j+"]";
	}}
	t += ");";
	Timer.set[i].call = t;
	return t;
}
Timer.callOnce = function(i){
	if(!Timer.set[i]) return;
	eval(Timer.set[i].call);
	Timer.set[i] = null;
}
Timer.getNew = function(){
	var i = 0;
	while(Timer.set[i]) i++;
	return i;
}

window.onload = startGrub;
