var RestelApplication = {
	positions: new Array(),
	positionSelectId: "sel_position",
	areaWrapperId: "areaBoxes",
	positionSelect: null,
	areaWrapper: null,
	
	
	addPosition: function(posName){
		if(posName && typeof(posName) == 'string' && posName != ''){
			this.positions.push({name: posName, areas: new Array()});
			return (this.positions.length - 1);
		}
		else{
			return false;
		}
	},
	
	addArea: function(areaName, posIndex){
		if(areaName && typeof(areaName) == 'string' && areaName != '' && posIndex < this.positions.length){
			this.positions[posIndex].areas.push({name: areaName, subareas: new Array()});
			return (this.positions[posIndex].areas.length - 1);
		}
		else{
			return false;
		}
	},
	
	addSubarea: function(subareaName, areaIndex, posIndex){
		if(subareaName && typeof(subareaName) == 'string' && subareaName != '' && posIndex < this.positions.length && areaIndex < this.positions[posIndex].areas.length){
			this.positions[posIndex].areas[areaIndex].subareas.push({name: subareaName});
		}
	},
	
	formatAreaName: function(str){
		return str.replace(/\s/g, "_").replace(/-/g, "").toLowerCase();
	},
	
	buildCBWrapper: function(areaArray){
		var cbHTML = new Array();
		
		for(var i = 0; i < areaArray.length; i++){
			cbHTML.push("<div class=\"area\">");

			var areaHTML = new Array();
			
			areaHTML.push("<input type=\"checkbox\" onclick=\"RestelApplication.toggleArea(this);\" id=\"area_" + this.formatAreaName(areaArray[i].name) + "\" name=\"area_" + this.formatAreaName(areaArray[i].name) + "\"><label onclick=\"RestelApplication.toggleArea(this)\" for=\"area_" + this.formatAreaName(areaArray[i].name) + "\">" + areaArray[i].name + "</label>");
			if(areaArray[i].subareas.length > 0){
				areaHTML.push("<div class=\"cities\">");
				areaHTML.push("<div class=\"all\"><input type=\"checkbox\" id=\"all_" + this.formatAreaName(areaArray[i].name) + "\" checked=\"checked\" onclick=\"RestelApplication.updateSubareas(this);\" /> <label for=\"all_" + this.formatAreaName(areaArray[i].name) + "\" onclick=\"RestelApplication.updateSubareas(this);\">Kaikki alueen paikkakunnat sopivat</label></div>");
				areaHTML.push("<div class=\"column\">");
				for(var j = 0; j < Math.ceil(areaArray[i].subareas.length / 2); j++){
					var city = areaArray[i].subareas[j];	
					areaHTML.push("<input type=\"checkbox\" disabled=\"disabled\" id=\"city_" + this.formatAreaName(areaArray[i].name) + "_" + this.formatAreaName(city.name) + "\" /> <label for=\"city_" + this.formatAreaName(areaArray[i].name) + "_" + this.formatAreaName(city.name) + "\">" + city.name + "</label><br />");
				}
				areaHTML.push("</div>");
				areaHTML.push("<div class=\"column\">");
				for(var j = Math.ceil(areaArray[i].subareas.length / 2); j < areaArray[i].subareas.length; j++){
					var city = areaArray[i].subareas[j];	
					areaHTML.push("<input type=\"checkbox\" disabled=\"disabled\" id=\"city_" + this.formatAreaName(areaArray[i].name) + "_" + this.formatAreaName(city.name) + "\" /> <label for=\"city_" + this.formatAreaName(areaArray[i].name) + "_" + this.formatAreaName(city.name) + "\">" + city.name + "</label><br />");
				}
				areaHTML.push("</div>");
				areaHTML.push("</div>");
			}
			
			cbHTML.push(areaHTML.join("\n") + "</div>");
		}
		
		return cbHTML.join("\n");
	},
	
	build: function(isOpen){
		if(isOpen){
			this.positionSelect = document.getElementById(this.positionSelectId);
			this.areaWrapper = document.getElementById(this.areaWrapperId);
			
			for(var i = 0; i < this.positions.length; i++){
				var newOption = document.createElement("option");
				newOption.value = this.positions[i].name;
				newOption.innerHTML = this.positions[i].name;
				this.positionSelect.appendChild(newOption);
				
				var newCBWrapper = this.buildCBWrapper(this.positions[i].areas);
				if(newCBWrapper != null){
					this.positions[i].cbWrapper = newCBWrapper;
				}
			}
			/*
			if(this.positions.length > 0)
				this.areaWrapper.innerHTML = this.positions[0].cbWrapper;
			*/
		}
	},
	
	findParentArea: function(emt){
		var parent = null;
		var selectedEmt = null;
		var iter = 0;
		while(iter < 100 && (parent == null || parent.nodeName.toLowerCase() != 'body')){
			parent = emt.parentNode;
			if(parent.className == 'area' || parent.className == 'area_selected'){
				selectedEmt = parent;
				break;
			}
			emt = parent;
			iter++;
		}
		
		return selectedEmt;
	},
	
	findParentCities: function(emt){
		var parent = null;
		var selectedEmt = null;
		var iter = 0;
		while(iter < 10 && (parent == null || parent.nodeName.toLowerCase() != 'body')){
			parent = emt.parentNode;
			if(parent.className == 'cities'){
				selectedEmt = parent;
				break;
			}
			emt = parent;
			iter++;
		}
		
		return selectedEmt;
	},
	
	toggleArea: function(clickSrc){
		var emtTag = clickSrc.nodeName.toLowerCase();
		var parent = this.findParentArea(clickSrc);
		if(parent != null){
			if(emtTag == 'input'){
				if(clickSrc.checked)
					parent.className = "area_selected";
				else{
					parent.className = "area";
				}
			}
			else{
				var inputs = parent.getElementsByTagName("input");
				if(inputs.length > 0){
					var cb = inputs[0];
					if(cb.checked)
						parent.className = "area_selected";
					else{
						parent.className = "area";
					}
				}
			}
		}
	},
	
	updateBoxes: function(selSrc){
		if(selSrc.selectedIndex > 0)
			this.areaWrapper.innerHTML = this.positions[selSrc.selectedIndex - 1].cbWrapper;
		else
			this.areaWrapper.innerHTML = "";
	},
	
	findAreaAll: function(area){
		var inputs = area.getElementsByTagName("input");
		var retval = false;
		if(inputs.length > 0){
			retval = inputs[0];
		}
		
		return retval;
	},
	
	disableSubareas: function(area){
		var inputs = area.getElementsByTagName("input");
		if(inputs.length > 1){
			for(var i = 1; i < inputs.length; i++){
				inputs[i].disabled = true;
			}
		}
	},
	
	enableSubareas: function(area){
		var inputs = area.getElementsByTagName("input");
		if(inputs.length > 1){
			for(var i = 1; i < inputs.length; i++){
				inputs[i].disabled = false;
			}
		}
	},
	
	updateSubareas: function(clickSrc){
		var emtTag = clickSrc.nodeName.toLowerCase();
		var parent = this.findParentCities(clickSrc);
		if(parent != null){
			var areaAll = this.findAreaAll(parent);
			if(areaAll != false && areaAll.checked){
				this.disableSubareas(parent);
			}
			else if(areaAll != false){
				this.enableSubareas(parent);
			}
		}
	},
	
	
	// Validate basic personal info (name, address, phone etc.)
	validateBasicInfo: function(form){
		var infoWrapper = document.getElementById("form_tablePersonalInfo");
		var inputs = infoWrapper.getElementsByTagName("input");
		var selects = infoWrapper.getElementsByTagName("select");
		
		var resultObj = {name: "Henkilötiedot", value: true};
		
		for(var i = 0; i < inputs.length; i++){
			if(inputs[i].value == '')
				resultObj.value = false;
		}
		
		for(var i = 0; i < selects.length; i++){
			if(selects[i].options[selects[i].selectedIndex].value == '')
				resultObj.value = false;
		}
		
		return resultObj;
	},
	
	
	validateAndBuildPosition: function(form){
		var selInd = document.getElementById("sel_position").selectedIndex - 1; // [Selected index in the drop down] - 1 = [index in the position array]
		var error = false;
		var pos = null;
		
		var areaValue = new Array();
		
		// If the index equals -1 there's no position selected (first index is reserved for the prompt option)
		if(selInd >= 0){
			pos = this.positions[selInd];
			var selectedAreas = 0;
			for(var i = 0; i < pos.areas.length; i++){
				var area = this.findParentArea(document.getElementById("area_" + this.formatAreaName(pos.areas[i].name)));
				var boxes = area.getElementsByTagName("input");
				var labels = area.getElementsByTagName("label");
				
				// Map checkboxes and labels into a simple array of objects
				var boxObjs = new Array();
				for(var j = 0; j < boxes.length && j < labels.length; j++){
					boxObjs.push({boxEmt: boxes[j], label: labels[j], selected: boxes[j].checked, name: labels[j].innerHTML});
				}
				
				// Check if this area is selected
				if(boxObjs[0].selected){
					selectedAreas++;
					var thisAreaValue = boxObjs[0].name;

					// Does this area have subareas?
					if(boxObjs.length > 1){
						var selectedSubareas = new Array();
						for(var k = 1; k < boxObjs.length; k++){
							// OK, here we have a selected subarea
							if(boxObjs[k].selected){
								selectedSubareas.push(boxObjs[k].name);
							}
						}
						
						// Format output for subareas
						if(selectedSubareas.length > 0){
							thisAreaValue += ": " + selectedSubareas.join(", ");
						}
						else{
							error = true; // We have subareas none of which are selected -> that's a no-go
						}
					}
					areaValue.push(thisAreaValue);
				}
			}
			
			if(selectedAreas == 0)
				error = true;
		}
		else{
			error = true; // No areas selected -> fail
		}
		
		// No errors -> let's add a new DOM element to hold the area data
		if(!error){
			form.selectedAreas.value = areaValue.join("\n");
			//alert(form.selectedAreas.value);
		}
		
		return {name: "Mistä tehtävästä olet kiinnostunut?", value: !error};
	},
	
	
	
	validateJobType: function(form){
		var inputs = document.getElementById("jobType_inputs").getElementsByTagName("input");
		var selected = 0;
		for(var i = 0; i < inputs.length; i++){
			if(inputs[i].type == "checkbox" && inputs[i].checked)
				selected++;
		}
		
		return {name: "Millaista työtä haluaisit tehdä?", value: (selected > 0)};
	},
	
	
	validateLanguageSkills: function(form){
		var inputs = document.getElementById("form_tableLanguage").getElementsByTagName("input");
		var errors = 0;
		var selected = 0;
		for(var i = 0; i < inputs.length; i++){
			if(i % 5 == 0)
				selected = 0;
			if(inputs[i].checked)
				selected++;
			if(i % 5 == 4 && selected == 0)
				errors++;
		}
		
		return {name: "Kielitaito", value: (errors == 0)};
	},
	
	
	validateEducation: function(form){
		var inputs = document.getElementById("education_radios").getElementsByTagName("input");
		var selected = 0;
		for(var i = 0; i < inputs.length; i++){
			if(inputs[i].checked)
				selected++;
		}
		
		return {name: "Koulutus", value: (selected > 0)};
	},
	
	
	generateErrorReport: function(resultArray){
		var result = {errorCount: 0, errorMessage: "", errors: new Array()};
		var errors = new Array();
		for(var i = 0; i < resultArray.length; i++){
			if(!resultArray[i].value)
				errors.push("  - " + resultArray[i].name);
		}
		
		result.errorMessage = "Tarkistathan vielä seuraavat lomakkeen kohdat:\n" + errors.join("\n");
		result.errorCount = errors.length;
		result.errors = errors;
		
		return result;
	},
	
	
	handleSubmit: function(form, isOpen){
		var results = new Array(); // Array to hold all result objects ({name: "Result name", value: true|false == OK|error})
		var result = null;
		
		results.push(this.validateBasicInfo(form));
		if(isOpen)
			results.push(this.validateAndBuildPosition(form));
		results.push(this.validateJobType(form));
		results.push(this.validateLanguageSkills(form));
		results.push(this.validateEducation(form));
		
		result = this.generateErrorReport(results);
		
		if(result.errorCount > 0){
			alert(result.errorMessage);
		}
		
		return (result.errorCount == 0);
	}
}
