window.predictor = {
	groups : [],
	requests : [],
	init:function() {
		try {
			$.getJSON("/nominate/predict.asp"); // just make sure we can make XMLHttp requests
			$(document.body).append("<div id='predictor'><ul></ul></div>");
			$(window).resize(function() {
				$("#predictor").hide();
			});
			$(window).resize();
		} catch(error) {
			
		};
	},
	registerFields:function(fields) {
		for(var m in fields) {
			var field = $(fields[m]);
			field.data("fieldType",m).data("fieldGroup",predictor.groups.length);
			if(m == "suburb" || m == "postcode") {
				field.keydown(function(e) {
					if(e.keyCode == 13) {
						$("#predictor .selected:first").click();
						return false;
					}
				});
				field.keyup(function(e) {
					if(e.keyCode == 38) {
						up = true;
						down = false;
					} else if(e.keyCode == 40) {
						down = true;
						up = false;
					} else if(e.keyCode != 13) {
						predictor.lookup(this);
						return true;
					}
					
					var max = $("#predictor li").size()
					if(!$("#predictor .selected").size()) {
						predictor.selectedIndex = 0;
					} else if(up) {
						predictor.selectedIndex = (predictor.selectedIndex-1 <= 0) ? 0 : predictor.selectedIndex-1;
					} else if(down) {
						predictor.selectedIndex = (predictor.selectedIndex+1 >= max-1) ? max-1 : predictor.selectedIndex+1;
					}
					$("#predictor li").removeClass("selected");
					$("#predictor li:eq("+predictor.selectedIndex+")").addClass("selected");
					return false;
				});
				field.blur(function() {
					setTimeout(function() { $("#predictor").hide(); },100);
				});
			}
		}
		predictor.groups.push(fields);
	},
	lookup:function(el) {
		var group = predictor.groups[$(el).data("fieldGroup")];
		if(!group) return true;
		
		// do the lookup
		var data = {
			'id' : predictor.requests.length
		}
		//console.log($(el).data("fieldType"));
		data[$(el).data("fieldType")] = $(el).val();
		
		var top = $(el).offset()['top']+$(el).outerHeight();
		var left = $(el).offset()['left'];
		$("#predictor").css({'top':top,'left':left});
		try {
			$.getJSON("/nominate/predict.asp",data,function(response) {
				$("#predictor ul").empty();
				if(predictor.requests[response.id] === undefined || response.id === undefined || typeof response.result != "object") {
					$("#predictor").hide();
					return false;
				}
				for(var m in response.result) {
					var suburbData = response.result[m];
					var item = $("#predictor ul").append("<li><span class='suburb'></span>,&nbsp;<span class='state'></span>&nbsp;<span class='postcode'></span></li>").children("li:last").data("data",suburbData);
					item.find(".suburb").text(suburbData['title']);
					item.find(".state").text(suburbData['state']);
					item.find(".postcode").text(suburbData['postcode']);
					item.click(function() {
						predictor.setData(predictor.requests[response.id],$(this).data("data"));
					});
				}
				if(response.result.length) {
					$("#predictor").show();
				} else {
					$("#predictor").hide();
				}
			})
		} catch(err) {
			return false;
		}		
		// save the request in the requests variable
		predictor.requests.push($(el).data("fieldGroup"));
	},
	setData:function(groupID, data) {
		var fields = predictor.groups[groupID];
		$(fields.suburb).val(data['title']);
		$(fields.postcode).val(data['postcode']);
		$(fields.state).val(data['state']);
		$("#predictor").hide();
	}
}

$(document).ready(function() {
	predictor.init();
	predictor.registerFields({
		"suburb":$("#sec1-nominee-address-suburb"),
		"postcode":$("#sec1-nominee-address-postcode"),
		"state":$("#sec1-nominee-address-state")
	});
	
	predictor.registerFields({
		"suburb":$("#sec3-nominator-address-suburb"),
		"postcode":$("#sec3-nominator-address-postcode"),
		"state":$("#sec3-nominator-address-state")
	});
	
	predictor.registerFields({
		"suburb":$("#sec4-referee-address-suburb"),
		"postcode":$("#sec4-referee-address-postcode"),
		"state":$("#sec4-referee-address-state")
	});
});
