// JavaScript Document

// utility functions
	function getPrevious(node, tagname) {
	    while(node.previousSibling) {
	        node = node.previousSibling;
	        if(node.tagName == tagname) return node;
		}

		return null;
	}

	function getNext(node, tagname) {
	    while(node.nextSibling) {
	        node = node.nextSibling;
	        if(node.tagName == tagname) return node;
		}

		return null;
	}

	function inArray(needle, haystack)
	// Returns true if the passed value is found in the
	// array.  Returns false if it is not.
	{
	    var i;
	    for (i=0; i < haystack.length; i++) {
	        // Matches identical (===), not just similar (==).
	        if (haystack[i] === needle) {
	            return true;
	        }
	    }
	    return false;
	};


// radio button functions
	function getRadioValue(radioObj) {
		if(!radioObj)
			return "";
		var radioLength = radioObj.length;
		if(radioLength == undefined)
			if(radioObj.checked)
				return radioObj.value;
			else
				return "";
		for(var i = 0; i < radioLength; i++) {
			if(radioObj[i].checked) {
				return radioObj[i].value;
			}
		}
		return "";
	}

	function setRadioValue(radioObj, newValue) {
		if(!radioObj)
			return;
		var radioLength = radioObj.length;
		if(radioLength == undefined) {
			radioObj.checked = (radioObj.value == newValue.toString());
			return;
		}
		for(var i = 0; i < radioLength; i++) {
			radioObj[i].checked = false;
			if(radioObj[i].value == newValue.toString()) {
				radioObj[i].checked = true;
			}
		}
	}

// class 'LinkedInfo'
	function LinkedInfo(name, form, textInputs, selectInputs, textareaInputs, radioInputs, notRequiredFields, currentWerkervaring, maxWerkervaring, newWerkervaring, alertCannotDelete, alertFillAllFields) {
	    this.name = name;
	    this.objectName = 'li_' + name;
	    
	    if(!form.name) {
	        form = window.document.getElementById(form);
		}
		this.form = form;
	
	    this.textInputs = textInputs; //Array('bedrijf', 'plaats', 'functie');
	    this.selectInputs = selectInputs; //Array('beginjaar', 'eindjaar');
	    this.textareaInputs = textareaInputs; //Array('werkzaamheden');
	    this.radioInputs = radioInputs; //Array('werkzaamheden');
	    this.notRequiredFields = notRequiredFields;
		this.currentWerkervaring = currentWerkervaring;
		this.maxWerkervaring = maxWerkervaring;
		this.maxNumber = maxWerkervaring;
		this.newWerkervaring = newWerkervaring;
        this.alertCannotDelete = alertCannotDelete;
		this.alertFillAllFields = alertFillAllFields;
		
		// end of initialization
		
		// start of methods


		this.allFull = function() {
		    return this.everythingOk(true);
		}

		this.allEmpty = function() {
		    return this.everythingOk(false);
		}

		this.everythingOk = function(full) {
		    for(input in this.textInputs) {
				var element = this.textInputs[input];
				var value = window.document.getElementById(this.name + '_' + element).value; 
			    if((value == '') == full && !(full && inArray(element, this.notRequiredFields)))
			        return false;
			}
		    for(input in this.selectInputs) {
				var element = this.selectInputs[input];
				var select = window.document.getElementById(this.name + '_' + element);
			    if((select.options[select.selectedIndex].value == '') == full && !(full && inArray(element, this.notRequiredFields)))
			        return false;
			}
		    for(input in this.textareaInputs) {
				var element = this.textareaInputs[input];
			    if((window.document.getElementById(this.name + '_' + element).value == '') == full && !(full && inArray(element, this.notRequiredFields)))
			        return false;
			}
		    for(input in this.radioInputs) {
				var element = this.radioInputs[input];
				var radios = this.form.elements[this.name + '_' + element];

			    if((getRadioValue(radios) == '') == full && !(full && inArray(element, this.notRequiredFields)))
			        return false;
			}
			return true;
		}

		this.createNewWerkervaring = function() {
		    var form = this.form;
		    var id = this.newWerkervaring;
		    var inputs = this.textInputs.concat(this.selectInputs, this.textareaInputs, this.radioInputs);
		    for(input in inputs) {
		        var element = inputs[input];
		        var hidden = window.document.createElement('input');
		        hidden.type = 'hidden';
		        hidden.id = this.name + '_' + id + '_' + element;
		        hidden.name = this.name + '[' + id + '][' + element + ']';
		        hidden.value = '';
		        form.appendChild(hidden);
			}

			return id;
		}

		this.removeWerkervaringFields = function(id) {
		    var form = this.form;
		    var inputs = this.textInputs.concat(this.selectInputs, this.textareaInputs, this.radioInputs);
		    for(input in inputs) {
		        form.removeChild(window.document.getElementById(this.name + '_' + id + '_' + inputs[input]));
		    }
		}

		this.createWerkervaringNumber = function() {
		    var werklinkseparator = window.document.getElementById(this.name + 'separator');
		    var id = 'new' + (++this.maxWerkervaring);

	        var streepje = window.document.createTextNode(' - ');
	        var newlink = window.document.createElement('b');
	        newlink.onclick = new Function('window.' + this.objectName + '.changeWerkervaring("' + id + '")');
	        newlink.style.cursor = 'pointer';
	        newlink.innerHTML = ++this.maxNumber;
	        newlink.id = id + '_' + this.name + '_number';

	        werklinkseparator.parentNode.insertBefore(newlink, werklinkseparator);
	        werklinkseparator.parentNode.insertBefore(streepje, newlink);

	        return id;

		}

		this.removeWerkervaringNumber = function() {
		    var element = window.document.getElementById(this.newWerkervaring + '_' + this.name + '_number');
		    if(element) {
			    this.maxNumber--;
		        element.parentNode.removeChild(element.previousSibling);
		        element.parentNode.removeChild(element);
			}
		}

		this.colorWerkervaringNumbers = function(deleteId) {
		    var werklinkseparator = window.document.getElementById(this.name + 'separator');
			var werklink = window.document.getElementById(this.name + 'separator');
		    var number = werklink.parentNode.getElementsByTagName('B').length;

		    while(getPrevious(werklink, 'B')) {
		        werklink = getPrevious(werklink, 'B');
		        if(deleteId) {
		            if(werklink.id == deleteId + '_' + this.name + '_number') {
		                deletelink = werklink;
		                werklink = getPrevious(werklink, 'B');
		                
		                // delete the ' - '
		                if(deletelink.previousSibling) {
		                    deletelink.parentNode.removeChild(deletelink.previousSibling);
						} else if(deletelink.nextSibling && deletelink.nextSibling != werklinkseparator) {
							deletelink.parentNode.removeChild(deletelink.nextSibling);
					    }
					    
					    // delete the number
		                deletelink.parentNode.removeChild(deletelink);
		                
						this.maxNumber--;

		                if(!werklink) break;
					}
					werklink.innerHTML = --number;
				}
		        if(werklink.id == this.currentWerkervaring + '_' + this.name + '_number' || werklink.id == this.newWerkervaring + '_' + this.name + '_number') {
		            werklink.style.color = "black";
				} else {
					werklink.style.color = "#666666";
				}
			}
		}

		this.emptyForm = function() {
		    for(input in this.textInputs) {
				var element = this.textInputs[input];
			    window.document.getElementById(this.name + '_' + element).value = "";
			}
			for(input in this.selectInputs) {
				var element = this.selectInputs[input];
				var select = window.document.getElementById(this.name + '_' + element);
				select.selectedIndex = 0;
			}
		    for(input in this.textareaInputs) {
				var element = this.textareaInputs[input];
				var areaElement = window.document.getElementById(this.name + '_' + element);
			    areaElement.value = "";
			}
			for(input in this.radioInputs) {
				var element = this.radioInputs[input];
				var radios = this.form.elements[this.name + '_' + element];
				setRadioValue(radios, '');
			}
		}

		this.removeCurrentWerkervaring = function() {
		    var werklinkseparator = window.document.getElementById(this.name + 'separator');

		    if(this.newWerkervaring) {
				if(this.maxNumber <= 1) {
					alert(alertCannotDelete);
				} else {
				    this.emptyForm();

				    var lastId = werklinkseparator.parentNode.getElementsByTagName('b')[this.maxNumber - 2].id;
				    var lastNumber = lastId.substring(0, lastId.length - ('_' + this.name + "_number").length);

			      	this.changeWerkervaring(lastNumber);
			    }
			} else {
			    if(confirm("Weet je zeker dat je deze werkervaring wil verwijderen?")) {
			        toDelete = this.currentWerkervaring;

			        this.changeWerkervaring(this.getIdToGoToIfIDelete(toDelete));
					this.removeWerkervaringFields(toDelete);
					if(("" + toDelete).substring(0, 3) != 'new') {
						this.addToDeleteList(toDelete);
					}
				    this.colorWerkervaringNumbers(toDelete);
				}
			}
		}

		this.getIdToGoToIfIDelete = function(id) {
		    var toDelete = window.document.getElementById(id + '_' + this.name + '_number');
		    var toChange = getPrevious(toDelete, 'B');
		    if(!toChange) toChange = getNext(toDelete, 'B');
		    if(!toChange) return 0;
		    else return toChange.id.substring(0, toChange.id.length - ('_' + this.name + "_number").length);
		}

		this.addToDeleteList = function(id) {
		    var form = this.form;
	        var hidden = window.document.createElement('input');
	        hidden.type = 'hidden';
	        hidden.name = this.name + 'delete[]';
	        hidden.value = id;
	        form.appendChild(hidden);
		}

		this.changeWerkervaring = function(id) {
		    var all_full = this.allFull();
			var all_empty = this.allEmpty();
		    if(!(all_full || (all_empty && !this.currentWerkervaring))) {
		        alert(this.alertFillAllFields);
		        return false;
			}

			if(id == this.newWerkervaring) id = 0;

			if(this.newWerkervaring && all_full) {
			    this.currentWerkervaring = this.createNewWerkervaring();
				this.newWerkervaring = false;
			}

			if(this.newWerkervaring && id && all_empty) {
				this.removeWerkervaringNumber();
				this.newWerkervaring = false;
			} else if(!id && !this.newWerkervaring) {
			    this.newWerkervaring = this.createWerkervaringNumber();
			}

		    // save input fields to hiddenfields
		    for(input in this.textInputs) {
				var element = this.textInputs[input];
				newValue = id ? window.document.getElementById(this.name + '_' + id + '_' + element).value : "";
				if(this.currentWerkervaring)
				    window.document.getElementById(this.name + '_' + this.currentWerkervaring + '_' + element).value = window.document.getElementById(this.name + '_' + element).value;
			    window.document.getElementById(this.name + '_' + element).value = newValue;
			}
			for(input in this.selectInputs) {
				var element = this.selectInputs[input];
				var newValue = id ? window.document.getElementById(this.name + '_' + id + '_' + element).value : "";
				var select = window.document.getElementById(this.name + '_' + element);
				if(this.currentWerkervaring)
				    window.document.getElementById(this.name + '_' + this.currentWerkervaring + '_' + element).value = select.options[select.selectedIndex].value;
			    for(i = 0; i < select.options.length; i++) {
			        if(select.options[i].value == newValue) {
						select.selectedIndex = i;
						break;
					}
				}
			}
		    for(input in this.textareaInputs) {
				var element = this.textareaInputs[input];
				var areaElement = window.document.getElementById(this.name + '_' + element);
				var hiddenElement = window.document.getElementById(this.name + '_' + this.currentWerkervaring + '_' + element);
				if(this.currentWerkervaring)
				    hiddenElement.value = unescape(areaElement.value);
				if(!id) {
				    areaElement.value = "";
				} else {
	       			var newHiddenElement = window.document.getElementById(this.name + '_' + id + '_' + element);
					areaElement.value = newHiddenElement.value.replace("<BR>", newline_char).replace("<br />", newline_char);
				}
			}
		    for(input in this.radioInputs) {
				var element = this.radioInputs[input];
				var newValue = id ? window.document.getElementById(this.name + '_' + id + '_' + element).value : "";
				var radios = this.form[this.name + '_' + element];
				if(this.currentWerkervaring)
				    window.document.getElementById(this.name + '_' + this.currentWerkervaring + '_' + element).value = getRadioValue(radios);
				setRadioValue(radios, newValue);
			}

			this.currentWerkervaring = id;

			this.colorWerkervaringNumbers();

			return true;
		}
		
		// outialization
		// make it load on load.
		window[this.objectName] = this;
		var objName = this.objectName;
		var oldEvt = window.onload;
		window.onload = function() { if (oldEvt) oldEvt(); window[objName].colorWerkervaringNumbers(); }
		
		// also, make it update on submit.
		var oldFormEvt = this.form.onsubmit;
		this.form.onsubmit = function() { return oldFormEvt ? (oldFormEvt() && window[objName].changeWerkervaring(0)) : window[objName].changeWerkervaring(0); }
	}

