var getEvent;

if(window.event){
	getEvent = function(evt){
		window.event.stopPropagation = function(){window.event.cancelBubble = true;};  
		window.event.preventDefault = function(){window.event.returnValue = false;};
		return window.event;
	};
}else{
	getEvent = function(evt){return evt;};
}

function sendRequest(command, parameters, readyfunc, expectXML){
	var request, func;
	if(window.XMLHttpRequest){ // Mozilla, Safari,...
		request = new XMLHttpRequest();
	}else if(window.ActiveXObject){ // IE
		try{
			request = new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			try{
				request = new ActiveXObject("Microsoft.XMLHTTP");
			}catch(e){}
		}
	}
	if(!request){
		throw 'Cannot create instance of XMLHttpRequest';
	}
	if(request.overrideMimeType){
		if(expectXML){
			request.overrideMimeType('text/xml');
		}else{
			request.overrideMimeType('text/plain');
		}
	}
	if(expectXML){
		func = function(){if(request.readyState==4)readyfunc(request.responseXML);};
	}else{
		func = function(){if(request.readyState==4)readyfunc(request.responseText);};
	}
	if(readyfunc) request.onreadystatechange = func;
	parameters += "&template=" + encodeURIComponent(window.document.documentElement.getAttribute("template"));
	parameters += "&" + window.document.documentElement.getAttribute("session");
	request.open("POST", "/@" + command);
	request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	request.setRequestHeader("Content-length", parameters.length);
	request.setRequestHeader("Connection", "close");
	request.send(parameters);
}

function getAbsoluteDimension(element){
	var o, left, top;
	o = element;
	left = 0;
	top = 0;
	while(o){
		left += o.offsetLeft;
		top += o.offsetTop;
		o = o.offsetParent;
	}
	return [left, top, element.offsetWidth, element.offsetHeight];
}

function Scroll(element, scrollUp, scrollDown){
	var elm;
	this.element = document.getElementById(element);
	this.speed = 10;
	this.step = 5;
	this.scrollBy = 0;
	this.interval = false;
	this.start = startScroll;
	this.cancel = cancelScroll;
	this.scroll = scrollBy;

	elm = document.getElementById("scroll-up");
	elm.scroll = this;
	elm.onmousedown = scrollUpButtonActive;
	elm.onmouseup = scrollUpButtonNormal;
	elm.onmouseout = scrollUpButtonNormal;

	elm = document.getElementById("scroll-down");
	elm.scroll = this;
	elm.onmousedown = scrollDownButtonActive;
	elm.onmouseup = scrollDownButtonNormal;
	elm.onmouseout = scrollDownButtonNormal;
	return this;
}

function scrollUpButtonActive(evt){
	this.style.backgroundImage = "url(images/scroll-up-active.png)";
	this.scroll.start(-1);
}

function scrollDownButtonActive(evt){
	this.style.backgroundImage = "url(images/scroll-down-active.png)";
	this.scroll.start(1);
}

function scrollUpButtonNormal(evt){
	this.style.backgroundImage = "url(images/scroll-up.png)";
	this.scroll.cancel();
}

function scrollDownButtonNormal(evt){
	this.style.backgroundImage = "url(images/scroll-down.png)";
	this.scroll.cancel();
}

function scrollBy(){
	if(this.element.nodeName == "DIV"){
		this.element.scrollTop += this.scrollBy;
	}else if(this.element.nodeName == "IFRAME"){
		if(this.element.contentWindow){
			this.element.contentWindow.scrollBy(0, this.scrollBy);
		}else{
			this.element.scrollBy(0, this.scrollBy);
		}
	}
}

function cancelScroll(){
	if(this.interval){
		clearInterval(this.interval);
		this.interval = false;
	}
}

function startScroll(direction){
	var scroll;
	if(this.interval){
		clearInterval(this.interval);
		this.interval = false;
	}
	if(direction > 0) this.scrollBy = this.step;
	else this.scrollBy = -this.step;
	scroll = this;
	this.interval = setInterval(function(){scroll.scroll();}, this.speed);
}

function __stepRepeatGetValue(evt){
	this.repeatsLeft = Number(this.value);
}

function __submitForm(){
	var currentStep;
	currentStep = this.form.currentStep;
	if(!saveStep(currentStep)) return;
	submitForm(this.form);
}

function Form(name, submitfunc, repeatFirstStep, stepdata){
	var btnNext, btnSubmit, i, length, j, l, elm, step, prevstep, elements;
	this.name = name;
	this.submit = submitfunc;
	this.btnNext = document.getElementById(this.name+"-next-step");
	this.btnNext.form = this;
	this.btnNext.onclick = nextStep;
	this.btnSubmit = document.getElementById(this.name+"-submit-form");
	this.btnSubmit.form = this;
	this.btnSubmit.onclick = __submitForm;

	length = stepdata.length;
	this.steps = new Array(length);
	prevstep = null;
	for(i = 0; i < length; ++i){
		step = document.getElementById(this.name+"-step"+i);
		step.form = this;
		step.validate = stepdata[i][1];
		step.previousStep = prevstep;
		if(prevstep) prevstep.nextStep = step;
		prevstep = step;
		this.steps[i] = step;
		if(stepdata[i][0]){
			step.repeatStepElement = document.getElementById(stepdata[i][0]);
			if(step.repeatStepElement.nodeName == "INPUT"){
				step.repeatStepElement.onchange = __stepRepeatGetValue;
			}
		}
		elements = stepdata[i][2]; 
		l = elements.length;
		step.elements = new Array(l);
		for(j = 0; j < l; ++j){
			if(typeof(elements[j]) == "string"){
				step.elements[j] = document.getElementById(elements[j]);
				step.elements[j].name = step.elements[j].id; 
				step.elements[j].inputtype = 0; 
			}else{
				step.elements[j] = elements[j];
			}
			step.elements[j].step = step;
		}

	}

	this.currentStep = this.steps[0];
	if(repeatFirstStep || this.currentStep.nextStep){
		this.btnNext.style.display = "block";
	}else{
		this.btnSubmit.style.display = "block";
	}

	this.currentStep.style.display = "block"; 
}

function __formShowSubmit(form){
	form.btnNext.style.display = "none";
	form.btnSubmit.style.display = "block";
}

function __repeatStep(step){
	var repelm, repeat;
	repelm = step.repeatStepElement;
	if(repelm){
		if(repelm.nodeName == "INPUT"){
			if(repelm.step == step){
				repelm.repeatsLeft = Number(repelm.value) - 1;
			}else{
				--repelm.repeatsLeft;
			}
			repeat = repelm.repeatsLeft > 0;
		}else if(repelm.className == "radio"){
			repeat = (repelm.group.selected == repelm);
		}else if(repelm.className == "checkbox"){
			repeat = repelm.selected;
		}
		return repeat;
	}
	return false;
}

function clearStep(step){
	var i, length, elms, ix;
	elms = step.elements;
	length = elms.length;

	for(i = 0; i < length; ++i){
		switch(elms[i].inputtype){
		case 0: //text input
			elms[i].value = "";
			break;
		case 1: //radio group
			elms[i].selected.src = "/images/radio.png";
		case 2: //dropdown box
			break;
		case 3: //checkbox
			break;
		}
	}
}

function saveStep(step){
	var i, length, elms, ix;

	elms = step.elements;
	length = elms.length;
	if(!step.data){
		step.data = new Array;
		step.dataIndex = 0;
	}
	ix = step.dataIndex;
	step.data[ix] = new Array(length);
	for(i = 0; i < length; ++i){
		switch(elms[i].inputtype){
		case 0: //text input
			step.data[ix][i] = elms[i].value;
			break;
		case 1: //radio group
		case 2: //dropdown box
			if(elms[i].selected){
				step.data[ix][i] = elms[i].selected.title;
			}else{
				step.data[ix][i] = null;
			}
			break;
		case 3: //checkbox
			step.data[ix][i] = elms[i].selected;
			break;
		}
	}
	
	if(step.validate){
		if(!step.validate(step.data[ix])){
			return false;
		}
	}
	++step.dataIndex;
	return true;
}

function nextStep(evt){
	var currentStep;
	currentStep = this.form.currentStep;
	if(!saveStep(currentStep)) return;

	if(__repeatStep(currentStep)){
		clearStep(currentStep);
	}else{
		currentStep.style.display = "none";
		this.form.currentStep = currentStep.nextStep;
		currentStep = currentStep.nextStep;
		currentStep.style.display = "block";
		if(!currentStep.nextStep && !__repeatStep(currentStep)){
			__formShowSubmit(currentStep.form);
		}
	}
}

function radioGroupInit(name, radios, preselect){
	var radio, length, i, prev, first;
	length = radios.length;
	first = document.getElementById(radios[0]);
	first.name = name;
	first.inputtype = 1;
	first.onclick = radioSet;
	first.group = first;
	if(preselect){
		first.selected = document.getElementById(preselect);
	}
	prev = first;
	for(i = 0; i < length; ++i){
		radio = document.getElementById(radios[i]);
		radio.previousRadio = prev;
		prev.nextRadio = radio;
		radio.group = first;
		radio.onclick = radioSet;
		if(radio == first.selected){
			radio.src = "/images/radio-selected.png";
		}
	}
	return first;
}

function __radioToggle(radio){
	var elm;
	for(elm = radio.group; elm; elm = elm.nextRadio){
		elm.src = "/images/radio.png";
	}
	radio.src = "/images/radio-selected.png";
	radio.group.selected = radio;
}

function radioSet(evt){
	__radioToggle(this);
}

function radioSetById(id){
	var radio;
	radio = document.getElementById(id);
	__radioToggle(radio);
}

function validateIsNumber(ok, elm, val){
	var n;
	n = Number(val);
	if(isNaN(val) || n == 0){
		elm.className = "incorrect";
		return false;
	}else{
		elm.className = "";
	}
	return ok;
}

function validateIsText(ok, elm, val){
	if(val.length == 0){
		elm.className = "incorrect";
		return false;
	}else{
		elm.className = "";
	}
	return ok;
}

function validateIsDate(ok, elm, val){
	var d, m, y;
	try{
		d = val.split("-");
		if(d.length != 3){
			d = val.split(" ");
			if(d.length != 3){
				d = val.split(":");
				if(d.length != 3){
					throw 1;
				}
			}		
		}
		y = Number(d[2]);
		if(isNaN(y) || y < 1950 || y > 2012) throw 1; //is year correct
		m = Number(d[1]);
		if(isNaN(m) || m < 1 || m > 12) throw 1; //is month correct
		d = Number(d[0]);
		if(isNaN(d) || d < 1) throw 1; //is day correct ...
		if((m & 1) ^ ((m & 8) >> 3)){ //... in a long month
			if(d > 31) throw 1;
		}else if(m == 2){ //... in february
			if(y % 4){ //... in a normal year
				if(d > 28) throw 1;
			}else{ //... in a leap year
				if(d > 29) throw 1;
			}
		}else{ //... in a short month
			if(d > 30) throw 1;
		}
	}catch(e){
		elm.className = "incorrect";
		return false;
	}
	elm.className = "";
	return ok;
}

function validateRadioSet(ok, elm, val){
	var radio;
	if(!val){
		for(radio = elm; radio; radio = radio.nextRadio){
			radio.src = "/images/radio-incorrect.png";
		}
		return false;
	}
	return ok;
}

