
var propertyNames = [
	"voornaam", 
	"voorletters", 
	"tussenvoegsel",
	"achternaam", 
	"geslacht", 
	"geboortedatum", 
	"email"
];

var entityTypeName = "gebruiker";

var container = null;
var rowTemplateId = "paspoorthouder-row-template";
var rowTemplate = null;
var rowsAdded = new Array();
var frm = null;



window.onload = function() {
	frm = document.forms["aanvraag-digitaal-paspoort"];
	rowTemplate = document.getElementById(rowTemplateId);
	container = rowTemplate.parentNode;
	rowTemplate.style.visibility = "hidden";
	// addEntity();	
};


function fillRow(entity, idx) {
	for (var label in entity) {
		document.getElementById(entityTypeName + "-" + idx + "-" + label + "-input").value = entity[label];
	}
}

// Add empty entity form
function addEntity(entity) {

	var row = rowTemplate.cloneNode(true);
	var idx = rowsAdded.length + 1;
	row.id = entityTypeName + "-" + idx + "-row";
	
	row.style.visibility = "visible";

	container.removeChild(rowTemplate);
	container.appendChild(row);
	
	for (var i = 0; i < frm.elements.length; i++) {
		var element = frm.elements[i];
		var parts = element.name.split(entityTypeName + "-" + 0 + "-");
		if (parts.length == 2) {
			element.name = entityTypeName + "-" + idx + "-" + parts[1];
			element.id = element.name + "-input";
		}
	}
	
	container.appendChild(rowTemplate);

	if (entity) {
		fillRow(entity, idx);
	}
	
	rowsAdded[rowsAdded.length] = row.id;
	updateList();
}

function processBatch() {
	var batch = document.getElementById("batch-input").value;
	var json = "";
	var entities = null;
	if (batch) {
		try {
			json = cvsToJson(batch, "\t");
			// alert(json);
			entities = eval("(" + json + ")");
		} catch(error) {
			alert("De ingevoerde gebruikerslijst bevat fouten:\n" + error.description);
		}
	} else {
		alert("Geen gebruikerslijst gevonden");
		return false;
	}
	
	for (var i = 0; i < entities.entities.length; i++) {
		addEntity(entities.entities[i]);
	}
	
	// Clear the batch input field
	document.getElementById("batch-input").value = "";
}

function validateForm() {
	var msg = "";
	var isValid = true;

	// Validate company
	var prevElName = "";
	for (var i = 0; i < frm.elements.length; i++) {
		var el = frm.elements[i];
		
		// Skip elements with the same name
		if (el.name == prevElName) {
			continue;
		}
		
		var label = getLabel(el);
		
		// Skip gebruikers
		if (el.name.substring(0, entityTypeName.length) == entityTypeName) {
			continue;
		}
		
		if (label && hasClassName(label, "required")) {
		
			var value = null;
			if (el.type == "radio" || el.type == "checkbox") {
				value = getRadioCheckboxValues(el.name);
			} else {
				value = el.value;
			}
			
			if (value.length == 0) {
				// addClassName(label, "has-errors");
				addClassName(el.parentNode, "has-errors");
				msg += getLabel(el).innerHTML + " is verplicht (" + el.name + ")\n";
				isValid = false;
				
			} else if (hasClassName(el.parentNode, "has-errors")) {
				// removeClassName(label, "has-errors");
				removeClassName(el.parentNode, "has-errors");
			}
		}
		
		prevElName = el.name;
	}
	
	//*
	// Validate subentities
	var debug = "Test messages:\n\n";
	
	
	for (var i = 1; true; i++) {
	
		var prefix = entityTypeName + "-" + i;

		if (document.getElementById(prefix + "-row")) {
		
			// Skip empty rows
			var isEmpty = true;
			for (var j = 0; j < propertyNames.length; j++) {
				var el = document.getElementById(prefix + "-" + propertyNames[j] + "-input");
				removeClassName(el.parentNode, "has-errors");
				
				if(el.value.length != 0) {
					isEmpty = false;
					break;
				}
			}
			
			if (isEmpty) {
				// alert("Lege regel overgeslagen");
				continue;
			}
		
			// debug += "Found row: " + prefix + "-row\n";
		
			for (var j = 0; j < propertyNames.length; j++) {
				var el = document.getElementById(prefix + "-" + propertyNames[j] + "-input");
				var valueValid = true;
				
				if (propertyNames[j] != "tussenvoegsel") {
					if(el.value.length == 0) {
						valueValid = false;
					}
				}
				
				if (propertyNames[j] == "geboortedatum") {
					if(!isDate(el.value)) {
						valueValid = false;
					}
				}
				
				if (propertyNames[j] == "email") {
					if(!isMail(el.value)) {
						valueValid = false;
					}
				}
				
				if (!valueValid) {
					addClassName(el.parentNode, "has-errors");
					isValid = false;
				} else if (hasClassName(el.parentNode, "has-errors")) {
					removeClassName(el.parentNode, "has-errors");
				}
			}
			
		} else {
			// debug += "Row not found: " + prefix + "-row\n";
			if (i == 1) {
				isValid = false;
				msg += "\nVul minimaal 1 gebruiker in\n";
			}		
			break;
		}
	}
	
	// alert(debug);
	//*/
	
	if (isValid) {
		msg = "Het formulier is correct ingevuld";
	} else {
		msg = "Het formulier bevat fouten. Deze zijn gemarkeerd met een oranje lijn\n\n" + msg;
	}
	
	alert(msg);

	return isValid;
	// return false;
}


function getRadioCheckboxValues(propertyName) {
	var values = new Array();
	
	var elements = frm.elements[propertyName];
	for (var i = 0; i < elements.length; i++) {
		if (elements[i].checked && elements[i].value.length > 0) {	
			values[values.length] = elements[i].value;
		}
	}
	return values;
}


function addClassName(el, className) {
	if (el.className) {
		el.className += " " + className;
	} else {
		el.className += className;
	}
}

function hasClassName(el, className) {
	var classNames = el.className.split(" ");
	for (var i = 0; i < classNames.length; i++) {
		if (classNames[i] == className) {
			return true;
		}
	}
	return false;
}

function removeClassName(el, className) {

	var classNames = el.className.split(" ");
	
	var newClassNames = "";
	for (var i = 0; i < classNames.length; i++) {
		if (classNames[i] != className) {
			newClassNames += classNames[i] + " ";
		} else {
			// alert("class \"" + classNames[i] + "\" removed from field " + el.id);
		}
	}
	// alert("New class names: " + newClassNames);
	el.className = newClassNames;
}


function getLabel(el) {
	return document.getElementById(el.name + "-label");
}

function markError(el) {

}


// Validate entity
function validateEntity(idx) {
	if (frm.elements[entityTypeName + "-" + idx + "-achternaam"].value = "") {
		alert("Gebruiker " + idx + " heeft geen achternaam");
	}
};

function removeAllEntities() {
	var templateRow = document.getElementById(rowTemplateId);
	for (var i = 0; i < rowsAdded.length; i++) {
		var row = document.getElementById(rowsAdded[i]);
		container.removeChild(row);
	}
	rowsAdded = new Array();
}

function updateList() {

}

/*
Conversions
***********************************************************************************************/


// Process tab separated text
function cvsToJson(source, separator) {

	var errorlines = "";
	var rowSeparator = "\n";
	
	separator = (separator) ? separator : "\t";
	var entitiesJson = "{\"entities\" : [\n";
	var entitiesTxt = source.split(rowSeparator);
	for (var i = 0; i < entitiesTxt.length; i++) {
		
		var entityTxt = entitiesTxt[i].split("\r")[0];

		var propertiesTxt = entityTxt.split(separator);
		if (propertiesTxt.length != propertyNames.length) {
			continue;
			errorlines += entityTxt + "\n";
		}
		
		entitiesJson += "\t{";
		for (var j = 0; j < propertiesTxt.length; j++) {
			entitiesJson += "\"" + propertyNames[j] + "\" : \"" + propertiesTxt[j] + "\"";
			if (j < propertiesTxt.length - 1) {
				entitiesJson += ", ";
			}
		}
		entitiesJson += "}";
		if (i < entitiesTxt.length - 1) {
			entitiesJson += ",";
		}
		entitiesJson += "\n";
	}
	entitiesJson += "]}";
	return entitiesJson;
}
