var _sources = null;

function populateSources(url) {
	if (url == null) url = "http://www.exceptionalsoftware.com:8080/TrackingService/tracking/ajaxService/getSources";
	var ajaxRequest = MochiKit.Async.doSimpleXMLHttpRequest(url);	
	ajaxRequest.addCallbacks(_getSourcesResponse, _handleAjaxError);
}

function _getSourcesResponse(response) {
	var responseObj = evalJSON(response.responseText);
	
	var responseType = responseObj["responseType"];

	if (responseType == "success") {
		_sources = responseObj['responseData']['sources'];
		var sourcesDiv = getElement("hearAboutUsDiv");
		
		if (sourcesDiv != null) {
			var select = SELECT({"id":"mainSourceSelect", "name":"mainSourceSelect"});
			
			_sourcesMap = new Array();
			_sourceFunctionMap = new Array();
			
			for(var x = 0; x < _sources.length; x++) {
				var sourceObj = _sources[x];
				
				_insertIntoSourcesMap(sourceObj);
				appendChildNodes(select, OPTION({"value":sourceObj.id}, sourceObj.name));
			}
			
			if (getElement("loadingImage") != null) removeElement(getElement("loadingImage"));
			replaceChildNodes(sourcesDiv, select);
			
			connect(select, "onchange", partial(_changeSelectOptions, select));
		} else {
			_handleGetSourcesError("There is no div element with an id of 'hearAboutUsDiv'.  Please create one.");
		}
	} else {
		_handleGetSourcesError(responseObj['userMessage']);
	}
}

function _insertIntoSourcesMap(sourceObj) {
	_sourcesMap[sourceObj.id] = sourceObj;
	
	for(var y = 0; y < sourceObj.children.length; y++) {
		_insertIntoSourcesMap(sourceObj.children[y]);
	}
}

function _changeSelectOptions(changedSelectBox) {
	var sourceDiv = changedSelectBox.parentNode;
	var currentValue = changedSelectBox.options[changedSelectBox.selectedIndex].value;
	var source = _findSource(currentValue);
	
	replaceChildNodes(sourceDiv, changedSelectBox);
	
	if (source.children.length > 0) {
		var subSelect = _generateSourceSelect(source);
		subSelect.style.marginLeft = "5px";
		appendChildNodes(sourceDiv, changedSelectBox, subSelect);
	}
	
	if (source.paramRequired == true) {
		var input = INPUT({"type":"text", "name":"sourceParam"});
		
		if (source.paramLabel != null) {
			input.value = source.paramLabel;
			input.style.color = "#B0B0B0";
			connect(input, "onkeypress", partial(_changeTextColor, input, "black"));
		}
		
		input.style.marginLeft = "5px";
		appendChildNodes(sourceDiv, input);
	}
		
	changedSelectBox.focus();
}

function _changeTextColor(element, newColor) {
	element.style.color = newColor;
}

function _generateSourceSelect(sourceObj) {
	var subSelect = SELECT({"name":"hearAboutUsSubSelect"});
	var children = sourceObj.children;
	
	for (var k = 0; k < children.length; k++) {
		var childSource = children[k];
		appendChildNodes(subSelect, OPTION({"value":childSource.id}, childSource.name));
	}
	
	return subSelect;
}

function _findSource(id) {
	for (var p = 0; p < _sources.length; p++) {
		var source = _sources[p];
		
		if (source.id == id)
			return source;
	}
	
	return null;
}

function _handleGetSourcesError(errorMessage) {
	console.log("error:" + errorMessage);
	
	appendChildNodes(getElement("mainForm"),
				INPUT({"type":"hidden", "name":"hearAboutUs", "value":"error"}),
				DIV({"style":"padding:5px;background-color:pink;border:1px solid black;", "id":"getSourcesError"}, errorMessage));
}

function _handleAjaxError(response) {
	alert(response.message);
}