﻿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;
            }                                            
        }
    }
}