addEvent(window,"load",setupInscripcion);

var formData = new Hash()
formData.set("city",false);
formData.set("motorbike",false);
formData.set("time",false);
formData.set("forename",false);
formData.set("surname",false);
formData.set("dni",false);
formData.set("email",false);
formData.set("email_repeat",false);
formData.set("telephone",false);
formData.set("province",false);
formData.set("sex",false);
formData.set("hasMoto",false);
formData.set("mymoto_brand",false);
formData.set("mymoto_model",false);
formData.set("update",false);
formData.reset = function(key,value){	
	this.each(function(pair){ formData.set(pair.key,false) });
}

Global = function(){}
Global.loadingMotorbikes = false;
Global.time = false;
Global.cityData = false;
Global.sentHDUPDATE = false;
Global.sentFUELL = false;

function setupInscripcion()
{
	var form = $("inscription");
	if(form){
		setHidden("motorbikeContainer");
		
		//	Setup the default onsubmit to validate stage1
		form.onsubmit = validateStage1;
		
		//	Setup the city to load motorbikes on selection
		setupCity();
		//	You can't setup the motorbikes, since they are dynamic+dependant on the city
		setupTimes();
		//	Setup any dynamic sections of the personal data
		setupHasMoto();
		setupMyMoto();
		setupHasUpdate();
		
		//	Reset the validation information and time information
		formData.reset();
		resetOtherTimes(false);
	}
}

function setupCity()
{
	var city = $("city");
	
	city.disabled = false;
	
	city.onchange = function(){ changeCity(city); };
	
	setupAvailableCities();
}

function setupAvailableCities()
{
	var parameters = new Hash();
	parameters.set("action","city-availability");
	
	var success = function(ajax){
		var data = ajax.responseJSON;
		if(data["success"] == true){
			Global.cityData = new Hash(data["city-data"]);
		}
	}
	
	makeRequest(success,null,"get",parameters);
}

function changeCity(select)
{
	if(select.value != "-"){
		var cd = Global.cityData.get(select.value);
		
		if(cd["available"] == false){
			setHidden("motorbikeContainer");
			var cityMessage = $("cityMessage");
			if(cityMessage) cityMessage.innerHTML = cd["message"];
			setHidden("personalDetails");
			setHidden("time");
		}else{
			var cityMessage = $("cityMessage");
			if(cityMessage) cityMessage.innerHTML = "";
			
			formData.set("city",select.value);
		
			setupMoto(select.value);
			refreshTimes();
			
			removeDashOption("city");
		}
	}else{
		if(select.options[0].value == select.value) select.options[0].disabled = true;
	}	
}

function getMotoNameFromId()
{
	var selected = formData.get("motorbike");
	if(selected == false) return false;
	
	var moto = $("motorbike");
	
	var options = moto.getElementsByTagName("OPTION");
	for(var i=0;i<options.length;i++){
		if(selected == options.item(i).value){
			selected = options.item(i).innerHTML;
		}
	}
	
	return selected;
}

function setupMoto(city)
{
	var moto = $("motorbike");
	
	if(moto){
		moto.disabled = "disabled";
		setVisible("motorbikeContainer");
		setVisible("loadingMotorbikes");
		
		var success = function(ajax){
			var data = ajax.responseJSON;
			if(data["success"] == false) failure(ajax);
			else{
				moto.disabled = false;
				
				//	If there was a previously selected bike, get the string so we can maybe re-enable it
				var selected = getMotoNameFromId("motorbike");
								
				moto.innerHTML = "";				
			
				for(var d=0;d<data["motorbikes"].length;d++){
					var item = data["motorbikes"][d];
					var option = new Element("OPTION",{value: item["value"]}).update(item["name"]);
					moto.appendChild(option);
					
					if(selected == item["name"]) changeMoto(option);
					
					moto.onchange = function(){ changeMoto(moto); };
				}
			}
			
			setHidden("loadingMotorbikes");
		}
		
		var failure = function(ajax){
			Global.debug.innerHTML += "FAILED TO POPULATE: "+ajax.responseText;
			
			setHidden("loadingMotorbikes");
		}
		
		formData.set("action","motorbike-list");

		makeRequest(success,failure,"get",formData);
	}
}

function changeMoto(select)
{
	if(select.value != "-"){
		formData.set("motorbike",select.value);
	
		refreshTimes();
		
		removeDashOption("motorbike");
	}else{
		//	disable the top option so you can't re-select it
		if(select.options[0].value == select.value) select.options[0].disabled = true;
	}
}

function setupTimes()
{
	var time = $("time");
	if(time) Global.time = time.getElementsByTagName("INPUT");
	
	for(var i=0;i<Global.time.length;i++){
		var d = Global.time.item(i);
		d.onclick = changeTime(d.id);
	}
}

function refreshTimes()
{
	if(formData.get("city") == false || formData.get("motorbike") == false) return;
	
	//	Check the availability of the bike in the city chosen
	var success = function(ajax){
		var data = ajax.responseJSON;
		if(data["success"] == false) failure(ajax);
		else{
			for(var i=0;i<Global.time.length;i++){
				var d = Global.time[i];
				d.parentNode.className = "";
				d.checked = false;
				d.disabled = false;
			}
			
			if(data["time"] != false){
				for(var d=0;d<data["time"].length;d++){
					day		= data["time"][d]["day"];
					hour	= data["time"][d]["hour"];
					
					option = $(day+"_"+hour);
					if(option){
						option.disabled = true;
						option.parentNode.className = "reserved";
						
						//	If the current time is reserved, but it was previously selected
						//	Uncheck the box, remove the time from the form data so they are forced to enter it again
						if(formData.get("time") == option.id){
							option.checked = false;
							formData.set("time",false);
						}
					}
				}
			}
			
			$("tourDate1").innerHTML = data["date"][1];
			$("tourDate2").innerHTML = data["date"][2];
			
			setVisible("time");
			show("time");
		}
	}
	
	var failure = function(ajax){
		alert("FAILED TO POPULATE: "+ajax.responseJSON["Message"]);
	}
	
	formData.set("action","motorbike-availability");
	
	makeRequest(success,failure,"get",formData);
}

function changeTime(time)
{	
	return(function(){
		$(time).checked = true;
		formData.set("time",time);
		resetOtherTimes(time);
		
		resetStage1();
	});
}

function setupHasMoto()
{
	$("hasMotoYes").onclick = function(){
		$("hasMotoArea").style.display = "block";
		formData.set("hasMoto","yes");
	};
	$("hasMotoNo").onclick = function(){
		$("hasMotoArea").style.display = "none";
		formData.set("hasMoto","no");
		formData.set("mymoto_brand",false);
		formData.set("mymoto_model",false);
	};
}

function setupHasUpdate()
{
	var enableUpdate = $("enableUpdate");
	
	if(enableUpdate){
		enableUpdate.onclick = function(){
			if(enableUpdate.checked == true) formData.set("update",1);
			else formData.set("update",0);	
		}
	}
}

function setupMyMoto()
{
	var brand = $("mymoto_brand");
	var model = $("mymoto_model");
	if(brand){
		var success = function(ajax){
			var data = ajax.responseJSON;
			if(data["success"] == false) failure(ajax);
			else{
				brand.disabled = false;
				model.disabled = false;
				model.innerHTML = "";
			
				for(var d=0;d<data["motorbikes"].length;d++){
					var item = data["motorbikes"][d];
					var option = new Element("option", {"value":item["value"]}).update(item["model"]);
					
					if(brand.value == 2) option.selected = true;
					
					model.appendChild(option);
				}
				
				brand.disabled = false;
				model.disabled = false;
				
				formData.set("mymoto_brand",false);
				
				setHidden("mymotoLoading");
			}
		}
		
		var failure = function(ajax){
			formData.set("mymoto_brand",false);
			formData.set("mymoto_model",false);
		}
				
		var request = function(option){
			formData.set("action","mymoto-list");
			formData.set("mymoto_brand",option.value);
			
			setVisible("mymotoLoading");
		
			makeRequest(success,failure,"get",formData);
		}
		
		brand.onchange = function(){
			if(brand.value != "-") request(brand);
			
			removeDashOption("mymoto_brand");
		}
	}
}

function resetOtherTimes(selected)
{
	for(var i=0;i<Global.time.length;i++){
		d = Global.time.item(i);
			
		if(d.id != selected){
			d.checked = false;
		}
	}
}

function setVisible(id)
{
	var node = $(id);
	if(node) node.style.visibility = "visible";
}

function setHidden(id)
{
	var node = $(id);
	if(node) node.style.visibility = "hidden";
}

function show(id,display)
{
	display = display || "block";
	
	var node = $(id);
	if(node) node.style.display = display;
}

function hide(id)
{
	var node = $(id);
	if(node) node.style.display = "none";
}

function setMessage(stage,text)
{
	var message = $(stage+"MessageArea");
	if(message) message.innerHTML = text;
}

function removeDashOption(name)
{
	var select = $(name);
	if(select){
		if(select.options[0].value == "-") select.remove(0);
	}
}

function resetStage1()
{
	//	Reshow the submit stage1 button
	var toggle = $("togglePersonalDetails");
	if(toggle) toggle.parentNode.style.display = "block";
	
	hide("personalDetails");
	
	//	Reset the form to submit stage1
	var form = $("inscription");
	//	Setup the default onsubmit to validate stage1
	form.onsubmit = validateStage1;
}

function validateStage1(){
	setVisible("sendingStage1");
	
	return postdata("validate-stage1");
}

function validateStage2()
{
	setVisible("sendingStage2");
	
	if($("privacyPolicy").checked == true){
		postdata("process-inscription");
	}else{
		alert("Para poder hacer la reserva es necesario aceptar la política de privacidad, gracias.");
		setHidden("sendingStage2");
	}
	return false;
}

function postdata(action)
{
	//	If we get here, it's because all the validation parameters where not false (hence true)
	//	Build an ajax request for all the information and send it
	//	Check the availability of the bike in the city chosen
	var success = function(ajax){
		//$("debug").innerHTML = ajax.responseText;	
		var data = ajax.responseJSON;
		if(data["success"] == false) failure(ajax);
		else{			
			if(action == "validate-stage1"){
				setMessage("stage1","");
				
				show("personalDetails");
				setVisible("personalDetails");
	
				var toggle = $("togglePersonalDetails");
				if(toggle) toggle.parentNode.style.display = "none";
				
				var form = $("inscription");
				if(form) form.onsubmit = validateStage2;
				
				setHidden("sendingStage1");
			}else{
				setHidden("sendingStage2");
				
				//	We are responding to the inscription process here
				window.location="http://www.h-dexperiencetour.com/inscripcion/en-hora-buena.php";
			}
		}
	}
	
	var failure = function(ajax){
		//$("debug").innerHTML = ajax.responseText;	
		var data = ajax.responseJSON;

		if(action == "validate-stage1"){
			setMessage("stage1", data["Message"]);
			setHidden("sendingStage1");
		}else{
			setMessage("stage2", data["Message"]);
			setHidden("sendingStage2");
		}
	}
	
	//	Validate the other parameters filled in with something ??
	var vkeys = formData.keys();
	for(var i=0;i<vkeys.length;i++){
		var k = vkeys[i];
		if(k != "time" && k != "hasMoto" && k != "mymoto_brand" && k != "mymoto_model"){
			var node = $(k);
			var v = (node && node.value) ? node.value : "";
			
			if(v.length != 0) formData.set(k,v);
		}
	}
	
	formData.set("action",action);
	
	makeRequest(success,failure,"get",formData);
	
	return false;
}

function makeRequest(success,failure,transferMethod,transferData,url)
{
	var url = url || "http://www.h-dexperiencetour.com/web-request.php";
	 
	new Ajax.Request(
		url,
		{
			method: transferMethod,
			parameters: transferData,
			onSuccess: success,
			onFailure: failure
		}
	);
}

