var AC = new Array();

function AutoComplete(src,dest,url,min) {
	if(AC[src]!=undefined) 
		return;
	AC[src] = new Array();
	AC[src]['src']			= $('#'+src);
	AC[src]['url']			= url;
	AC[src]['dest']			= $('#'+dest);
	AC[src]['list']			= $('#'+dest+' dl');
	AC[src]['min']			= (min==null)?3:min;
	AC[src]['selected']		= null;
	AC[src]['default']		= AC[src]['src'].val();
	AC[src]['autosubmit']	= true;
	AC[src]['autoselect']	= true;
	AC[src]['requirevalid']	= true;
	
	AC[src]['hide'] = $('<input type="hidden" />')
		.attr('name',AC[src]['src'].attr('name'))
		.attr('id',src+'_hidden')
		.addClass('autocomplete_hidden')
		.insertAfter( '#'+src);
	AC[src]['src']
		.attr('ac',src)
		.attr('autocomplete','off')
		.removeAttr('name')
		.blur( AC_Blur )
		.focus( AC_Focus )
		.keydown( AC_KeyDown )
		.keyup( AC_KeyUp );
};

function AC_Blur(event) {
	var ac = $(this).attr('ac');
	AC[ac]['dest'].hide();
	AC[ac]['list'].html('');
	AC[ac]['selected'] = null;
	
	if( AC[ac]['src'].val()=='')
		AC[ac]['src'].val( AC[ac]['default'] );
}

function AC_Focus(event) {
	var ac = $(this).attr('ac');
	if( AC[ac]['src'].val() == AC[ac]['default'])
		AC[ac]['src'].val('');
}

function AC_KeyDown(event) {
	if(event.keyCode==27) {
		//console.log('Esc');
		event.stopPropagation();
		return false;
	}
	if(event.keyCode==40) {
		//console.log('Down Arrow');
		AC_MoveSelect(this,'down');
		event.stopPropagation();
		return false;
	}
	if(event.keyCode==38) {
		//console.log('Up Arrow');
		AC_MoveSelect(this,'up');
		event.stopPropagation();
		return false;
	}
	if(event.keyCode==13) {
		//console.log('Enter pressed');
		var ac = $(this).attr('ac');
		//console.log(ac);
		if(AC[ac]['autosubmit']==false)
			event.stopPropagation();
		if(AC[ac]['selected']==null) {
			if(AC[ac]['requirevalid']==true)
				return false;
			return true;
		}
		return AC_Accept(ac,AC[ac]['selected']);
	}
}

function AC_KeyUp(event) {
	//Block Up/Down Arrow and Esc
	if(event.keyCode == 40 || event.keyCode == 38 || event.keyCode == 27)
		return false;
	//Ignore Left/Right Arrow and Enter
	if(event.keyCode == 37 || event.keyCode == 39 || event.keyCode == 13)
		return true;
	
	var ac		= $(this).attr('ac');
	var query	= $(this).val();
	//console.log(query);
	if( query.length >= AC[ac]['min'] )
		$.post(AC[ac]['url'], { id: ac, query: query }, AC_Process, "json");
	else
		AC[ac]['dest'].hide();
	return false;
}
function AC_MoveSelect(ele,dir) {
	var ac	= $(ele).attr('ac');
	
	if(AC[ac]['selected']==null) {
		if(dir=='down') {
			//console.log('None Selected');
			ele = AC[ac]['list'].children(':first');
			if(ele.hasClass('menu'))
				ele = ele.next();
			AC_Select(ac,ele);
		}
	} else {
		ele = AC[ac]['selected'];
		if(dir=='up') {
			ele = ele.prev();
			if(ele.hasClass('menu'))
				ele = ele.prev();
			if(ele.is('dd'))
				AC_Select(ac,ele);
		}
		if(dir=='down') {
			ele = ele.next();
			if(ele.hasClass('menu'))
				ele = ele.next();
			if(ele.is('dd'))
				AC_Select(ac,ele);
			//console.log(ele);
		}
	}
}

function AC_Select(ac,ele) {
	AC[ac]['list'].find('.selected').removeClass('selected');
	ele.addClass('selected');
	AC[ac]['selected'] = ele;
}

function AC_Accept(ac,ele) {
	if(AC[ac]['selected']==null)
		return false;
	if(ele==null)
		ele = AC[ac]['selected'];
	
	//console.log( ele.attr('data') );
	//console.log( ele.attr('label') );
	
	AC[ac]['hide'].val( ele.attr('data') ).change();
	AC[ac]['src'].val( ele.attr('label') );
	AC[ac]['dest'].hide();
	AC[ac]['selected']=null;
	return AC[ac]['autosubmit'];
	//return true;
}

function AC_Mark(txt,query) {
	return txt.replace(new RegExp('^(' + query + ')', 'i'), '<em>$1</em>');
}
function AC_Reset(ac) {
	AC[ac]['list'].html('');
	AC[ac]['hide'].val('');
	AC[ac]['selected'] = null;
}

function AC_Process(data) {
	if(!data || !data.id || !data.query || !data.result)
		return;
	var ac		= data.id;
	AC_Reset(ac);
	

	if(data.result.length==0)
		return;
	
	for( i in data.result) {
		var result = data.result[i];
		var el='';
		if( result.type == 'menu'  ) {
			el = '<img src="/static/images/icon-arrow-white.gif" alt="More..." />';
			el = '<a href="'+result.link+'">'+el+'</a>';
			el = $('<dt class="menu clearfix">'+result.text+el+'</dt>');
		} else {
			if(result.icon) el += '<img src="'+result.icon+'" />';
			if(result.text) el += AC_Mark(result.text,data.query);
			if(result.link) el = '<a href="'+result.link+'">'+el+'</a>';
			el = $('<dd class="'+result.type+'">'+el+'</dd>');
			el.attr('data', (result.data)?result.data:result.text);
			el.attr('label',result.text);
			el.mouseover( function() {
				AC_Select(ac,$(this));
			});
			
			el.mousedown( function() {
				AC_Accept(ac,$(this));
				if(AC[ac]['autosubmit']==true)
					AC[ac]['hide'].parent('form').submit();
			} );
			//el.children().mousedown( function() { console.log('Click Child'); } );
			
			if(AC[ac]['selected']==null && AC[ac]['autoselect'])
				if(result.text.match(new RegExp('^('+data.query+')$','i')))
					AC_Select(ac,el);
		}
		AC[ac]['list'].append(el);
	}
	AC[ac]['dest'].show();
}
