function looksLikeDMYDate(dateString) {
	return dateString.match(/^\d\d\.\d\d\.\d\d\d\d$/);
}

function isDMYDate_(dateString) {
	if(!looksLikeDMYDate(dateString)) {
		return false;
	}
	else {
		var dmyString = dateString.split(".");
		var dmy = new Array(3);
		for (var i = 0; i < dmyString.length; i++) {
		  dmy[i] = parseInt(dmyString[i], 10);
		}
		var date = new Date();
		date.setFullYear(dmy[2], dmy[1]-1, dmy[0]);
		return (dmy[2] == date.getFullYear()) && (dmy[1]-1 == date.getMonth()) && (dmy[0] == date.getDate());
	}
}

jQuery.fn.toggleError = function(msg, show) {
	return this.each(function(){
  		var errorBoxId = $(this).attr("name") + "_jsErrorMessage";
  		errorBoxId = errorBoxId.replace("[","").replace("]","").replace(".","");
		if(show) {
			if($("#"+errorBoxId).length>0)return;
			$(this).after('<span id="' + errorBoxId + '"></span>');
			$("#"+errorBoxId).text(msg);
			$("#"+errorBoxId).addClass("error");
			$(this).addClass("error");
		}
		else {
			$("#"+errorBoxId).remove();
			$(this).removeClass("error");
		}
	});
};

jQuery.fn.getLabelText = function() {
	var id = this.attr('id');
	var text = "";
	$("label").each(function() { if($(this).attr('for')==id) { text=$(this).text(); } });
	return text;
};

function fieldSetError (el, show, message) {
	// el is a checkbox or such whose parent fieldset element is manipulated
	var errorBoxId = $(el).attr("name") + "_jsErrorMessage";
	var parentFieldset = $(el).parents('fieldset');
	if(!show) {
		$("#"+errorBoxId).remove();
	}
	else {
		$(parentFieldset).prepend('<span id="' + errorBoxId + '"></span>');
		$("#"+errorBoxId).text("Valitse ainakin yksi!");
		$("#"+errorBoxId).addClass("error");
	}
}

function resetErrors(e) {
	var form = document.getElementById(e.data.formId);
	checkDisableSubmits(form);
	for (var i=0; i<form.elements.length; i++) {
		if(form.elements[i].className.indexOf("textRequired")>-1 || form.elements[i].className.indexOf("dateRequired")>-1) {
			$(form.elements[i]).toggleError("", false);
		}
		else if(form.elements[i].className.indexOf("oneCheckboxRequired")>-1) {
			fieldSetError (form.elements[i], false, "")
		}
	}
}

function hasInsufficientUserInput(form) {
	var checkboxGroups = [];
	for (var i=0; i<form.elements.length; i++) {

		if(form.elements[i].className.indexOf("textRequired")>-1) {
			if(form.elements[i].value.length<1) {
				return false;
			}
		}
		if(form.elements[i].className.indexOf("dateRequired")>-1) {
			if(!isDMYDate_(form.elements[i].value)) {
				return false;
			}
		}
		if(form.elements[i].className.indexOf("oneCheckboxRequired")>-1) {
			if(checkboxGroups[form.elements[i].name]==undefined) {
				checkboxGroups[form.elements[i].name] = false;
			}
			if(form.elements[i].checked) {
				checkboxGroups[form.elements[i].name] = true;
			}
		}
	}
	for(var j in checkboxGroups) {
		if(checkboxGroups[j]==false) {
			return false;
		}
	}
	return true;
}

function checkDisableSubmits(form) {
	var formOk = hasInsufficientUserInput(form);
	for (var i=0; i<form.elements.length; i++) {
		if(form.elements[i].className.indexOf("submit")>-1) {
			form.elements[i].disabled = formOk?false:true;
			if(formOk) {
				$(form.elements[i]).removeClass('disabled');
			}
			else {
				$(form.elements[i]).addClass('disabled');
			}
		}
	}
}

function checkTextValue(e) {
	checkDisableSubmits(this.form);
	if(e.type == "keyup" && e.keyCode==9)return;
	if( $(this).val().length<1 ) {
		$(this).toggleError( $(this).getLabelText() + " ei saa olla tyhj\u00E4", true);
	}
	else {
		$(this).toggleError("", false);
	}
}

function checkDateValue(e) {
	checkDisableSubmits(this.form);
	$(this).val($(this).val().replace(/[^0-9.]/, ""));
	if( !looksLikeDMYDate ($(this).val() ) ) {
		$(this).toggleError("Anna p\u00E4iv\u00E4 muodossa pp.kk.vvvv", true);
	}
	if ( !isDMYDate_( $(this).val() ) ) {
		$(this).toggleError("Anna oikea p\u00E4iv\u00E4m\u00E4\u00E4r\u00E4", true);
	}
	else {
		$(this).toggleError("", false);
	}
}

function checkDateValueRemoveError(e) {
	if(e.type == "keyup" && e.keyCode==9)return;
  	this.value = this.value.replace(/[^0-9.]/, "");// clean out everything that is not a part of date
	checkDisableSubmits(this.form);
	if( isDMYDate_( $(this).val() ) || looksLikeDMYDate ( $(this).val() ) ) {
		 $(this).trigger("blur");
	}
}

function checkOneCheckboxSelected(e) {
	checkDisableSubmits(this.form);
	var name = $(e.target).attr("name");
	for(var i=0; i<this.form.elements.length; i++) {
		if(this.form.elements[i].getAttribute('name')==name && this.form.elements[i].checked) {
			fieldSetError(e.target, false, "");
			return;
		}
	}
	fieldSetError(e.target, true, "Valitse ainakin yksi!");
}

var debugRowCount=0;
function debug(msg) {
	if(!document.getElementById("debugWindow")) {
		$(document.body).append('<div id="debugWindow" style="position:absolute;right:0;top:0;border:solid 1px #333;overflow:scroll;width:500px;height:200px;padding:4px;font-size:12px;background-color:white;"></div>');
	}
	$("#debugWindow").prepend('<p style="margin:0 0 5px 0;">' + debugRowCount + ": " + msg + "</p>");
	debugRowCount++;
}

function init() {
	$('.textRequired').livequery("change", checkTextValue);
	$('.textRequired').livequery("blur", checkTextValue);
	$('.textRequired').livequery("keyup", checkTextValue);
	
	$('.dateRequired').livequery("change", checkDateValue);
	$('.dateRequired').livequery("blur", checkDateValue);
	$('.dateRequired').livequery("keyup", checkDateValueRemoveError);
	
	$('.checkable .oneCheckboxRequired').livequery("click", checkOneCheckboxSelected);
	$('.checkable input, .checkable select').livequery("keydown", function(e) { if(e.keyCode==13)return false } ); //disable enter key for inputs and selects
	$('.checkable').each(function() { checkDisableSubmits(this); });
}

$(document).ready(init);
