﻿/************************************************\
' Qbrix software fadelist object                 '
'************************************************'
' All code is made and owned by Qbrix software.  '
' You are not allowed to change the code or to   '
' copy it to your own server.                    '
'                                                '
' All rights reserved by Qbrix software 2007     '
\************************************************/

// Declare a single namespace in the global scope
var dk;
if (!dk) dk = {};
else if (typeof(dk) != 'object')
	throw new Error('Der findes allerede en global variabel ved navn \u0027dk\u0027, som ikke er et object');
if (!dk.qbrix) dk.qbrix = { };
else if (typeof(dk.qbrix) != 'object')
	throw new Error('Der findes allerede en global variabel ved navn \u0027dk.qbrix\u0027, som ikke er et object');

dk.qbrix.FadeList = function(/*optional*/fade_time, /*optional*/fade_steps)
{
    var _items = [];
    var _colors = new dk.qbrix.FadeColors();

    var _fadetime = 100;
    var _fadesteps = 10;
    if (arguments.length > 0 && typeof(fade_time) == 'number')
        _fadetime = fade_time;
    if (arguments.length > 1 && typeof(fade_steps) == 'number')
        _fadesteps = fade_steps;
    
    this.Initialize = function(list_name, /*optional*/ tag_name, /*optional*/ keep_current_items)
    {
        var list = document.getElementById(list_name);
        if (list == null)
            return false;
        
        // Set optional arguments
        if (arguments.length < 2) tag_name = 'tr';
        if (arguments.length < 3) keep_current_items = false;

        // Clear array
        if (!keep_current_items)
        {
            while (_items.length > 0)
                _items.pop();
        }

        // Get list elements
        var elms = list.getElementsByTagName(tag_name);
        var fi;
        
        for (var n = 0; n < elms.length; n++)
        {
            // Create list item
            fi = new dk.qbrix.FadeItem(elms[n], this);
            if (fi.Initialize())
                _items.push(fi);
        }
    }
    
    this.GetColors = function()
    {
        return _colors;
    }
    this.GetFadeTime = function()
    {
        return _fadetime;
    }
    this.GetFadeSteps = function()
    {
        return _fadesteps;
    }
    
    this.SetSelected = function(id)
    {
        if (arguments.length < 1 || typeof(id) != 'number') 
            return false;

        for (var n = 0; n < _items.length; n++)
            _items[n].SetSelected(_items[n].GetId(n) == id);
    }
    
    this.SetStyles = function(hover_style, selected_style)
    {
        var rules;
        var found = 0;
        
        // Run through stylesheets
        for (var i = 0; i < document.styleSheets.length; i++)
        {
            // Get rules array in each stylesheet
            if (document.styleSheets[i].cssRules)
	            rules = document.styleSheets[i].cssRules;
            else if (document.styleSheets[i].rules)
	            rules = document.styleSheets[i].rules;
	        else
	            rules = new Array();
	        
	        // Run through styles
            for (var n = 0; n < rules.length; n++)
            {
                if (rules[n].selectorText == hover_style)
                {
                    _colors.setColor(1, true,  rules[n].style['color']);
                    _colors.setColor(1, false, rules[n].style['backgroundColor']);
                    found++;
                }
                else if (rules[n].selectorText == selected_style)
                {
                    _colors.setColor(2, true,  rules[n].style['color']);
                    _colors.setColor(2, false, rules[n].style['backgroundColor']);
                    found++;
                }
                if (found > 1)
                    break;
            }   
            if (found > 1)
                break;
        }
    }
}

dk.qbrix.FadeColors = function()
{
    // Initialize colors
    var _color1F = 'ffffff';    // Hover color
    var _color1B = 'aaaaaa';    //   -- "" --
    var _color2F = '003366';    // Selection color
    var _color2B = 'ffffff';    //   -- "" --
    
    this.setColors = function(col1f, col1b, col2f, col2b)
    {
        if (typeof(col1f) == 'string') this.setColor(1, true,  col1f);
        if (typeof(col1b) == 'string') this.setColor(1, false, col1b);
        if (typeof(col2f) == 'string') this.setColor(2, true,  col2f);
        if (typeof(col2b) == 'string') this.setColor(2, false, col2b);
    }
    
    this.setColor = function(num, front, color)
    {
        if (typeof(color) != 'string') return;
        
        var s = this.ConvertRGBColor(color);
        s = s.replace('#', '');
        if (s.length != 6) return;
        
        switch (num)
        {
            case 1:
                if (front) _color1F = s;
                else       _color1B = s;
                break;
            case 2:
                if (front) _color2F = s;
                else       _color2B = s;
                break;
        }
    }
    
    this.getColor = function(num, front)
    {
        switch (num)
        {
            case 1:
                if (front) return _color1F;
                else       return _color1B;
            case 2:
                if (front) return _color2F;
                else       return _color2B;
        }
    }
    
    this.ConvertRGBColor = function(color)
    {
        var s = color;
        if (s != null && s.indexOf('rgb') > -1)
        {
            s = s.replace('rgb', '').replace('(','').replace(')','');
            var c = s.split(',');
            s = '#';
            for (n in c)
            {
                c[n] = parseInt(c[n]).toString(16);
                while (c[n].length < 2)
                    c[n] = '0' + c[n];
                s += c[n];
            }
        }
        return s;
    }
}

/******************************************
 * Fade-item class definition
 *****************************************/
dk.qbrix.FadeItem = function(element, parent)
{
    var _that = this;
    var _id;
    var _timer = null;
    var _selected;
    var _colors = null;
    var _cf, _cb;
    
    this.Initialize = function()
    {
        if (typeof(element) != 'object')
            return false;
            
        //_id = parseInt(element.id.replace(/\D*/ig, ''));
        //if (isNaN(_id))
          //  return false;
        
        // Get current colors
        _cf = QB.Object.GetStyle(element, 'color');
        _cb = QB.Object.GetStyle(element, 'backgroundColor');

        _timer = new dk.qbrix.Timer(parent.GetFadeTime(), parent.GetFadeSteps(), this.MouseOutInterval);
        _selected = false;
        _colors = new dk.qbrix.FadeColors();
        
        if (document.attachEvent)
        {
            element.attachEvent('onmouseover', this.MouseOver);
            element.attachEvent('onmouseout', this.MouseOut);
        }
        else
        {
            element.addEventListener('mouseover', this.MouseOver, false);
            element.addEventListener('mouseout', this.MouseOut, false);
        }
        
        return true;
    }
    
    this.GetObject = function()
    {
        return element;
    }
    this.GetId = function()
    {
        return _id;
    }
    
    this.MouseOver = function(e)
    {
        var color = parent.GetColors();
        if (_selected) return;
        if (color == null) return;
        
        _colors.setColor(1, true,  _cf);
        _colors.setColor(1, false, _cb);
        _colors.setColor(2, true,  color.getColor(1, true));
        _colors.setColor(2, false, color.getColor(1, false));
        
        _timer.stop();
        _timer.start();
    }
    
    this.MouseOut = function(e)
    {
        var color = parent.GetColors();
        if (_selected) return;
        if (color == null) return;

        _colors.setColor(1, true,  color.getColor(1, true));
        _colors.setColor(1, false, color.getColor(1, false));
        _colors.setColor(2, true,  _cf);
        _colors.setColor(2, false, _cb);
        
        _timer.stop();
        _timer.start();
    }
    
    this.MouseOutInterval = function(counter)
    {
        var start_front, start_back;
        var end_front, end_back;
        var diff_front, diff_back;
        var step;
        var v;
        var sf = '#', sb = '#';
        
        for (var n = 0; n < 3; n++)
        {
            start = parseInt(_colors.getColor(1, true).substring(n*2, n*2+2), 16);
            end   = parseInt(_colors.getColor(2, true).substring(n*2, n*2+2), 16);
            diff  = end - start;
            step  = diff / parent.GetFadeSteps();
            v = (Math.floor(start + counter * step)).toString(16);
            while (v.length < 2)
                v = '0' + v;
            sf += v;
            
            start = parseInt(_colors.getColor(1, false).substring(n*2, n*2+2), 16);
            end   = parseInt(_colors.getColor(2, false).substring(n*2, n*2+2), 16);
            diff  = end - start;
            step  = diff / parent.GetFadeSteps();
            v = (Math.floor(start + counter * step)).toString(16);
            while (v.length < 2)
                v = '0' + v;
            sb += v;
        }
        
        element.style['backgroundColor'] = sb;
        element.style['color']           = sf;
    }
    
    this.SetSelected = function(selected)
    {
        _selected = Boolean(selected);
        if (_selected) 
        {
            _timer.stop();
            element.style['color']           = '#' + parent.GetColors().getColor(2, true);
            element.style['backgroundColor'] = '#' + parent.GetColors().getColor(2, false);
        }
        else
        {
            element.style['color']           = _cf;
            element.style['backgroundColor'] = _cb;
        }
        element.blur();
    }
}

