/*
	
	TO DO:
	- albo komunikat wrzucic do labela, albo wyrzucac przed formularzem jako listę prowadzaca do konkretnego pola
	- walidacja e-mail jakaś inteligentna i inne standardowe walidacje
	- przeglądnąć, co tu jest głupio zrobione

	
*/

var errorMessage = 'Formularz nie został poprawnie wypełniony. Proszę uzupełnić wskazane pola.';

function ShowMessage(elem, message) {
	// create error message <label><em>Message goes here</em></label>
	var div = elem.parentNode;
	var label = div.getElementsByTagName('label')[0];
	var em = document.createElement('em');
	em.className = 'error-message';
	addClass(div, 'error-div')
	var txt = document.createTextNode(message);
	em.appendChild(txt);
	label.appendChild(em);	
}
function HideAllMessages() {
	var ems = document.getElementsByTagName('em');
	for (var i = 0; i < ems.length; i++) {
		if (ems[i].className.indexOf('error-message') != -1) {
			ems[i].style.display = 'none';
		}
	}
	
	var divs = document.getElementsByTagName('div');
	for (var i = 0; i < divs.length; i++) {
		if (divs[i].className.indexOf('error-div') != -1) {
			remClass(divs[i], 'error-div');
		}
	}
	
}

function IsFilled(elem) {
	if (elem.value.length < 1 || elem.defaultValue || (elem.value==elem.title) ) { //zastanowic sie jak ominac problem defaulta 
		return false;
	} else {
		return true;
	}
}

function IsEmail(elem) {
	if (elem.value.indexOf("@") == -1 || elem.value.indexOf(".") == -1) {
		return false;
	} else {
		return true;
	}
}

function ValidateSingleField(elem, oXML) {
	var result = true;
	var validationNum = 0;
	var validationType = new Array();
	var validationMessage = new Array();
	
	var fields = oXML.getElementsByTagName('field');
	for (var i = 0; i < fields.length; i++) {
		if (fields[i].getAttribute('name') == elem.name) {
			var validations = fields[i].getElementsByTagName('validation');
			for (var j = 0; j < validations.length; j++) {
				validationType[j] = validations[j].getAttribute('type');
				var messages = validations[j].getElementsByTagName('message');
				for (var k = 0; k < messages.length; k++) {
					validationMessage[j] = messages[k].childNodes[0].nodeValue;
				}
			}
		}
	}
	// code above should create something like:
	// validationType[0] = 'required';	validationMessage[0] = 'To pole jest wymagane';
	// validationType[1] = 'email'; validationMessage[1] = 'Email nie jest poprawny';
	
	for (var i = 0; i < validationType.length; i++) {
		switch (validationType[i]) {
			case 'required':
				if (!IsFilled(elem)) {
					if (result) 
						ShowMessage(elem, validationMessage[i]);
					result = false;
				}
				break;
			case 'email':
				if (!IsEmail(elem)) {
					if (result) 
						ShowMessage(elem, validationMessage[i]);
					result = false;
				}
				break;
		}
	}
	return result;
}

function CreateXMLDOM() {
	if (window.ActiveXObject) {
		/* for MSIE */
		var signatures = ['MSXML2.DOMDocument.5.0', 'MSXML2.DOMDocument.4.0', 'MSXML2.DOMDocument.3.0', 'MSXML2.DOMDocument', 'Microsoft.XmlDom'];
		for (var i=0; i<signatures.length; i++) {
			try {
				return new ActiveXObject(signatures[i]);
			} catch (error) {
			// do nothing
			}
		}
		throw new Error('MSXML not supported.');
	} else if (document.implementation && document.implementation.createDocument) {
		/* for normal browsers */
		return document.implementation.createDocument('', '', null);
	} else {
		throw new Error('XML DOM not supported.');
	}
}

// Main function
function AutoValidation(thisForm, pathToXML) {
	if(!document.getElementById || !document.createTextNode){ return false; }
	var resultGlobal = true; // validation result (false if computed result is negative)
	var result; // single field validation result
	var focusMark; // marks focus
	
	// create XML object and load XML file
	var oXML = CreateXMLDOM(); 
	oXML.async = false;
  	oXML.load(pathToXML);
	
	// clear all messages
	HideAllMessages();	
	
	// looping thru all form elements and processing those with class="validate"
	for (var i = 0; i < thisForm.elements.length; i++) {
		var elem = thisForm.elements[i];		
		if ((elem.className.indexOf('validate') != -1) && elem.disabled == false) {
			result = ValidateSingleField(elem, oXML);
			if (!result && !focusMark) {
				var elemFocus = elem;
				focusMark = true;
			}
			resultGlobal = resultGlobal && result;
		}
	}

	if (!resultGlobal) {
		alert(errorMessage);
		elemFocus.focus();
	}

	// return validation result
	return resultGlobal;
}


/* by Radek N. */
