﻿if (typeof (Tangora) == 'undefined') var Tangora = {};
Tangora.QuickSearch = new QuickSearch();

function QuickSearchExactSelector(ownerId, titlefield)
{
	this.ownerId = ownerId;
	this.owner = document.getElementById(this.ownerId);
	this.titlefield = titlefield;

	this.init = function ()
	{
		var that = this;
		this.owner.onkeydown = function (e) { return that.keydown(e, that.owner); };
		Tangora.BroadcastController.Register(this.ownerId, 'onblur', this.onkeyup);
	}

	this.keydown = function (e, elm)
	{
		var ev = e ? e : window.event;
		var keyCode = ev.which ? ev.which : ev.keyCode;

		var that = Tangora.QuickSearch.GetProvider(elm.id);
		var fieldname = that.selector.titlefield;

		if (keyCode == 40 || keyCode == 9 || keyCode == 13)
		{
			var data = that.getData(1);
			if (data.records.length == 1 && that.selector.owner.value.toLowerCase() == data.records[0][fieldname].toLowerCase())
			{
				Tangora.QuickSearch.OnSelectionChanged(that.selector.owner, data);
			}
			CancelBubble(ev);
			if (keyCode == 13) return false;
			return true;
		}
		return true;
	}

	this.onkeyup = function (elm, what, data)
	{
		var that = Tangora.QuickSearch.GetProvider(elm.id);
		var fieldname = that.selector.titlefield;
		if (data.records.length == 1 && that.selector.owner.value.toLowerCase() == data.records[0][fieldname].toLowerCase())
			Tangora.QuickSearch.OnSelectionChanged(that.selector.owner, data); //Tangora.QuickSearch.GetSelection(that,that.titlefield));        
	}

	this.init();
}

function QuickSearchSelector(ownerId, titlefield, debug)
{
	this.ownerId = ownerId;
	this.debug = debug;

	this.owner = document.getElementById(this.ownerId);
	this.titlefield = titlefield;
	this.selector = null;
	this.lastStroke = null;
	this.interval = null;
	this.blurinterval = null;
	this.items = [];
	this.selectorPanel = null;
	this.selectorUP = null;
	this.selctorDOWN = null;

	this._keyFunc = null;

	this.setItems = function (items, data)
	{
		this.selectorPanel.innerHTML = '';
		if (items.length == 0)
		{
			return;
		}
		this.items = items;
		for (var i = 0; i < items.length; i++)
		{
			var li = document.createElement('li');
			var a = document.createElement('a');
			a.href = '#';
			//a.className = 'quicksearchitem';
			//a.style.display = 'block';
			a.id = this.ownerId + '_item' + i;
			a.value = items[i].id;
			a.record = data.records[i];
			var that = this;
			a.onclick = function () { Tangora.QuickSearch.OnSelectionChanged(that.owner, Tangora.QuickSearch.GetSelection(this, that.titlefield)); }
			a.innerHTML = items[i][this.titlefield];
			a.onfocus = function () { clearTimeout(that.blurinterval); }
			a.onblur = function (e) { that.popdown(e, that) };
			a.onkeydown = function (e) { return that.keyhandler(e); }

			li.appendChild(a);

			this.selectorPanel.appendChild(li);
		}

		//        this.selectorUP = document.createElement('li');
		//        var a = document.createElement('a');
		//        a.href = '#';
		//        a.innerHTML = 'UP';
		//        //a.onclick = function() {alert('1');}
		//        a.onfocus = function() {clearTimeout(that.blurinterval);}
		//        this.selectorUP.appendChild(a);
		//        
		//        this.selectorDOWN = document.createElement('li');
		//        a = document.createElement('a');
		//        a.innerHTML = 'DOWN';
		//        this.selectorDOWN.appendChild(a);
		//        
		//        this.selectorPanel.insertBefore(this.selectorUP, this.selectorPanel.firstChild);
		//        this.selectorPanel.appendChild(this.selectorDOWN);
	}

	this.init = function ()
	{
		this.selector = document.createElement('div');
		this.selector.id = 'selector' + ownerId;
		this.selector.className = 'quicksearchselectorbox';
		this.selector.style.display = 'none';

		//this.selector.appendChild(this.selectorUP);

		this.selectorPanel = document.createElement('ul');
		this.selector.appendChild(this.selectorPanel);

		//this.selector.appendChild(this.selectorDOWN);

		this.owner.parentNode.insertBefore(this.selector, this.owner);
		Tangora.BroadcastController.Register(this.ownerId, 'onkeyup', this.onkeyup);
	}

	this.onblur = function ()
	{
		var that = this;
		this.blurinterval = setTimeout(function () { that.hide(); }, 300);
	}

	this.popdown = function (e, instance)
	{
		var ev = e ? e : event;
		var srcElm = (!ev.target) ? ev.srcElement : ev.target;
		if (srcElm.className != 'quicksearchselectorbox')
		{
			instance.onblur.call(instance);
		}
	}

	this.getPosPoint = function (elm)
	{
		if (!elm) return [-1, -1];
		var l = elm.offsetLeft;
		var t = elm.offsetTop;
		var tmp = elm.offsetParent;
		while (tmp != null)
		{
			l += tmp.offsetLeft;
			t += tmp.offsetTop;
			tmp = tmp.offsetParent;
		}
		return [l, t];
	}

	this.show = function ()
	{
		if (!this.selectorPanel.firstChild) return;
		var that = this;
		this.owner.onblur = function (e) { that.popdown(e, that) };
		this.selector.style.display = 'block';
		this.selector.style.overflow = 'hidden';
		this.selector.style.position = 'absolute';
		//this.selector.style.marginTop = this.owner.offsetHeight + 'px';                        
		this.selector.style.left = this.getPosPoint(this.owner)[0] + 'px';
		this.selector.style.top = (this.getPosPoint(this.owner)[1] + this.owner.offsetHeight) + 'px';

		this.selector.onfocus = function () { clearTimeout(that.blurinterval); }
		document.onclick = function (e) { that.popdown(e, that); }
		this._keyFunc = function (e) { return that.keyhandler.call(that, e); };
		Tangora.Events.AddHandler(this.owner, 'onkeydown', this._keyFunc);
	}

	this.keyhandler = function (e)
	{
		var that = this;
		var ev = e ? e : window.event;
		var keyCode = ev.which ? ev.which : ev.keyCode;
		var down = (keyCode == 40);
		var up = (keyCode == 38);
		var elm = ev.target ? ev.target : ev.srcElement;
		if (this.selector.style.display == 'none') return;
		if (down)
		{
			if (elm.tagName.toLowerCase() == 'input')
			{
				this.selectorPanel.firstChild.firstChild.focus();
			}
			else
			{
				if (elm.parentNode.nextSibling) elm.parentNode.nextSibling.firstChild.focus();
				else
				{
					var dp = Tangora.QuickSearch.GetProvider(this.ownerId);
					Tangora.QuickSearch.OnKeyUp(this.owner, dp.cache.records.pagenumber + 1);
					if (this.selectorPanel.firstChild) this.selectorPanel.firstChild.firstChild.focus();
					else this.hide();
				}
			}
		}
		else if (up)
		{
			if (elm.tagName.toLowerCase() == 'input')
			{
				this.selectorPanel.childNodes[this.selectorPanel.childNodes.length - 1].firstChild.focus();
			}
			else
			{
				if (elm.parentNode.previousSibling) elm.parentNode.previousSibling.firstChild.focus();
				else
				{
					var dp = Tangora.QuickSearch.GetProvider(this.ownerId);
					var pgnum = dp.cache.records.pagenumber;
					if (pgnum > 1) pgnum--;
					Tangora.QuickSearch.OnKeyUp(this.owner, pgnum);
					if (this.selectorPanel.childNodes.length > 0) this.selectorPanel.childNodes[this.selectorPanel.childNodes.length - 1].firstChild.focus();
					else this.hide();
				}
			}
		}

		clearTimeout(that.blurinterval);
		CancelBubble(ev);
		return true;
	}

	this.hide = function ()
	{
		//if (!this.debug)
		{
			this.selector.style.display = 'none';
			this.selectedItem = null;
		}
	}

	this.evalTimer = function ()
	{
		if (this.interval != null) clearTimeout(this.interval);
		var that = this;
		this.interval = setTimeout(function () { that.show(); }, 1000);
	}

	this.onkeyup = function (elm, what, data)
	{
		var that = Tangora.QuickSearch.GetProvider(elm.id);
		that.selector.evalTimer.call(that.selector);
		that.selector.selectorPanel.innerHTML = '';
		var fieldname = that.selector.titlefield;
		var items = [];
		for (var i = 0; i < data.records.length; i++)
		{
			var o = {};
			o['id'] = data.records[i]['id'];
			o[fieldname] = data.records[i][fieldname];
			items.push(o);
		}
		that.selector.setItems.call(that.selector, items, data);
	}





	this.init();
}

function QuickSearch()
{
	var dataProviders = [];

	this._findProviderIndex = function (provider)
	{
		for (var i = 0; i < dataProviders.length; i++)
		{
			var p = dataProviders[i];
			if (p.id == provider.id)
			{
				return i;
			}
		}
		return -1;
	}

	this._wrap = function (id, dp)
	{
		return { 'id': id, 'instance': document.getElementById(id), 'getData': dp }
	}

	this.GetProvider = function (id)
	{
		return dataProviders[id];
	}

	this.GetSelection = function (a, titlefieldname)
	{
		var o = {};
		o['id'] = a.value;
		o[titlefieldname] = a.innerHTML;
		return { 'records': [a.record] };
	}

	this.Register = function (id, exactMatch, titlefield, dp, debug)
	{
		dataProviders[id] = this._wrap(id, dp);
		dataProviders[id].exactMatch = exactMatch;
		if (!exactMatch) dataProviders[id].selector = new QuickSearchSelector(id, titlefield, debug);
		else dataProviders[id].selector = new QuickSearchExactSelector(id, titlefield);
	}

	this.UnRegister = function (id)
	{
		var idx = this._findProviderIndex(this._wrap(id));
		if (idx > -1)
		{
			dataProviders = dataProviders.splice(idx, 1);
			return true;
		}
		return false;
	}

	this.OnBlur = function (who)
	{
		var id = who.id;
		var dp = dataProviders[id];
		Tangora.BroadcastController.Broadcast(who, 'onblur', dp.getData());
	}

	this.OnSelectionChanged = function (who, data)
	{
		var id = who.id;
		var dp = dataProviders[id];
		Tangora.BroadcastController.Broadcast(who, 'onselection', data);
	}

	this.OnKeyUp = function (who, pgnum)
	{
		var id = who.id;
		var dp = dataProviders[id];
		Tangora.BroadcastController.Broadcast(who, 'onkeyup', dp.getData(pgnum));
		//Tangora.BroadcastController.Broadcast(who, 'ondata', dp.getData());   
	}

	this.getData = function (providerId, repositoryId, fieldName, pgnum)
	{
		var pagenumber = pgnum ? pgnum : 1;
		var that = Tangora.QuickSearch.GetProvider(providerId);
		var rndkey = new Date().getTime();
		var o = document.getElementById(providerId).value;
		if (!that.lastFilter) that.lastFilter = o;
		else
		{
			if (that.lastFilter == o.value && that.cache && that.cache.records.pagenumber == pagenumber) return that.cache;
		}
		var url = 'http://' + location.host + '/channel.ashx?unid=' + repositoryId + '&output=json&rndkey=' + rndkey + '&pagenumber=' + pagenumber + '&filter=' + fieldName + ',StartingWith,' + encodeURIComponent(o) + '%';
		that.cache = eval(tsAjax.innerHTML(url));
		that.cache.records.pagenumber = pagenumber;
		return that.cache;
	}

	this.setData = function (observerId, data, fieldid)
	{
		var elm = document.getElementById(observerId);
		if (elm)
		{
			switch (elm.tagName.toLowerCase())
			{
				case 'input':
					if (elm.type == 'text' || elm.type == 'hidden')
					{
						if (data.records.length > 0) elm.value = data.records[0][fieldid];
						else elm.value = '';
					}
					else if (elm.type == 'checkbox')
					{
						if (data.records.length > 0) elm.checked = (data.records[0][fieldid] == '1' || data.records[0][fieldid] == 'true');
						else elm.checked = false;
					}
					break;
				case 'textarea':
					if (data.records.length > 0) elm.innerHTML = data.records[0][fieldid];
					else elm.innerHTML = '';
					break;
				case 'select':
					var idx = -1;
					if (data.records.length > 0)
					{
						var value = data.records[0][fieldid];
						if (isNaN(value))
						{
							for (var i = 0; i < elm.options.length; i++)
							{
								if (elm.options[i].text == value)
								{
									idx = i;
									break;
								}
							}
						}
						else
						{
							for (var i = 0; i < elm.options.length; i++)
							{
								if (elm.options[i].value == value)
								{
									idx = i;
									break;
								}
							}
						}
					}
					if (idx > -1) elm.options[i].selected = true;
					break;
			}
		}
	}
}
