/*
Copyright 2009 Gerrit Veldman
All rights reserved. See license.txt.
*/
$(document).ready(function() {
	var $sn = $('#sn');
	var $gv = $('#gv');
	var $pl = $('#pl');

	$('<div></div>').insertAfter($sn);
	$('<div></div>').insertAfter($gv);
	$('<div></div>').insertAfter($pl);

	var $autocomplete = $('<ul class="autocomplete"></ul>').css({'position':'absolute','zIndex':'+40','listStyle':'none','cursor':'default'});

	$sn.attr('autocomplete','off')
	.keyup(function(event) {
		if (event.keyCode > 40||event.keyCode == 8) {
			ajaxhandler($sn);
		}
	})
	.keypress(function(event) {
		if (event.keyCode == 13 && selected !== null && selected !== -1) {//enter
			$sn.val($autocomplete.find('li').eq(selected).text());
			setselected(null);
			event.preventDefault();
		}
		else if (event.keyCode == 27 && selected !== null) {//escape
			setselected(null);
		}
	})
	.keydown(function(event) {
		if (event.keyCode == 38 && selected !== null) {//arrowup
			setselected(selected - 1);
			event.preventDefault();
		}
		else if (event.keyCode == 40 && selected !== null) {//arrowdown
			setselected(selected + 1);
			event.preventDefault();
		}
	})
	.blur(function(event) {
		setTimeout(function() {
			setselected(null);
		},250);
	});
	
	$gv.attr('autocomplete','off')
	.keyup(function(event) {
		if (event.keyCode > 40||event.keyCode == 8) {
			ajaxhandler($gv);
		}
	})
	.keypress(function(event) {
		if (event.keyCode == 13 && selected !== null && selected !== -1) {//enter
			$gv.val($autocomplete.find('li').eq(selected).text());
			setselected(null);
			event.preventDefault();
		}
		else if (event.keyCode == 27 && selected !== null) {//escape
			setselected(null);
		}
	})
	.keydown(function(event) {
		if (event.keyCode == 38 && selected !== null) {//arrowup
			setselected(selected - 1);
			event.preventDefault();
		}
		else if (event.keyCode == 40 && selected !== null) {//arrowdown
			setselected(selected + 1);
			event.preventDefault();
		}
	})
	.blur(function(event) {
		setTimeout(function() {
			setselected(null);
		},250);
	});
	
	$pl.attr('autocomplete','off')
	.keyup(function(event) {
		if (event.keyCode > 40||event.keyCode == 8) {
			ajaxhandler($pl);
		}
	})
	.keypress(function(event) {
		if (event.keyCode == 13 && selected !== null && selected !== -1) {//enter
			$pl.val($autocomplete.find('li').eq(selected).text());
			setselected(null);
			event.preventDefault();
		}
		else if (event.keyCode == 27 && selected !== null) {//escape
			setselected(null);
		}
	})
	.keydown(function(event) {
		if (event.keyCode == 38 && selected !== null) {//arrowup
			setselected(selected - 1);
			event.preventDefault();
		}
		else if (event.keyCode == 40 && selected !== null) {//arrowdown
			setselected(selected + 1);
			event.preventDefault();
		}
	})
	.blur(function(event) {
		setTimeout(function() {
			setselected(null);
		},250);
	});
	
	$.manageAjax.create('autocomplete',{
		queue:'clear',
		maxRequests: 1,
		abortOld: true,
		cacheResponse: true,
		preventDoubbleRequests: true
	});
	var ajaxhandler = function(field) {
		if (field.val()) {
			$.manageAjax.add('autocomplete',{
				'url': CF_BASE_PATH + 'index.php',
				'data': {'a':'ajaxautocomplete.xml','f':field.attr('id'),'v':field.val()},
				'dataType': 'xml',
				'type': 'GET',
				'success': function(data) {
					$autocomplete.empty().remove().appendTo(field.next());
					var empty = 1;
					$(data).find('term').each(function() {
						empty = 0;
						var term = $(this).text();
						$('<li></li>').text(term)
						.appendTo($autocomplete)
						.mouseover(function() {
							setselected($('li').index(this));
						})
						.click(function() {
							field.val(term);
							setselected(null);
						});
					});
					if (!empty) {
						setselected('start');
					}
					else {
						setselected(null);
					}
				}
			});
		}
		else {
			setselected(null);
		}
	};
	
	var selected = null;
	var setselected = function(item) {
		selected = item;
		if (selected == 'start') {
			$autocomplete.find('li').removeClass('selected')
			$autocomplete.show();
			selected = -1;
			return;
		}
		if (selected === null) {
			$autocomplete.remove();
			return;
		}
		if (selected <0) {
			selected = $autocomplete.find('li').length-1;
		}
		if (selected >= $autocomplete.find('li').length) {
			selected = 0;
		}
		$autocomplete.find('li').removeClass('selected')
			.eq(selected).addClass('selected');
		$autocomplete.show();
	};

});
