var loaders = [];

var addWindowLoadEvent = function(loader) {
	window.loaders = window.loaders.concat([loader]);
};

var updateAge = function(dateFieldsContainer, ageField) {
	var parentID = dateFieldsContainer.getAttributeNode('id').nodeValue;
	var DOBMonthInput = document.getElementById(parentID + 'Month');
	var DOBMonth = DOBMonthInput.value;
	var DOBDayInput = document.getElementById(parentID + 'Day');
	var DOBDay = DOBDayInput.value;
	var DOBYearInput = document.getElementById(parentID + 'Year');
	var DOBYear = DOBYearInput.value;
	
	if(DOBMonth != '' && DOBDay != '' && DOBYear != '') {
		var currentDate = new Date();
		var currentYear = currentDate.getFullYear();
		var currentMonth = currentDate.getMonth() + 1;
		var currentDay = currentDate.getDate();
		var age = currentYear - DOBYear;
		
		if((currentMonth < DOBMonth) || ((currentMonth == DOBMonth) && (currentDay < DOBDay))) {
			age--;
		}
		
		ageField.setAttribute('value', age);
		ageField.value = age;
	}
};

var disableFormFieldSet = function(fieldset, debug) {
	debug = (debug == null) ? false : debug;
	
	var childNode = fieldset.firstChild;
	while(childNode != null) {
		var nodeName = childNode.nodeName.toLowerCase();
		if(nodeName == 'input' || nodeName == 'select' || nodeName == 'button') {
			window.disableFormInput(childNode, debug);
		} else {
			window.disableFormFieldSet(childNode, debug);
		}
		
		childNode = childNode.nextSibling;
	}
};

var disableFormInput = function(input, debug) {
	debug = (debug == null) ? false : debug;
	
	if((input.disabled == null) || !input.disabled) {
		input.disabled = true;
		window.adjustColor(input, -150, null, true, debug);
		var inputID = input.getAttribute('id');
		
		if(inputID != null) {
			var inputContainer = input.parentNode;
			var labels = inputContainer.getElementsByTagName('label');
			for(var i=0; i < labels.length; i++) {
				var label = labels[i];
				var forValue = label.getAttributeNode('for').nodeValue;
				
				if((forValue != null) && (forValue == inputID)) {
					window.adjustColor(label, 150, null, false, debug);
					break;
				}
			}
		}
	}
};

var enableFormFieldSet = function(fieldset, debug) {
	debug = (debug == null) ? false : debug;
	
	var childNode = fieldset.firstChild;
	while(childNode != null) {
		var nodeName = childNode.nodeName.toLowerCase();
		if(nodeName == 'input' || nodeName == 'select' || nodeName == 'button') {
			window.enableFormInput(childNode, debug);
		} else {
			window.enableFormFieldSet(childNode, debug);
		}
		
		childNode = childNode.nextSibling;
	}
};

var enableFormInput = function(input, debug) {
	if(debug == null) {
		debug = false;
	}
	
	if(input.disabled) {
		input.disabled = false;
		window.adjustColor(input, 150, null, true, debug);
		var inputID = input.getAttributeNode('id').nodeValue;
		
		if(inputID != null) {
			var inputContainer = input.parentNode;
			var labels = inputContainer.getElementsByTagName('label');
			
			for(var i=0; i < labels.length; i++) {
				var label = labels[i];
				var forValue = label.getAttributeNode('for').nodeValue;
				
				if(forValue == inputID) {
					window.adjustColor(label, -150, null, false, debug);
					break;
				}
			}
		}
	}
};

var adjustColor = function(elem, offset, component, background, debug) {
	if(background == null) {
		background = false;
	}
	
	if(debug == null) {
		debug = false;
	}
	
	var color = background ? elem.style.backgroundColor : elem.style.color;
	
	if((color == null) || (color == '')) {
		color = 'rgb(0, 0, 0)';
	}
	
	color = color.toLowerCase();
	var pattern1 = /^\s*#(\d+)/;
	var pattern2 = /^\s*rgb\s*\(\s*(\d+),\s*(\d+),\s*(\d+)/;
	var pattern1Matches = color.match(pattern1);
	var pattern2Matches = color.match(pattern2);
	
	if(debug) {
		//alert(elem.getAttribute('id') + ': ' + pattern2Matches);
	}
	
	var redComponent = null;
	var greenComponent = null;
	var blueComponent = null;
	
	if(pattern1Matches != null) {
		var hexString = pattern1Matches[1];
		
		if(hexString.length == 3) {
			hexString += hexString;
		}
		
		redComponent = parseInt(new Number(hexString.substring(0, 2)), 16);
		greenComponent = parseInt(new Number(hexString.substring(2, 4)), 16);
		blueComponent = parseInt(new Number(hexString.substring(4)), 16);
	} else {
		redComponent = new Number(pattern2Matches[1]);
		greenComponent = new Number(pattern2Matches[2]);
		blueComponent = new Number(pattern2Matches[3]);
	}
	
	if(component != null) {
		component = component.toUpperCase();
		if(component == 'R' || component == 'RED') {
			redComponent += offset;
		} else if(component == 'G' || component == 'GREEN') {
			greenComponent += offset;
		} else if(component == 'B' || component == 'BLUE') {
			blueComponent += offset;
		}
	} else {
		redComponent += offset;
		greenComponent += offset;
		blueComponent += offset;
	}
	
	elem.style.color = 'rgb(' + redComponent + ', ' + greenComponent +
		', ' + blueComponent + ')';
};

var $ = function(elementID) {
	return document.getElementById(elementID);
};

window.onload = function() {
	for(var i=0; i < window.loaders.length; i++) {
		window.loaders[i]();
	}
};
