(function($){
	$.autolistclass=function (){};
	$.fn.autolist=function (){
		$.autolist=$.autolist || new $.autolistclass();
		this.each(function(){
			var id;
			if(!this.id){
				$.autolist.defaultnum ++;
				id=$.autolist.defaultid + '_' + $.autolist.defaultnum;
				$(this).attr('id',id);
			}
			$(this).attr('autocomplete','off');
			$(this).click(function(){$.autolist.show(this.id)});
			$(this).focus(function(){$.autolist.show(this.id)});
	   });
	};
	$.extend($.autolistclass.prototype,{
		lost:		'No Find',
		init:		'enter...',
		reltag:		'autolist',
		showmore:	true,
		showmoretag:'showmore',
		clearspchar:false,
		cleartag:	'clearspecialchar',
		splittag:	',',
		defaultid:	'autolist_defid',
		saveidtag:	'_id',
		dataaim:	'data',
		defaultnum: 0,
		overtime:	800,
		oldvalue:	'',
		delay:		false,
		id:			null,
		num:0,
		justchanged:false,
		files: {
			js: {autolist:'jquery.autolist.js'},
			css: {autolist:'css/jquery.autolist.css'},
			images: {loading:'images/loading.gif'}
		},
		keys: {prev:[38]/*←*/,next:[40]/*→*/,enter:[13]},
		domready: function(){
			var src=$('script[@src*='+this.files.js.autolist+']').attr('src');
			this.baseurl=src.substring(0, src.indexOf(this.files.js.autolist));	
			var me=this;
			$.each(this.files, function(group, val){
				$.each(this, function(file, val){
					me.files[group][file]=me.baseurl+val;
				});
			});
			$('head').append('<link rel="stylesheet" type="text/css" href="'+ this.files.css.autolist +'" />');
			$('body').append('\
<iframe id="autolist_iframe" src="javascript:false;" style="position:absolute;left:0;top:0;display:none;z-index:10;" frameborder="0" scrolling="no"></iframe>\
<div id="autolist_body" style="position:absolute;left:0;top:0;z-index:11;display:none;"><div id="autolist_content"></div>\
</div>');
			$(window).resize(function(){ $.autolist.resize(); });
			$('#autolist_iframe').css('opacity',0);
			$('[@rel*='+this.reltag+']').autolist();
			return true;
		},
		senddata: function(obj){
			this.delay=false;
			if(this.id){
				var v=$('#'+this.id).val();
				//var nv=this.clearspchar?v.replace(/[^\u4e00-\u9fa5\w]+/ig,''):v;
				var nv=v;
				if(nv!=''&&nv!=this.oldvalue){
					//$('#'+this.id).val(nv);
					var href=$('#'+this.id).attr(this.dataaim);
					if(href&&href!='#'){
						//$('#'+this.id).val(nv);
						this.loading();
						this.oldvalue=nv;
						$.get(href,{wd:nv},this.binddata);
					}
				}else if(nv!=this.oldvalue){
					this.oldvalue='';
					this.showlost();
				}
			}
		},
		binddata: function(x){
			var me=$.autolist;
			if(me.id){
				if(me.empty(x)=='data'){
					var len=$(x).length,h,id,tl,tll,mr=null,rp=[],rped=[],thv=$('#'+me.id).val();
					if(len) $('#autolist_content').empty();
					if(me.clearspchar){
						rp.push(thv);
					}else{
						rp=thv.split(/[\s,\.\-#\/]/ig);
					}
					for(var i=0;i<len;i++){
						id=$(x).eq(i).attr('dataid')||'';
						tl=$(x).eq(i).children().eq(0).html()||'';
						tll=tl;
						if(me.showmore){
							mr=$(x).eq(i).children().eq(1).html()||'';
						}else{
							mr=null;
						}
						for(var j in rp){
							if($.inArray(rp[j],rped)<0&&rp[j]!=''){
								var re=new RegExp('('+rp[j]+')','ig');
								tl=tl.replace(re,'<span class="tag">$1</span>');
								if(mr!=null) mr.replace(re,'<span class="tag">$1</span>');
								rped.push(rp[j]);
							}
						}
						h='<ul onclick="$.autolist.click(\''+tll+'\',\''+id+'\');"><li class="al_ul_tl">'+tl+'</li>';
						h+=mr!=null?'<li class="al_ul_mr">'+mr+'</li>':'';
						h+='</ul>';
						$(h).hover(function (){$(this).addClass("hover");},function (){$(this).removeClass("hover");}).appendTo($('#autolist_content'));
					}
				}else{
					me.showlost();
				}
			}
		},
		click: function(title,did){
			if(this.id){
				$('#'+this.id).val(title);
				$('#'+this.id+this.saveidtag).val(did);
			}
			this.justchanged=false;
			this.hide();
		},
		show: function(id){
			if(!this.id||(id!=this.id&&id)){
				this.id=id;
				this.clearspchar=typeof($('#'+id).attr(this.cleartag))=='undefined'?this.clearspchar:!this.empty($('#'+id).attr(this.cleartag));
				this.showmore=typeof($('#'+id).attr(this.showmoretag))=='undefined'?this.showmore:!this.empty($('#'+id).attr(this.showmoretag));
				this.setpostion();
				this.justchanged=true;
				this.keyboardnav_enable();
				$('#autolist_body,#autolist_iframe').show();
				$('#autolist_body').bind('click',function(){$.autolist.justchanged=true;});
				$(document).bind('click',this.hide);
			}
		},
		prev: function(){
			if(!$('#autolist_content > ul.hover').length){
				$('#autolist_content > ul:last').addClass('hover');
			}else if(!$('#autolist_content').children('.hover').prev('ul').length){
				$('#autolist_content > ul:first').removeClass('hover');
				$('#autolist_content > ul:last').addClass('hover');
			}else{
				$('#autolist_content > ul.hover').removeClass('hover').prev().addClass('hover');
			}
		},
		next: function(){
			if(!$('#autolist_content > ul.hover').length){
				$('#autolist_content > ul:first').addClass('hover');
			}else if(!$('#autolist_content').children('.hover').next('ul').length){
				$('#autolist_content > ul:last').removeClass('hover');
				$('#autolist_content > ul:first').addClass('hover');
			}else{
				$('#autolist_content > ul.hover').removeClass('hover').next().addClass('hover');
			}
		},
		enter: function(){
			if($('#autolist_content ul.hover').length){
				$('#autolist_content ul.hover').click();
			}
		},
		hide: function(e){
			if(!$.autolist.justchanged){
				$('#autolist_body,#autolist_iframe').hide();
				$(document).unbind('click',$.autolist.hide);
//				if(!$('#'+$.autolist.id+$.autolist.saveidtag).val()){
//					$('#'+$.autolist.id).val('');
//				}else if(!$('#'+$.autolist.id).val()){
//					$('#'+$.autolist.id+$.autolist.saveidtag).val('');
//				}
				$.autolist.keyboardnav_disable();
				$('#'+$.autolist.id).bind('keydown',function(){$.autolist.show(this.id);})
				$.autolist.id=null;
				$.autolist.oldvalue='';
			}else{
				$.autolist.justchanged=false;
			}
		},
		showlost: function(){
			$('#autolist_content').html('');
		},
		loading: function(){
			//$('#autolist_content').html('<h2 class="autolist_loading">&nbsp;</h2>');
			$('#autolist_content').html('');
		},
		resize: function(){
			this.setpostion();
		},
		setpostion: function(){
			var bcss={},tag,b1,b2,b3;
			if(this.id){
				tag='#'+this.id;
				b1=parseInt($('#autolist_body').css('border-left-width'))|| 0;
				b2=parseInt($('#autolist_body').css('border-right-width'))|| 0;
				b3=parseInt($('#autolist_body').css('border-bottom-width'))|| 0;
				otag=$(tag).offset();
				bcss={
				left:($.browser.msie?otag.left:$(tag)[0].offsetLeft),
				top:($.browser.msie?otag.top:$(tag)[0].offsetTop) + $(tag)[0].offsetHeight - b3,
				width:$(tag)[0].offsetWidth - b1 - b2
				};
				$('#autolist_body').css(bcss);
				$.extend(bcss,{height:$('#autolist_body')[0].offsetHeight});
				$('#autolist_iframe').css(bcss);
				return true;
			}else{
				return false;
			}
		},
		empty: function(a){
			if(!a||a=='0'||a=='false'||a==[]){
				return true;
			}else if(a==1||a=='1'||a==true||a=='true'){
				return false;
			}else{
				return 'data';
			}
		},
		keyboardnav_enable: function(){
			if(this.id){
				$('#'+this.id).unbind('keydown').bind('keydown',function(e){$.autolist.keyboardnav_up(e);});
				$('#'+this.id).unbind('keyup').bind('keyup',function(e){$.autolist.keyboardnav_action(e);});
				$(document).bind('keydown',function(e){return $.autolist.keyboardnav_enter(e);});
			}
		},
		keyboardnav_disable: function(){
			if(this.id){
				$('#'+this.id).unbind('keydown');
				$('#'+this.id).unbind('keyup');
				$(document).unbind('keydown');
			}
		},
		keyboardnav_up: function(e){
			e=e||event;
			var keycode=e.keyCode;
			if($.inArray(keycode,this.keys.prev)<0&&$.inArray(keycode,this.keys.next)<0){
				if(!this.delay){
					setTimeout('$.autolist.senddata()',this.overtime);
				}
				this.delay=true;
				return true;
			}
			return false;
		},
		keyboardnav_action: function(e){
			e=e||window.event;
			var keycode=e.keyCode;
			if($.inArray(keycode,this.keys.prev)>=0){
				this.prev();
				return true;
			}
			if($.inArray(keycode,this.keys.next)>=0){
				this.next();
				return true;
			}
			return false;
		},
		keyboardnav_enter: function(e){
			e=e||window.event;
			var keycode=e.keyCode;
			if($.inArray(keycode,this.keys.enter)>=0){
				this.enter(e);
				return false;
			}
			return true;
		}
	});
	$(function(){
		$.autolist=$.autolist || new $.autolistclass();
		$.autolist.domready();
	});
})(jQuery);
