/**
*	<h2>Omni box (autocomplete) widget.</h2>
*	<h3>Needs:</h3>	{jquery.js, jquery.bgiframe.js}.
*/
var omnibox = window.omnibox =
{
	keyCode: {
		ALT: 18,
		BACKSPACE: 8,
		CAPS_LOCK: 20,
		COMMA: 188,
		CONTROL: 17,
		DELETE: 46,
		DOWN: 40,
		END: 35,
		ENTER: 13,
		ESCAPE: 27,
		HOME: 36,
		INSERT: 45,
		LEFT: 37,
		NUMPAD_ADD: 107,
		NUMPAD_DECIMAL: 110,
		NUMPAD_DIVIDE: 111,
		NUMPAD_ENTER: 108,
		NUMPAD_MULTIPLY: 106,
		NUMPAD_SUBTRACT: 109,
		PAGE_DOWN: 34,
		PAGE_UP: 33,
		PERIOD: 190,
		RIGHT: 39,
		SHIFT: 16,
		SPACE: 32,
		TAB: 9,
		UP: 38
	},

	init: function(opts)
	{
		var curomni, b, w, t, c, d = new Date(), id;
		opts = $.extend(
		{
			method: "post",
			bindTo: false,
			url: "",
			onSearch: false,
			onError: false,
			font: "13px Tahoma, Arial, Helvetica, sans-serif",
                        color: "#222222",
			boxBorder: {color: "#97cec7"},
			boxHover: {backgroundColor: "#F0F6F1", textColor: "#DF2222", textStyle: "bold", advTextColor: "#00727D"},
			zIndex: 100,
                        adv: {onClick: false}
		}, opts);
		id = d.getFullYear().toString()+(d.getMonth()+1).toString()+d.getDate().toString()+d.getHours().toString()+d.getMinutes().toString()+d.getSeconds().toString()+d.getMilliseconds().toString();
		curomni = this[id] = opts;
		if (!curomni.bindTo || curomni.bindTo == null) return;
		b = curomni.bindTo; c = 'omni-'+b; b = '#'+b;
		w = $(b).width(); w = (w == 0) ? 200 : w;
		if ($(b).val().length === 0) $(b).val('');
		$(b).addClass('omni').attr('autocomplete', 'off')
		.css({"border": "1px solid "+curomni.boxBorder.color})
		.after("<div class='"+c+"' style='width: "+w+"px; visibility: hidden; border: 1px solid "+curomni.boxBorder.color+"; position: absolute; z-index: "+curomni.zIndex+
			"; background: none repeat scroll 0 0 #FFFFFF; font: "+curomni.font+"; left: "+$(b).position().left+"px; top: "+($(b).offset().top+$(b).outerHeight())+"px; color: '"+curomni.color+"'></div>");
		c = '.'+c;
		$(c).attr('omnid', id);
		$(b).bind("keyup", function(e)
		{
			var keyCode = omnibox.keyCode, v = $.trim(($(this).val()).toString().toLowerCase());
			if (v.length == 0) {omnibox.redraw('', c, ''); return;}
			switch(e.keyCode)
			{
				case keyCode.UP:
					omnibox.move("up", c, curomni);
					e.preventDefault();
					break;
				case keyCode.DOWN:
					omnibox.move("down", c, curomni);
					e.preventDefault();
					break;
				case keyCode.ENTER:
					omnibox.search(curomni);
					e.preventDefault();
					break;
				case keyCode.TAB:
					break;
				case keyCode.ESCAPE:
					$(c).css({"visibility": "hidden"});
					break;
				case keyCode.LEFT:
				case keyCode.RIGHT:
				case keyCode.SHIFT:
				case keyCode.CONTROL:
				case keyCode.ALT:
					break;
				default:
					$.ajax({
						type: curomni.method,
						url: curomni.url,
						data: [
							{name: 'query', value: v}
						],
						dataType: 'text',
						/*chome char encoding fix*/
						//beforeSend: function(xmlhr){xmlhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");},
						success: function(data)
						{
							data = data.substring(0, data.length - 1);
							data = eval('['+data+']');
							data = data.length > 0 ? data : new Array();
							omnibox.redraw(data, c, curomni);
						},
						error: 	 function(data)
						{
							if (curomni.onError && $.isFunction(curomni.onError)) curomni.onError(data);
						}
					});
					break;
			}
		})
		.bind("keydown keypress", function(e)
		{
			var keyCode = omnibox.keyCode, v = ($(this).val()).toString().toLowerCase();
			if (v.length == 0) return;
			if (e.keyCode == keyCode.ENTER) e.preventDefault();
		})
		.focus(function(e){if ($(c).children().length) $(c).css({"visibility": "visible"});});

		$(window.body).click(function(e){
			t = e.target || e.srcElement;
			if (!/(omni)/.test($(t).attr('class'))) $(c).css({"visibility": "hidden"});
		});
	},

	redraw: function(data, container, curomni)
	{
		var h = "", adv = "", advc = 0;
		curomni.reslen = 0;
		$(".bgiframe").remove();
		$(container).empty().css({"visibility": "hidden"});
		for (var i = 0; i < data.length; i++)
		{
			if (data[i] != undefined)
			{
				curomni.reslen++;
                                if (data[i].t != undefined && data[i].t === "adv"){adv = ' advref="'+((data[i].ref != undefined) ? data[i].ref : "")+'" adv="true" ';advc++;}else{adv = "";}
				h += '<li><span inx="'+i+'"id="'+data[i].id+'" class="omni-result" title="'+data[i].res+'"'+adv+'>'+data[i].res+'</span></li>';
			}
		}
		if (h.length == 0) return;
		$(container)
		.append("<ul style='list-style: none outside none; line-height: 150%; margin: 0; padding: 0; overflow: hidden;'>"+h+"</ul>")
		.css({"visibility": "visible"});
		$(".omni-result", container)
		.hover(function(){omnibox.makeCurrent($(this).attr("inx"), container, false, curomni);}, function(){$(this).attr("current", "false").unbind("click").css({"background-color": "#FFFFFF", "color": "black", "font-weight": "normal"});})
		.css({"cursor": "pointer", "padding": "0 0 0 3px", "display": "block", "white-space": "nowrap"});
		$("ul", container).bgiframe();
		$(".omni-result:last", container).attr("last", "true");
                if (advc > 0)
                {
                    $("ul li:eq("+(advc-1)+")", container)
                    .css({"border-bottom": "1px solid "+curomni.boxHover.textColor})
                    .after('<span class="omni-adv" style="float: right; position: relative; top: -15px; color: '+curomni.color+'; font-size: 9px; cursor: pointer;">реклама</span>');
                    $(".omni-adv", container).hover(function(){$(this).css({"font-weight": "bold"});},function(){$(this).css({"font-weight": "normal"});});
                    if (curomni.adv.onClick && $.isFunction(curomni.adv.onClick)) $(".omni-adv", container).click(function(){curomni.adv.onClick();});
                }

	},

	move: function(dir, c, curomni)
	{
		var inx, isLast, isAdv;
                if ($(c).css('visibility').length == 0 || $(c).css('visibility') === "hidden") return;
                inx = $(".omni-result[current='true']", c).attr("inx");
                isLast = $(".omni-result[inx='"+inx+"']", c).attr("last");
                //isAdv = $(".omni-result[inx='"+inx+"']", c).attr("adv"); isAdv = (isAdv == undefined) ? false : isAdv;
		if (inx == null || inx == undefined) inx = -1;
		inx = parseInt(inx);
		switch(dir)
		{
			case "up":
				if (inx == -1) return;
				if (inx == 0) inx = curomni.reslen;
				omnibox.makeCurrent(inx - 1, c, true, curomni);
				break;
			case "down":
				if (isLast) inx = -1;
				omnibox.makeCurrent(inx + 1, c, true, curomni);
				break;
			default:
				break;
		}
	},

	makeCurrent: function(inx, c, ct, curomni)
	{
		var hov = curomni.boxHover, b = "#"+curomni.bindTo, clr;
		$(".omni-result[inx='"+inx+"']", c)
		.attr("current", "true")
		.bind("click", function(e){
		var o = omnibox[$(this).parent().parent().parent().attr('omnid')];
		omnibox.search(o);
		})
                .each(function(){
                    clr = ($(this).attr("adv") != undefined && $(this).attr("adv") ? hov.advTextColor : hov.textColor);
                    $(this).css({"background-color": hov.backgroundColor, "color": clr, "font-weight": hov.textStyle});
                });
		$(".omni-result:not([inx='"+inx+"'])", c)
		.attr("current", "false")
		.unbind("click")
		.css({"background-color": "#FFFFFF", "color": "black", "font-weight": "normal"});
		if (ct) $(b).val($(".omni-result[inx='"+inx+"']", c).html());
	},

	search: function(curomni)
	{
		var b = curomni.bindTo, cur = $(".omni-result[current='true']", ".omni-"+b), b = "#"+b;
		if (curomni.onSearch && $.isFunction(curomni.onSearch)) curomni.onSearch(cur, $(b).val());
	}
};