﻿/// <reference name="MicrosoftAjax.js"/>

if(typeof(oslc_state) != "object")
    var oslc_state = new Object();

function oslc_initSimilarListObject(id,linkId,namesFunction,show, itemwidth)
{
    return new SimilarListControl(id,linkId,namesFunction,show, itemwidth);
}

function oslc_getSimilarListObjectById(id)
{
    var o = oslc_state[id];
    if(o != null) return o;
    for(var i in oslc_state) if((o = oslc_state[i]) != null) if(o.id == id) return o;
    return null;
}

SimilarListControl = function(id,linkId,namesFunction,showMatchCount, itemwidth)
{
    this.id = id;
    this.linkId = linkId;
    this.showMatchCount = showMatchCount;
    this.itemwidth = itemwidth;
    
    this._element = $get(this.id);
    this._linkElement = $get(this.linkId);
    this._element.style.position = "absolute";
    this.namesFunction = namesFunction;
    
    this._lastValue = null;
    this._timeId = 0;
    this._activeItem = null;
    
    $addHandler(this._linkElement,"keyup",Function.createDelegate(this, this._onkeyup));
    $addHandler(this._linkElement,"keydown",Function.createDelegate(this, this._onkeydown));
    
    var blureventHandler = Function.createDelegate(this, this.hide);
    $addHandler(document.body,"click",blureventHandler);
    this._onGetNameSuccessHandler = Function.createDelegate(this,this._onGetNameSuccess);
    
    oslc_state[id] = this;
}

SimilarListControl.prototype = {
    hide: function()
    {
        this._element.style.display = "none";
    },
    show: function()
    {
        if(this._element.childNodes.length > 0)
        {
            var pos = Sys.UI.DomElement.getLocation(this._linkElement);
            Sys.UI.DomElement.setLocation(this._element,pos.x,pos.y + this._linkElement.offsetHeight);
            this._element.style.display = "block";
        }
    },
    get_Value: function()
    {
        return this._linkElement.value;
    },
    set_Value: function(value)
    {
        this._linkElement.value = value;
    },
    get_Visable: function()
    {
        return this._element.style.display != "none";
    },
    setList: function(ld)
    {
        this.clear();
        for(var i in ld)
        {
            var data;
            eval("data = " + ld[i] + ";");
            var oi = document.createElement("div");
            oi.tag = data.Tag;
            oi.className = "similarlistitem";
            oi.title = data.Text;
            $addHandler(oi,"mouseover",Function.createDelegate(this,this._onmouseover));
            $addHandler(oi,"click",Function.createDelegate(this,this._onitemclick));
            this._element.appendChild(oi);
            
            var oi1 = document.createElement("div");
            oi1.style.styleFloat = "left";
            oi1.innerHTML = data.Text;
            oi1.className = "limitstring";
            oi1.width = this.itemwidth + "px";
            
            if(this.showMatchCount)
            {
                var oc = document.createElement("div");
                oc.innerHTML = data.Count.toString() +" 结果";
                oc.style.styleFloat = "right";
                oi.appendChild(oc);
                
                oi1.width = (this.itemwidth - (data.Count.toString().length * 9) - 20).toString() + "px";
            }
            oi.appendChild(oi1);
        }
        if(ld.length > 0)
            this.show();
    },
    clear: function()
    {
        while(this._element.childNodes.length>0)
            this._element.removeChild(this._element.childNodes[0]);
    },
    active: function(actObj)
    {
        if(actObj != null)
        {
            if(this._activeItem != null)
                this._activeItem.className = "similarlistitem";
            this._activeItem = actObj;
            this._activeItem.className = "similarlistitem itemmouseon";
        }
    },
    refreshList: function(refresh)
    {
        this.hide();
        if(typeof(NameService) != "undefined")
        {
            var value = this.get_Value();
            if(value.length > 0)
            {
                if(value != this._lastValue || refresh)
                {
                    if(this._timeId > 0)
                        clearTimeout(this._timeId);
                    var getNamesHandler = Function.createDelegate(this,this._getNames);
                    this._timeId = setTimeout(getNamesHandler,400);
                }
                else
                {
                    this.show();
                    if(this._element.childNodes.length > 0)
                        this.active(this._element.childNodes[0]);
                }
            }
        }
    },
    _onmouseover: function(evt)
    {
        var target = evt.target;
        if(typeof(target.tag) == "undefined")
            target = evt.target.parentNode;
        this.active(target);
    },
    _onkeydown: function(evt)
    {
        switch(evt.keyCode)
        {
            case 38:
                if(this._activeItem != null)
                    this.active(this._activeItem.previousSibling);
                break;
            case 40:
                if(this.get_Visable())
                {
                    if(this._activeItem != null)
                        this.active(this._activeItem.nextSibling);
                    else if(this._element.childNodes.length > 0)
                        this.active(this._element.childNodes[0]);
                }
                else
                {
                    this.refreshList(true);
                }
                break;
            case 39:
                if(this._activeItem != null)
                {
                    this.set_Value(this._activeItem.tag);
                    this.refreshList();
                }
                break;
        }
    },
    _onkeyup: function(evt)
    {
        if(evt.keyCode != 38 && evt.keyCode != 40)
            this.refreshList();
    },
    _onitemclick: function(evt)
    {
        this.set_Value(this._getTarget(evt.target).tag);
    },
    _getTarget: function(target)
    {
        if(typeof(target.tag) == "undefined")
            return target.parentNode;
        return target;
    },
    _getNames: function()
    {
        this._timeId = 0;
        var value = this._linkElement.value;;
        if(value.length > 0)
        {
            this._lastValue = value;
            if(this.namesFunction)
                this.namesFunction(this,this._onGetNameSuccessHandler);
        }
    },

    _onGetNameSuccess: function(result)
    {
        this.setList(result);
    }
}
    

