/**
 * Bibliotek for håndtering av html-skjemaer
 * 
 * @author	Thomas Sømoen <thomas at apt.no>
 * @version	20061005
 * @package	form
 * @copyright	apt as 2006
 */
var frm = new Object();

/**
 * Leser ett dokument, henter ut forms og justerer dem.
 * 
 * @access	public
 * @since	20061003
 */
frm.extendForm = function(){
	this.fields = new Array();
	this.button = null;
	this.valid = false;
	
	
	this.addFields = function(arrFields){
		for(var i=0;i<arrFields.length;i++){
			if(arrFields[i].type == 'image'){
				arrFields[i].parent = this;
				this.button = arrFields[i];
				if(this.button.onclick == undefined){
					this.button.onclick = function(){
						this.parent.validateForm();
						if(this.parent.valid){
							this.parent.submit();
						}
						return false;
					};
				}
			}else if(arrFields[i].type != 'hidden'){
				arrFields[i].extendElement = frm.extendElement;
				arrFields[i].extendElement();
				this.fields[this.fields.length] = arrFields[i];
			}
		}
	}
	
	this.getField = function(name){
		var field = null;
		var i = 0;
		
		while(i < this.fields.length && field == null){
			if(this.fields[i].name == name){
				field = this.fields[i];
			}
			i++;
		}
		return field;
	}
	
	this.getFieldOnType = function(type){
		var field = null;
		var i = 0;
		
		while(i < this.fields.length && field == null){
			if(this.fields[i].validate == type){
				field = this.fields[i];
			}
			i++;
		}
		return field;
	}
	
	this.wait = function(){
		this.style.cursor = 'wait';
	}
	
	this.undowait = function(){
		this.style.cursor = 'auto';
	}
	
	this.validateForm = function(){
		var result = true;
		for(var i=0;i<this.fields.length;i++){
			if(!this.fields[i].validateInput()){
				result = false;
			}
		}
		
		if(result){
			this.wait();
			var username = this.getFieldOnType('username');
			if(username){
				this.lookupUsername(username);
			}else{
				var username = this.getField('username');
				var password = this.getField('password');
				if(username && password){
					this.validatePassword(username,password);
				}else{
					this.valid = true;
				}
			}
		}
		return false;
	}
	
	this.lookupUsername = function(username){
		handler = new net.Observer();
		handler.form = this;
		handler.notify = function(booResult){
			booResult = parseInt(booResult);
			if(booResult){
				var objMessagePane = new msg.MessagePane('Det finnes en brukerkonto som allerede benytter e-postadressen du har oppgitt.<br />Vil du logge deg på med denne e-postadressen og oppdatere brukerkontoen med de nye opplysningene?');
				var actionYes = new Inloging(this.form,true);
				var actionCancel = new frm.Cancel(this.form,objMessagePane);
				var objYes = new msg.Button('yes',actionYes,this.form);
				var objCancel = new msg.Button('cancel',actionCancel,this.form);
				
				objMessagePane.addButton(objYes);
				objMessagePane.addButton(objCancel);
				objMessagePane.display(this.form);
			}else{
				this.form.valid = true;
				this.form.submit();
			}
		}
		
		objXmlHttp = new net.XmlHttp();
		
		objXmlHttp.attach(handler);
		objXmlHttp.reqParam("work", 'act.ajax.user.username.lookup');
		objXmlHttp.reqParam("username", username.value);
		objXmlHttp.load('ret.php');
	}
	
	this.validatePassword = function(username,password){
		handler = new net.Observer();
		handler.form = this;
		handler.password = password;
		handler.notify = function(booResult){
			if(booResult){
				this.form.valid = true;
				handler.form.submit();
			}else{
				this.password.setErrorMessage('feil passord');
				this.form.undowait();
			}
		}
		
		objXmlHttp = new net.XmlHttp();
		
		objXmlHttp.attach(handler);
		objXmlHttp.reqParam("work", 'act.ajax.user.password.validate');
		objXmlHttp.reqParam("username", username.value);
		objXmlHttp.reqParam("password", password.value);
		objXmlHttp.load('ret.php');
	}
	
	var inputs = this.getElementsByTagName('input');
	this.addFields(inputs);
	
	inputs = this.getElementsByTagName('select');
	this.addFields(inputs);
	
	inputs = this.getElementsByTagName('checkbox');
	this.addFields(inputs);
}

frm.extendElement = function(){
	this.parent = null;
	this.validate = 'string';
	this.required = false;
	this.input = null;
	this.msg_missing = 'mangler';
	this.msg_format = 'ugyldig format';
	
	arrName = this.name.split('_');
	if(this.type != 'image'){
		if(arrName.length >= 5) this.msg_format = arrName[4];
		if(arrName.length >= 4) this.msg_missing = arrName[3];
		if(arrName.length >= 3) this.required = (arrName[2] == 'required')?true:false;
		if(arrName.length >= 2) this.validate = arrName[1];
		this.name = arrName[0];
	}
	
	if(this.validate == 'postcode'){
		this.onkeyup = function(){
			if(this.value.length > 3){
				post.getPostoffice(this.value,'postoffice',null);
			}
		}
	}
	
	this.onfocus = function(){
		this.setErrorMessage('');
	}
	
	this.getValue = function(){
		var value = null;
		switch(this.type){
			case 'text':
				value = this.value;
				break;
			case 'select-one':
				value = this.options[this.selectedIndex].value;
				break;
			case 'checkbox':
				value = this.checked;
				break;
		}
		return value;
	}
	
	this.isEmpty = function(){
		var empty = true;
		switch(this.type){
			case 'hidden':
			case 'password':
			case 'emailcheck':
			case 'text':
				if(this.value.replace(/ /gi,'').length > 0){
					empty = false;
				}
				break;
			case 'select-one':
				if(this.options[this.selectedIndex].value > 0){
					empty = false;
				}
				this.input = this.options[this.selectedIndex].value;
				break;
			case 'checkbox':
				empty = (this.checked)?false:true;
				break;
		}
		return empty;
	}
	
	this.valueMissing = function(){
		return (this.isEmpty() && this.required)?true:false;
	}
	
	this.validateInput = function(){
		var result = true;
		if(this.valueMissing()){
			result = false;
			this.setErrorMessage(this.msg_missing);
		}else if(this.wrongFormat()){
			result = false;
			this.setErrorMessage(this.msg_format);
		}else{
			this.setErrorMessage('');
		}
		return result;
	}
	
	this.wrongFormat = function(){
		var result = false;
		if(!this.isEmpty()){
			var value = this.getValue();
			switch(this.validate){
				case 'username':
				case 'emailcheck':
				case 'email':
					result = isNotValidEmailFormat(value);
					if(this.validate == 'emailcheck'){
						var email = this.form.getField('email');
						if(email && email.value.length > 1){
							if(this.value != email.value){
								this.msg_format = 'E-postadressene er ikke like';
								result = true;
							}
						}
					}
					break;
				case 'integer':
					result = isNaN(value);
					break;
				case 'date':
					value = value.replace(/[^0-9]/gi,'');
					var day = value.substr(0,2);
					var month = value.substr(2,2);
					var year = value.substr(4,4);
					result =  invalidDate(year,month,day);
					break;
				case 'year':
					value = value.replace(/[^0-9]/gi,'');
					result = invalidYear(value);
					break;
				case 'mobile':
					result = notValidPhonenumber(value,'mobile');
					break;
			}
		}
		return result;
	}
	
	this.setErrorMessage = function(message){
		var pane = this.getMessagePane();
		pane.innerHTML = message;
	}
	
	this.getMessagePane = function(){
		var pane = null;
		var arrSpans = this.parentNode.getElementsByTagName('span');
		var i = 0;
		var found = false;
		
		while(i < arrSpans.length && !found){
			if(arrSpans[i].className == 'error'){
				pane = arrSpans[i];
				found = true;
			}
			i++;
		}
		return pane;
	}
}

frm.Cancel = function(form,messagepane){
	this.form = form;
	this.messagepane = messagepane;
	this.doAction = function(){
		this.observer.form.removeChild(this.observer.messagepane);
		this.observer.form.undowait();
	}
}

frm.extendForms = function(){
	var arrForms = document.getElementsByTagName('form');
	for(var i=0;i<arrForms.length;i++){
		if(arrForms[i].name == 'dynamic'){
			arrForms[i].extendForm = frm.extendForm
			arrForms[i].extendForm();
		}
	}
}
window.addOnLoadListener(frm.extendForms);

frm.getCartCompanyCostumer = function(element){
	var form = element.parentNode.parentNode.parentNode.parentNode;
	
	handler = new net.Observer();
	handler.target = form;
	handler.notify = function(result){
		this.target.innerHTML = result;
	}
	
	objXmlHttp = new net.XmlHttp();
	
	objXmlHttp.attach(handler);
	objXmlHttp.reqParam("p", 'ajax.customer.company');
	objXmlHttp.reqParam("referer", 'ajax');
	objXmlHttp.load('index.php');
}

frm.getCartPrivateCostumer = function(element){
	var form = element.parentNode.parentNode.parentNode.parentNode;
	
	handler = new net.Observer();
	handler.target = form;
	handler.notify = function(result){
		this.target.innerHTML = result;
	}
	
	objXmlHttp = new net.XmlHttp();
	
	objXmlHttp.attach(handler);
	objXmlHttp.reqParam("p", 'ajax.customer.private');
	objXmlHttp.reqParam("referer", 'ajax');
	objXmlHttp.load('index.php');
}