$(document).ready(function() {
    $('#form_form').ajaxForm({
    	beforeSubmit: 	validate,
    	success:		prepareOutput,
    	target:			'#form_output',
    	url:			'http://futurenow2010.org/anmeldung/form.php',
    	type:			'post'
    	});
    //form.title.focus();
    $('#form_content').removeClass('hidden');
    document.getElementById("form_title").focus();
    
    //$('#form_submit_button').click(function() {
    //	$('input').removeAttr("disabled");
    //});

	disable('children_count');
	disable('children_care_local');
	disable('children_care_camp');
	
	$('#form_children').click(makeToggleFunction('children_count, children_care_local, children_care_camp'));
    
	disable('private_accommodation');
    disable('hotel_accommodation');
    disable('mass_accommodation');
    
    $('#form_got_accommodation').click(makeToggleFunctionAndReverse(null, 'mass_accommodation'));
    $('#form_need_accommodation').click(makeToggleFunctionAndReverse('mass_accommodation', null));
    $('#form_offer_accommodation').click(makeToggleFunctionAndReverse(null, 'mass_accommodation'));
    
    $('#form_private_accommodation_box').click(makeToggleFunctionAndReverse('private_accommodation', 'hotel_accommodation, mass_accommodation'));
    $('#form_hotel_accommodation_box').click(makeToggleFunctionAndReverse('hotel_accommodation', 'private_accommodation, mass_accommodation'));
    $('#form_mass_accommodation').click(makeToggleFunctionAndReverse('mass_accommodation', 'private_accommodation, hotel_accommodation'));
    
    disable('instrument');
    
    $('#form_musician').click(makeToggleFunction('instrument'));
    
    disable('translate_from');
    disable('translate_to');
    
    $('#form_translater').click(makeToggleFunction('translate_from, translate_to'));
    
    disable('full_fee_discount');
    disable('full_fee_discount_amount');
    
    $('#form_full_fee').click(makeToggleFunctionAndReverse('full_fee_discount', 'youth_fee_discount'));
    $('#form_full_fee_discount').click(makeToggleFunction('full_fee_discount_amount'));
    
    disable('youth_fee_discount');
    disable('youth_fee_discount_amount');
    
    $('#form_youth_fee').click(makeToggleFunctionAndReverse('youth_fee_discount', 'full_fee_discount'));
    $('#form_youth_fee_discount').click(makeToggleFunction('youth_fee_discount_amount'));
    
    disable('journey_subvention_amount');
    disable('journey_subvention_over_group');
    
    $('#form_journey_subvention').click(makeToggleFunction('journey_subvention_amount, journey_subvention_over_group'));
    
    disable('accountnumber');
    disable('iban');
    disable('bankcode');
    disable('bic');
    disable('bank');
    
    $('#form_pay_per_transfer').click(makeToggleFunctionAndReverse(null, 'accountnumber, iban, bankcode, bic, bank'));
    $('#form_pay_per_bank_collection').click(makeToggleFunction('accountnumber, iban, bankcode, bic, bank'));
    
    disable('journey_misc_text');
    disable('journey_offer_car_sharing');
    
    $('#form_journey_car').click(makeToggleFunctionAndReverse('journey_offer_car_sharing', 'journey_misc_text'));
    $('#form_journey_public_transport').click(makeToggleFunctionAndReverse(null, 'journey_offer_car_sharing, journey_misc_text'));
    $('#form_journey_misc').click(makeToggleFunctionAndReverse('journey_offer_car_sharing, journey_misc_text'));
});

function disable(id) {
	$('#form_' + id).attr("disabled", "disabled");
}

function enable(id) {
	$('#form_' + id).removeAttr("disabled");
}

function makeToggleFunctionAndReverse(elem1, elem2) {
	return function() {
        var array1;
        if (elem1 != null) {
	        array1 = elem1.split(", ");
	    } else{
	    	array1 = new Array();
	    }
        var array2;
        if (elem2 != null) {
	        array2 = elem2.split(", ");
	    } else {
	    	array2 = new Array();
	    }
        if($(this).attr('checked')) {
            for(var i = 0; i < array1.length; ++i)
                enable(array1[i]);
            for(var i = 0; i < array2.length; ++i)
            	disable(array2[i]);
        } else {
            for(var i = 0; i < array1.length; ++i)
                disable(array1[i]);
            for(var i = 0; i < array2.length; ++i)
            	enable(array2[i]);
        }
    };
}

function makeToggleFunction(elem) {
    return makeToggleFunctionAndReverse(elem, null);
}

function makeToggleFunctionReverse(elem) {
    return makeToggleFunction(null, elem);
}
		
function validate(formData, jqForm, options) {
	var data = new Array();
	
	removeErrorBox('personal');
	
	data.push(checkTextField(document.getElementById("form_lastname"), 'lastname_label'));
	
	data.push(checkTextField(document.getElementById("form_prename"), 'prename_label'));
	
	data.push(checkTextField(document.getElementById("form_street"), 'street_label'));
	
	data.push(checkStreetNrField(document.getElementById("form_streetnr"), 'streetnr_label'));
	
	data.push(checkTextField(document.getElementById("form_postcode"), 'postcode_label'));
	
	data.push(checkTextField(document.getElementById("form_city"), 'city_label'));
	
	data.push(checkTextField(document.getElementById("form_country"), 'country_label'));
	
	data.push(checkTelefon(document.getElementById("form_telefon"), 'telefon_label'));
	
	data.push(checkDate(document.getElementById("form_birthday"), 'birthday_label'));
	
	data.push(checkEmail(document.getElementById("form_email"), 'email_label'));
	
	removeError('children_count_label');
	removeError('children_care_local_label');
	removeError('children_care_camp_label');
	if (document.getElementById("form_children").checked) {
		data.push(checkIntegerField(document.getElementById("form_children_count"), 'children_count_label'));
		if (!(document.getElementById("form_children_care_local").checked || document.getElementById("form_children_care_camp").checked)) {
			data.push(document.getElementById("form_children_care_local"));
			addError('children_care_local_label');
			addError('children_care_camp_label');
		}
	}
	
	for(var i = 0; i < data.length; i++) {
		if (data[i] != null) {
			addErrorBox('personal');
			break;
		}
	}
    
    data.push(checkAccommodation());
    
    removeErrorBox('workgroup');
    
	data.push(checkIntegerField(document.getElementById("form_first_choice"), 'first_choice_label'));
	
	data.push(checkIntegerField(document.getElementById("form_second_choice"), 'second_choice_label'));
	
	data.push(checkIntegerField(document.getElementById("form_third_choice"), 'third_choice_label'));
	
	for(var i = data.length - 3; i < data.length; i++) {
		if (data[i] != null) {
			addErrorBox('workgroup');
			break;
		}
	}
	
	removeErrorBox('misc');
	
	if (document.getElementById("form_musician").checked) {
		data.push(checkTextField(document.getElementById("form_instrument"), 'instrument_label'));
		for(var i = data.length - 1; i < data.length; i++) {
			if (data[i] != null) {
				addErrorBox('misc');
				break;
			}
		}
	}
	
	if (document.getElementById("form_translater").checked) {
		data.push(checkTextField(document.getElementById("form_translate_from"), 'translater_label'));
		data.push(checkTextField(document.getElementById("form_translate_to"), 'translate_to_label'));
		
		for(var i = data.length - 2; i < data.length; i++) {
			if (data[i] != null) {
				addErrorBox('misc');
				break;
			}
		}
	}
	
	removeErrorBox('fees');
	if (document.getElementById("form_full_fee").checked && document.getElementById("form_full_fee_discount").checked) {
		data.push(checkFloatValue(document.getElementById("form_full_fee_discount_amount"), 'full_fee_discount_label'));
		for(var i = data.length - 1; i < data.length; i++) {
			if (data[i] != null) {
				addErrorBox('fees');
				break;
			}
		}
	}
	
	if (document.getElementById("form_youth_fee").checked && document.getElementById("form_youth_fee_discount").checked) {
		data.push(checkFloatValue(document.getElementById("form_youth_fee_discount_amount"), 'youth_fee_discount_label'));
		for(var i = data.length - 1; i < data.length; i++) {
			if (data[i] != null) {
				addErrorBox('fees');
				break;
			}
		}
	}
	
	if (!document.getElementById("form_full_fee").checked && !document.getElementById("form_youth_fee").checked) {
		data.push(document.getElementById("form_full_fee"));
		addErrorBox('fees');
	}
	
	removeErrorBox('payment');
	if (!document.getElementById("form_pay_per_transfer").checked && !document.getElementById("form_pay_per_bank_collection").checked) {
		data.push(document.getElementById("form_pay_per_transfer"));
		addErrorBox('payment');
	}
	
	if (document.getElementById("form_pay_per_bank_collection").checked) {
		var account = checkIntegerField(document.getElementById("form_accountnumber"), 'accountnumber_label');
		var iban = checkTextField(document.getElementById("form_iban"), 'iban_label');
		var bankcode = checkIntegerField(document.getElementById("form_bankcode"), 'bankcode_label');
		var bic = checkTextField(document.getElementById("form_bic"), 'bic_label');
		
		var error = false;
		
		var account_plus_bankcode = false;
		var iban_plus_bic = false;
		
		if (account == null) {
			account_plus_bankcode = true;
			iban_plus_bic = false;
			removeError('iban_label');
			data.push(null);
		} else if (iban == null) {
			account_plus_bankcode = false;
			iban_plus_bic = true;
			removeError('accountnumber_label');
			data.push(null);
		} else {
			data.push(account);
			error = true;
		}
		
		if (account_plus_bankcode) {
			removeError('bic_label');
			data.push(bankcode);
			if (bankcode != null) {
				error = true;
			}
		} else if (iban_plus_bic) {
			removeError('bankcode_label');
			data.push(bic);
			if (bic != null) {
				error = true;
			}
		} else {
			data.push(bankcode);
		}
		
		data.push(checkTextField(document.getElementById("form_bank"), 'bank_label'));
		for(var i = data.length - 1; i < data.length; i++) {
			if (data[i] != null) {
				error = true;
				break;
			}
		}
		if (error) {
			addErrorBox('payment');
		}
	}
	
	removeErrorBox('journey');
	if (document.getElementById("form_journey_subvention").checked) {
		data.push(checkFloatValue(document.getElementById("form_journey_subvention_amount"), 'journey_subvention_amount_label'));
		for(var i = data.length - 1; i < data.length; i++) {
			if (data[i] != null) {
				addErrorBox('journey');
				break;
			}
		}
	}
	
	for(var i = 0; i < data.length; i++) {
		if (data[i] != null) {
			data[i].focus();
			return false;
		}
	}
	showSubmitMessage();
	$('input').removeAttr("disabled");
	return true;
}

function showSubmitMessage() {
	$('#form_output').removeClass("hidden")
					 .addClass("visible");
	$('#form_content').addClass("hidden");
}

function prepareOutput() {
	$('#form_submit_message').addClass("hidden");
}

function checkAccommodation() {
	removeErrorBox('accommodation');
	removeError('private_accommodation_label');
	removeError('hotel_accommodation_label');
	removeError('mass_accommodation_label');
    if (document.getElementById("form_got_accommodation").checked) {
    	return null;
    } else if (document.getElementById("form_need_accommodation").checked) {
    	if (document.getElementById("form_private_accommodation_box").checked) {
    		return null;
    	} else if (document.getElementById("form_hotel_accommodation_box").checked) {
    		return null;
    	} else if (document.getElementById("form_mass_accommodation").checked) {
    		return null;
    	} else {
    		addErrorBox('accommodation');
    		addError('private_accommodation_label');
    		addError('hotel_accommodation_label');
    		addError('mass_accommodation_label');
    		return document.getElementById("form_private_accommodation_box");
    	}
    } else if (document.getElementById("form_offer_accommodation").checked) {
    	if (document.getElementById("form_private_accommodation_box").checked) {
    		return checkTextField(document.getElementById("form_private_accommodation"), 'private_accommodation_label');
    	} else if (document.getElementById("form_hotel_accommodation_box").checked) {
    		return checkTextField(document.getElementById("form_hotel_accommodation"), 'hotel_accommodation_label');
    	} else if (document.getElementById("form_mass_accommodation").checked) {
    		return null;
    	} else {
	    	addErrorBox('accommodation');
    		addError('private_accommodation_label');
    		addError('hotel_accommodation_label');
    		addError('mass_accommodation_label');
    		return document.getElementById("form_private_accommodation_box");
    	}
    }
}
		
function checkEmail(element, label) {
	var f = checkTextField(element, label);
	var emailRegExp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (!emailRegExp.test(element.value)) {
		addError(label);
		f = element;
	}
	return f;
}

function checkDate(element, label) {
	var f = checkTextField(element, label);
	if (f == null) {
		if(element.value.match(/^([0-9./])+$/)){
			removeError(label);
			f = null;
		}else{
			addError(label);
			f = element;
		}
    }
	return f;
}

function checkTelefon(element, label) {
	var f = checkTextField(element, label);
	if (f == null) {
		if(element.value.match(/^([0-9 +()/-])+$/)){
			removeError(label);
			f = null;
		}else{
			addError(label);
			f = element;
		}
    }
	return f;
}

function checkFloatValue(element, label) {
	var f = checkTextField(element, label);
    if (f == null) {
		if(element.value.match(/^([0-9])+(([\.,]){1}([0-9]){2})?$/)){
			removeError(label);
			f = null;
		}else{
			addError(label);
			f = element;
		}
    }
    return f;
}

function checkStreetNrField(element, label) {
    var f = checkTextField(element, label);
    if (f == null) {
		if(element.value.match(/^[0-9]+.*$/)){
			removeError(label);
			f = null;
		}else{
			addError(label);
			f = element;
		}
    }
    return f;
}

function checkIntegerField(element, label) {
	var f = checkTextField(element, label);
    if (f == null) {
		if(element.value.match(/^[0-9 ]+$/)){
			removeError(label);
			f = null;
		}else{
			addError(label);
			f = element;
		}
    }
    return f;
}

function checkCheckbox(element, label) {
	var f = null;
	if(!element.checked) {
		f = element;
		addError(label);
	} else {
		removeError(label);
	}
	return f;
}

function checkTextField(element, label) {
	var f = null;
	if(element.value.length == 0) {
		f = element;
		addError(label);
	} else {
		removeError(label);
	}
	return f;
}

function addErrorBox(box_id) {
	$('#form_' + box_id).addClass("box_error");
}

function removeErrorBox(box_id) {
	$('#form_' + box_id).removeClass("box_error");
}

function addError(label) {
	$('#form_' + label).addClass("error");
}

function removeError(label) {
	$('#form_' + label).removeClass("error");
}