/* QwwJs_ImageBasedListBoxCtlMgr
 * 
 * Part of the QlikWeb WorkBench Javascript Library (http://www.qlikwebworkbench.com)
 *
 * Copyright (c) 2007 Industrial CodeBox Ltd. All Rights Reserved.
 * http://www.industrialcodebox.com
 * Email support@industrialcodebox.com for licensing and support information.
 */
function QwwJs_ImageBasedListBoxCtlMgr(cfgObj)
{
    var cfg;
    
    // object level properties here
    this.cfg = cfgObj;
     
    //--------------------------------------------------------------
    // Setting up defaults
        if(!this.cfg.OperationMode)
            this.cfg.OperationMode = "SingleSelectAlwaysOne";

        if(!this.cfg.RenderMode)
            this.cfg.RenderMode = "CommonImages";
            
        if(!this.cfg.InitialSelection)
            this.cfg.InitialSelection = null;
                
    // End of setting up defaults
    //--------------------------------------------------------------
    
    //Creates an instance of Controls.Support.js QwwJs_ListBoxMgr passing the QlikView Object's ID
    this.ListBoxMgr = new QwwJs_ListBoxMgr(this.cfg.ObjectID);

    // -----------------------------------------------------------------
    // object methods start here
    //
    
    //This function calls the updateResults method in Controls.Support.js, which
    //ensures that the QlikView application is updated for any selections.
    this.Refresh = function(results, data)
    {   
        //var all = this.ListBoxMgr.GetAllItems();
                    
        var all = results.all;
        
        var cfg = data.cfg;

        //loop through each of the items in the listbox so that the correct image can be set        
        for(var i = 0; i < cfg.ImageIDs.length; i++)
        {            
            var id = cfg.ImageIDs[i];
                                
            var img = data.getImageForItem(id);
            var elemId = id.replace("#","");
            var elem = document.getElementById(elemId);
            elem.setAttribute("src", img);
            
            // Set the image for the item
            // NOTE : this wasn't working for ids with funny chars, e.g. umlauts
            //$(id).attr({"src" : this.getImageForItem(id)}); 
            
            for(var j = 0; j < all.length; j++)
            {
                var text = all[j].Text;
                var textFromId = getElementTextFromId(id);
                
                if(text == textFromId)
                {
                    elem.value = all[j].Value;
                    break;
                }        
            }

        }
        
        if(data.OnSelectionChanged)
            data.OnSelectionChanged(all, this.OnSelectionChangedData);
    };

    this.RegisterOnSelectionChangedCallBack = function(callback, data)
    {
        this.OnSelectionChanged = callback;
        this.OnSelectionChangedData = data;
    };
    
    this.RegisterOnItemClickedCallBack = function(callback, data)
    {
        this.OnItemClicked = callback;
        this.OnItemClickedData = data;
    };


    function getElementTextFromId(id)
    {
        //following lines extract the item's value in the right format    
        var value = id.replace("#", "");

        var splitOnUnderscore = id.split("_");

        var listItemText = splitOnUnderscore[1];
        
        return listItemText;    
    };   
        
    // called when item is clicked
    this.itemClicked = function()
    {
        var id = this.id;
        
        //takes the selected listbox item and exracts it's value.
        var splitOnUnderscore = id.split("_");

        var listItemText = splitOnUnderscore[1];
        
        var imageElement = this;
        var value = imageElement.value;
        
        imageElement.lbm.MakeSingleSelection(value);
        
        var imageBasedListBoxMgr = this.ImageBasedListBoxMgr;
        
        if(imageBasedListBoxMgr.OnItemClicked)
            imageBasedListBoxMgr.OnItemClicked(listItemText, value, value, imageBasedListBoxMgr.OnItemClickedData);
    };

    //this function determines the correct image to use for the listbox items
    this.getImageForItem = function(id)
    {
        var listItemText = getElementTextFromId(id);

        //calls a function to return an array of all the items selected in QlikView application        
        var selectedItems = this.ListBoxMgr.GetAllSelectedItems();

        if(this.cfg.RenderMode != null && this.cfg.RenderMode == "CommonImages")
        {
            if(this.cfg.OperationMode != null && this.cfg.OperationMode == "SingleSelectAlwaysOne")
            {
                //checks that there are selected items in the listbox
                if(selectedItems.length == 1)
                {
                    for(var i = 0; i < selectedItems.length; i++)
                    {
                        if(selectedItems[i] == listItemText)
                        {
                           return this.cfg.ImagePath + "selected." + this.cfg.ImageExtension;
                        }
                        else
                        {
                           return this.cfg.ImagePath + "unselected." + this.cfg.ImageExtension;
                        }
                    }
                }
                else if(selectedItems.length > 1){
                    alert("Can only be one selected item in SingleSelectMode");}
                else
                {
                    return this.cfg.ImagePath + "unselected." + this.cfg.ImageExtension;
                }
            }
        }
        else
        {
            alert("This mode is not supported");

            return "";
        }       
    };
          
    // helper method to report objects state
    // add to alert as necessary      
    this.summariseState = function()
    {
        var s =  "State:";
        
        s += "\nObjectID=" + this.setupObject.ObjectID;
        s += "\nOperationMode=" + this.setupObject.OperationMode;
        s += "\nInitialSelection=" + this.setupObject.InitialSelection;
        s += "\nImageExtension=" + this.setupObject.ImageExtension;
        s += "\nInitialSelection=" + this.setupObject.InitialSelection;
        s += "\nImagePath=" + this.setupObject.ImagePath;
        s += "\nImageIDs=";        
        
        for(var i = 0; i < this.setupObject.ImageIDs.length; i++)
        {
            s += this.setupObject.ImageIDs[i] + ",";
        }
        
        alert(s);
        
        this.ListBoxMgr.show();
    };
    
    //
    // object methods end here
    // -----------------------------------------------------------------

 
    // -----------------------------------------------------------------
    // constructor code starts here
    //
        
    this.OnDocumentLoaded = function()
    {
        for(var i = 0; i < this.cfg.ImageIDs.length; i++)
        {
            var id = this.cfg.ImageIDs[i];
            
            var elemId = id.replace("#","");
            
            // Make it so the hand cursor appears on hovering            
            var elem = document.getElementById(id.replace("#",""));
            
            elem.style.cursor="pointer";
            
            elem.lbm = this.ListBoxMgr;
            elem.onclick = this.itemClicked;
            elem.ImageBasedListBoxMgr = this;
            //$(id).bind("click", this, this.itemClicked);
        };
    };
   
    this.ListBoxMgr.RegisterUpdatedCallBack(this.Refresh, this);
    //
    // constructor code ends here
    // -----------------------------------------------------------------
  
    if(qwwHub)
        qwwHub.Register(this); 
};