var selectOpenDropDown = null;    
var selectChangedFunction = null;
var selectChanged = false;

window.onblur = function() {
	if (selectOpenDropDown) {
		selectOpenDropDown.style.display = 'none';
		selectOpenDropDown.style.top = '0px';
		selectOpenDropDown = null;
	}
}

function pageInit() {
	document.getElementById('pageBody').onclick = function(e) {
		if (!e) var e = window.event;
		
		var targ = (e.target ? e.target : e.srcElement);
		
		if (targ.className == 'selectFirstLine'
			|| targ.className == 'selectMultipleOn'
			|| targ.className == 'selectMultipleOff') return;
		
		if (selectOpenDropDown) {
			selectOpenDropDown.style.display = 'none';
			selectOpenDropDown.style.top = '0px';
			selectOpenDropDown = null;
		}
	}
};

if (! Array.indexOf) {
	Array.prototype.indexOf = function(obj) {
		for (var i = 0; i < this.length; i++) {
			if (this[i] == obj) return i;
		}
		
		return -1;
    }
}

function verticalOffset(obj) {
	var offsetPx = 0;
	
	if (obj.offsetParent) {
		do {
			offsetPx += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	
	return offsetPx;
}

function verticalHeight(obj) {
	if (obj.offsetHeight) {
		return obj.offsetHeight;
	} else {
		return obj.style.pixelHeight;
	}
}

function verticalScroll() {
	if (window.pageYOffset) {
		return window.pageYOffset;
	} else {
		return document.documentElement.scrollTop;
	}
}

function selectToggle() {
	var selectDropDown = this.nextSibling;
	
	if (selectDropDown.style.display == 'block') {
		selectDropDown.style.display = 'none';
		selectDropDown.style.top = '0px';
		
		selectOpenDropDown = null;
		
		if (selectChanged && selectChangedFunction != null) window[selectChangedFunction].call(selectChanged);
	} else {
		if (selectOpenDropDown) {
			selectOpenDropDown.style.display = 'none';
			selectOpenDropDown.style.top = '0px';
			
			if (selectChanged && selectChangedFunction != null) window[selectChangedFunction].call(selectChanged);
			
			selectOpenDropDown = null;
		} else {
			if (window.innerHeight) {
				var windowHeight = window.innerHeight;
			} else {
				var windowHeight = document.documentElement.clientHeight;
			}
			
			if (window.pageYOffset) {
				var windowScroll = window.pageYOffset;
			} else {
				var windowScroll = document.documentElement.scrollTop;
			}
			
			selectDropDown.style.display = 'block';
			
			var verticalSpaceLeft = windowHeight
								  + windowScroll
								  - verticalOffset(selectDropDown)
								  - verticalHeight(selectDropDown);
			
			if (verticalSpaceLeft < 0) {
				var moveOffset = verticalHeight(selectDropDown)
							   + verticalHeight(selectDropDown.parentNode)
							   - 2;
				
				selectDropDown.style.top = '-' + moveOffset + 'px';
			}
			
			if (selectDropDown.lastChild.value != '') {
				selectChangedFunction = selectDropDown.lastChild.value;
			} else {
				selectChangedFunction = null;
			}
			
			selectChanged = false;
			
			selectOpenDropDown = selectDropDown;
		}
	}
}

function selectSingleClick() {
	var selectInput = this.parentNode.firstChild;
	
	if (selectInput.value != this.firstChild.value) {
		selectChanged = this.parentNode;
		
		var selectChildren = this.parentNode.childNodes;
		
		for (var i = 0; i < selectChildren.length; i++) {
			if (selectChildren.item(i).nodeType == 1
				&& selectChildren.item(i).className == 'selectSingleOn') {
				
				selectChildren.item(i).className = 'selectSingleOff';
			}
		}
		
		selectInput.value = this.firstChild.value;
		
		if (this.textContent) {
			var selectFirstLineText = document.createTextNode(this.textContent);
		} else {
			var selectFirstLineText = document.createTextNode(this.innerText);
		}
		
		this.parentNode.previousSibling.replaceChild(
			selectFirstLineText,
			this.parentNode.previousSibling.firstChild
		);
		
		this.className = 'selectSingleOn';
	}
	
	selectToggle.call(this.parentNode.firstChild.nextSibling);
}

function selectMultipleClick() {
	var selectionCount = parseInt(this.parentNode.firstChild.value, 10);
	
	if (this.firstChild.name == '' || this.firstChild.name == null) {
		this.className = 'selectMultipleOn';
		this.firstChild.name = this.parentNode.firstChild.nextSibling.value;
		
		selectionCount++;
	} else {
		this.className = 'selectMultipleOff';
		this.firstChild.name = '';
		
		selectionCount--;
	}
	
	if (selectChangedFunction != null) window[selectChangedFunction].call(this.parentNode);
	
	switch (selectionCount) {
		case 0:
			var selectFirstLineText = document.createTextNode(
				this.parentNode.previousSibling.firstChild.value
			);
			break;
		case 1:
			var selectFirstLineText = document.createTextNode(
				'1 optie geselecteerd'
			);
			break;
		default:
			var selectFirstLineText = document.createTextNode(
				selectionCount + ' opties geselecteerd'
			);
			break;
	}
	
	this.parentNode.previousSibling.replaceChild(
		selectFirstLineText,
		this.parentNode.previousSibling.lastChild
	);
	
	this.parentNode.firstChild.value = selectionCount;
}

function replaceSelect(selectElement, inputMode) {
	var selectElementChildren = selectElement.childNodes;
	var selectedOptions = [];
	var selectOptions = [];
	
	var selectOuter = document.createElement('div');
	selectOuter.className = 'select';
	
	var selectFirstLine = document.createElement('div');
	selectFirstLine.className = 'selectFirstLine';
	selectFirstLine.onmousedown = selectToggle;
	
	var selectDropDown = document.createElement('div');
	selectDropDown.className = 'selectDropDown';
	selectDropDown.style.display = 'none';
	
	if (inputMode == 'multiple') {
		for (var i = 1; i < selectElementChildren.length; i++) {
			if (selectElementChildren.item(i).nodeType == 1) {
				if (selectElementChildren.item(i).textContent) {
					var optionContent = selectElementChildren.item(i).textContent;
				} else {
					var optionContent = selectElementChildren.item(i).innerHTML;
				}
				
				if (optionContent != 'alles weergeven'
					&& selectElementChildren.item(i).getAttribute('selected')) {
					
					selectedOptions[selectedOptions.length] = selectElementChildren.item(i);
				}
				
				selectOptions[selectOptions.length] = selectElementChildren.item(i);
			}
		}
		
		var selectNoSelectionText = document.createElement('input');
		selectNoSelectionText.type = 'hidden';
		selectNoSelectionText.name = '';
		
		if (selectOptions[0].textContent) {
			selectNoSelectionText.value = selectOptions[0].textContent;
		} else {
			selectNoSelectionText.value = selectOptions[0].innerHTML;
		}
		
		selectFirstLine.appendChild(selectNoSelectionText);
		
		if (selectedOptions.length == 0) {
			var selectFirstLineText = document.createTextNode(
				selectNoSelectionText.value
			);
		} else {
			var selectedOptionsText = (selectedOptions.length == 1)
				? ' optie geselecteerd'
				: ' opties geselecteerd';
			
			var selectFirstLineText = document.createTextNode(
				selectedOptions.length + selectedOptionsText
			);
		}
		
		var selectSelectedCount = document.createElement('input');
		selectSelectedCount.type = 'hidden';
		selectSelectedCount.value = selectedOptions.length;
		
		selectDropDown.appendChild(selectSelectedCount);
		
		var selectName = document.createElement('input');
		selectName.type = 'hidden';
		selectName.value = selectElement.name;
		
		selectDropDown.appendChild(selectName);
		
		for (var i = 1; i < selectOptions.length; i++) {
			var optionNode = document.createElement('div');
			optionNode.onmousedown = selectMultipleClick;
			
			if (selectOptions[i].getAttribute('selected')) {
				optionNode.className = 'selectMultipleOn'
			} else {
				optionNode.className = 'selectMultipleOff'
			}
			
			var optionValue = document.createElement('input');
			optionValue.type = 'hidden';
			optionValue.value = selectOptions[i].value;
			
			if (selectOptions[i].getAttribute('selected')) {
				optionValue.name = selectElement.name;
			} else {
				optionValue.name = '';
			}
			
			if (selectOptions[i].textContent) {
				var optionText = document.createTextNode(selectOptions[i].textContent);
			} else {
				var optionText = document.createTextNode(selectOptions[i].innerText);
			}
			
			optionNode.appendChild(optionValue);
			optionNode.appendChild(optionText);
			selectDropDown.appendChild(optionNode);
		}
	} else {
		for (var i = 0; i < selectElementChildren.length; i++) {
			if (selectElementChildren.item(i).nodeType == 1) {		
				if (selectElementChildren.item(i).getAttribute('selected') == 'selected'
					|| selectElementChildren.item(i).getAttribute('selected') == true) {
					selectedOptions[selectedOptions.length] = selectElementChildren.item(i);
				}
				
				selectOptions[selectOptions.length] = selectElementChildren.item(i);
			}
		}
		
		var selectInput = document.createElement('input');
		selectInput.type = 'hidden';
		selectInput.id   = selectElement.name;
		selectInput.name = selectElement.name;
		
		selectDropDown.appendChild(selectInput);
		
		if (selectedOptions.length > 0) {
			if (selectedOptions[0].textContent) {
				var selectFirstLineText = document.createTextNode(selectedOptions[0].textContent);
			} else {
				var selectFirstLineText = document.createTextNode(selectedOptions[0].innerText);
			}
			
			selectInput.value = selectedOptions[0].value;
		} else {
			if (selectOptions[0].textContent) {
				var selectFirstLineText = document.createTextNode(selectOptions[0].textContent);
			} else {
				var selectFirstLineText = document.createTextNode(selectOptions[0].innerText);
			}
			
			selectInput.value = selectOptions[0].value;
			selectedOptions[0] = selectOptions[0];
		}
		
		var hasSelection = false;
		
		for (var i = 0; i < selectOptions.length; i++) {
			var optionNode = document.createElement('div');
			optionNode.onmousedown = selectSingleClick;
			
			if (! hasSelection && selectedOptions.indexOf(selectOptions[i]) != -1) {
				optionNode.className = 'selectSingleOn';
				hasSelection = true;
			} else {
				optionNode.className = 'selectSingleOff';
			}
			
			var optionValue = document.createElement('input');
			optionValue.type = 'hidden';
			optionValue.value = selectOptions[i].value;
			optionValue.name = '';
			
			if (selectOptions[i].textContent) {
				var optionText = document.createTextNode(selectOptions[i].textContent);
			} else {
				var optionText = document.createTextNode(selectOptions[i].innerText);
			}
			
			optionNode.appendChild(optionValue);
			optionNode.appendChild(optionText);
			selectDropDown.appendChild(optionNode);
		}
	}
	
	if (selectElement.onchange) {
		var changedFunctionString = selectElement.onchange.toString();
		
		if (changedFunctionString.substring(0, 8) == 'function') {
			changedFunctionString = changedFunctionString.substring(25, changedFunctionString.length - 3);
		}
	} else if (selectElement.getAttribute('onChange')) { 
		alert('getattribute: ' + selectElement.getAttribute('onchange'));
	}else {
		var changedFunctionString = '';
	}
	
	var selectChangedFunction = document.createElement('input');
	selectChangedFunction.type = 'hidden';
	selectChangedFunction.value = changedFunctionString;
	
	selectDropDown.appendChild(selectChangedFunction);
	
	selectFirstLine.appendChild(selectFirstLineText);
	
	selectOuter.appendChild(selectFirstLine);
	selectOuter.appendChild(selectDropDown);
	
	selectElement.parentNode.replaceChild(selectOuter, selectElement);
}

