/*
PLIK z kodem javascript do dynamicznego menu
wspólny dla różnych serwisów
w serwisach proszę tworzyć link symboliczny:
htdocs/xxx/wdj.js -> ../../common/wdj.js
*/

function isObject(a) {
    return (a && typeof a == 'object');
}

function isArray(a) {
    return a && typeof a == 'object' && a.constructor == Array;
}

function wdj_elementLeft (eElement)
{
    var nLeftPos = eElement.offsetLeft;          // initialize var to store calculations
    var eParElement = eElement.offsetParent;     // identify first offset parent element

    while (eParElement != null)
    {                                            // move up through element hierarchy
        nLeftPos += eParElement.offsetLeft;      // appending left offset of each parent

        if (eParElement.style.position == "absolute")
            break;

        eParElement = eParElement.offsetParent;  // until no more offset parents exist
    }
    return nLeftPos;                             // return the number calculated
}

function wdj_elementTop (eElement)
{
    var nTopPos = eElement.offsetTop;            // initialize var to store calculations
    var eParElement = eElement.offsetParent;     // identify first offset parent element
    while (eParElement != null)
    {                                            // move up through element hierarchy
        nTopPos += eParElement.offsetTop;        // appending top offset of each parent

        if (eParElement.style.position == "absolute")
            break;

        eParElement = eParElement.offsetParent;  // until no more offset parents exist
    }
    return nTopPos;                              // return the number calculated
}


    // wd_state = "closed", "closing", "opening", "opened"
    var wdj_showTimeout = 20;
    var wdj_hideTimeout = 200;

    function wdj_getObj (name)
    {
        var e = document.getElementById (name);
        return e;
    }

    function wdj_setTimeout (wyrazenie, czas)
    {
        var e = window.setTimeout (wyrazenie, czas);
        return e;
    }

    function wdj_clearTimeout (id)
    {
        window.clearTimeout (id);
    }

    function wdj_click ()
    {
        if (this.myself.href)
            document.location.href = this.myself.href;
    }

    function wdj_openMenu_c0 ()
    {
        wdj_openMenu (this.myself.id, 0);
    }

    function wdj_openMenu_c1 ()
    {
        wdj_openMenu (this.myself_id, 1);
    }

    function wdj_openMenu (id, recurse)
    {
        var children = wdj_getObj ('wdm_' + id);
        // Jesli jeszcze nie ma menu, to może trzeba je stworzyć
        if (! children)
        {
            var parent = wdj_getObj ('wdi_' + id);
            if (parent && parent.myself)
            {
                wdj_create_main_item (parent.myself);
                children = wdj_getObj ('wdm_' + id);
            }
        }

        if (children && (children.wdj_state == "closed" || children.wdj_state == "closing"))
        {
            if (children.wdj_hideTimeout)
                wdj_clearTimeout (children.wdj_hideTimeout);

            children.wdj_showTimeout = wdj_setTimeout ("wdj_showMenu (\"" + id + "\")", wdj_showTimeout);
            children.wdj_state = "opening";

            var parent;
            if (recurse && children.wdj_parent && (parent = wdj_getObj ('wdm_' + children.wdj_parent)))
                wdj_openMenu (children.wdj_parent, 1);
        }
    }

    function wdj_showMenu (id)
    {
        var parent = wdj_getObj ('wdi_' + id);
        var children = wdj_getObj ('wdm_' + id);

        if (parent && children);
        {
            var left = wdj_elementLeft(parent);
            var top = wdj_elementTop(parent);
            var width = parent.offsetWidth;
            var height = parent.offsetHeight;
            var child_width = children.offsetWidth;
            var child_height = children.offsetHeight;

            var left_shift = 0;
            var top_shift = 0;

            var orientation = children.orientation_switch * 8 + children.orientation * 4 + children.orientation_dir * 2 + children.orientation_align;
            switch (orientation)
            {
                case 0: // w pionie, po prawej, wyrównanie do góry
                case 12: // w poziomie, po prawej, wyrównanie do góry
                    left_shift = width;
                    top_shift = 0;
                    break;
                case 1: // w pionie, po prawej, wyrównanie do dołu
                case 13: // w poziomie, po prawej, wyrównanie do dołu
                    left_shift = width;
                    top_shift = height - child_height;
                    break;
                case 2: // w pionie, po lewej, wyrównanie do góry
                case 14: // w poziomie, po lewej, wyrównanie do góry
                    left_shift = -1 * child_width;
                    top_shift = 0;
                    break;
                case 3: // w pionie, po lewej, wyrównanie do góry
                case 15: // w poziomie, po lewej, wyrównanie do góry
                    left_shift = -1 * child_width;
                    top_shift = height - child_height;
                    break;
                case 4: // w poziomie, poniżej, wyrównanie do lewej
                case 8: // w pionie, poniżej, wyrównanie do lewej
                    left_shift = 0;
                    top_shift = height;
                    break;
                case 5: // w poziomie, poniżej, wyrównanie do prawej
                case 9: // w pionie, poniżej, wyrównanie do prawej
                    left_shift = width - child_width;
                    top_shift = height;
                    break;
                case 6: // w poziomie, powyżej, wyrównanie do lewej
                case 10: // w pionie, powyżej, wyrównanie do lewej
                    left_shift = 0;
                    top_shift = -1 * child_height;
                    break;
                case 7: // w poziomie, powyżej, wyrównanie do prawej
                case 11: // w pionie, powyżej, wyrównanie do prawej
                    left_shift = width - child_width;
                    top_shift = -1 * child_height;
                    break;
            }
            children.style.left = left + left_shift + children.horizontal_shift;
            children.style.top = top + top_shift + children.vertical_shift;

            children.style.visibility='visible';

            children.wdj_state = "opened";
        }
    }

    function wdj_hideMenu_c0 ()
    {
        wdj_hideMenu (this.myself.id, 0);
    }

    function wdj_hideMenu_c1 ()
    {
        wdj_hideMenu (this.myself_id, 1);
    }

    function wdj_hideMenu (id, recurse)
    {
        var children = wdj_getObj ('wdm_' + id);
        if (children && (children.wdj_state == "opened" || children.wdj_state == "opening"))
        {
            if (children.wdj_showTimeout)
                wdj_clearTimeout (children.wdj_showTimeout);

            children.wdj_hideTimeout = wdj_setTimeout ("wdj_closeMenu (\"" + id + "\")", wdj_hideTimeout);
            children.wdj_state = "closing";

            var parent;
            if (recurse && children.wdj_parent && (parent = wdj_getObj ('wdm_' + children.wdj_parent)))
                wdj_hideMenu (children.wdj_parent, 1);
        }
    }

    function wdj_closeMenu (id)
    {
        var parent = wdj_getObj ('wdi_' + id);
        var children = wdj_getObj ('wdm_' + id);

        if (parent && children);
        {
            children.style.visibility='hidden';
            children.wdj_state = "closed";
        }
    }

    function wdj_find_item (prefix, id, tuple)
    {
        // Jesli brak id, zwróć korzeń
        if (! id)
            return eval (prefix + "wdj_items");

        var t = (tuple ? tuple : eval (prefix + "wdj_all_items"));
        return t [id];
    }

    function wdj_ci (prefix, id, parent, txt, href)
    {
        var p = wdj_find_item (prefix, parent);
        if (! p)
        {
            alert ('Nie można utworzyć drzewa');
            return;
        }

        var item = new wdj_item_data (prefix, id, parent, txt, href);

        // zapamiętaj level
        item.level = (p.level ? p.level : 0) + 14;
        // zapamiętaj string
        item.branch = (p.branch ? p.branch : "") + "_" + (p.items.length + 1);

        p.items.push (item);
        eval (prefix + "wdj_all_items") [id] = item;
    }

    function wdj_item_data (prefix, id, parent, txt, href)
    {
        this.prefix = prefix;

        this.id = id ? prefix + id : id;
        this.parent = parent ? prefix + parent : parent;

        this.txt = txt;
        this.href = href;

        this.level = 0;
        this.branch = "";

        this.items = new Array ();
    }

    function wdc_add (prefix, name, type, key, value)
    {
        name = name.toString();
        if (! eval (prefix + "wdj_config") [name])
            eval (prefix + "wdj_config") [name] = new Array;
        var o = eval (prefix + "wdj_config") [name];
        if (! isArray (o))
            o = new Array;

        if (type != null)
        {
            type = type.toString();
            key = key.toString();

            if (! isArray (o [type]))
                o [type] = new Array;
            var l = o [type];

            l [key] = value;
        }
        else
            o ['v'] = value;
    }

    function wdc_full_get (prefix, name, branch, level)
    {
        // sprawdzamy, czy wartość w ogóle istnieje
        name = name.toString ();

        var o = eval (prefix + "wdj_config") [name]
        if (! isArray (o))
            // wartość w ogóle nie istnieje
            return;

        if (isArray (o ['bl']) || isArray (o ['b']))
        {
            branch = branch.toString ();
            level = level.toString ();

            var b = branch;

            while (b.length)
            {
                if (isArray (o ['bl']) && o ['bl'][level + b] !== undefined)
                    return o ['bl'][level + b];

                if (isArray (o ['b']) && o ['b'][b] !== undefined)
                    return o ['b'][b];

                b = b.substring (0, b.lastIndexOf ("_"));
            }
        }

        if (isArray (o ['l']))
        {
            level = level.toString ();

            if (isArray (o ['l']) && o ['l'][level] !== undefined)
                return o ['l'][level];
        }

        return o ['v'];
    }

    function wdj_create_main_item (item_data)
    {
        var placeholder = document.getElementById (item_data.prefix + "wdj_placeholder");
        if (item_data.items.length)
        {
            var row;
            var item;
            var table;
            var tbody;
            table = document.createElement("table");
            item = tbody = document.createElement("tbody");
            table.appendChild (tbody);
            item.style.zIndex = item_data.level + 1;

            var orientation = parseInt ("0" + wdc_full_get (item_data.prefix, 'orientation', item_data.branch, item_data.level)) % 2;
            table.orientation = orientation;
            table.orientation_dir = parseInt ("0" + wdc_full_get (item_data.prefix, 'orientation_dir', item_data.branch, item_data.level)) % 2;
            table.orientation_align = parseInt ("0" + wdc_full_get (item_data.prefix, 'orientation_align', item_data.branch, item_data.level)) % 2;
            table.orientation_switch = parseInt ("0" + wdc_full_get (item_data.prefix, 'orientation_switch', item_data.branch, item_data.level)) % 2;

            table.vertical_shift = parseInt (wdc_full_get (item_data.prefix, 'vertical_shift', item_data.branch, item_data.level));
            table.horizontal_shift = parseInt (wdc_full_get (item_data.prefix, 'horizontal_shift', item_data.branch, item_data.level));

            if (isNaN (table.vertical_shift))
                table.vertical_shift = 0;
            if (isNaN (table.horizontal_shift))
                table.horizontal_shift = 0;

            if (orientation % 2)
            {
                row = document.createElement("tr");
                item.appendChild (row);
            }

            var class_prefix = wdc_full_get (item_data.prefix, 'prefix-class', item_data.branch, item_data.level);
            var class_prefixes = get_class_prefixes (class_prefix + "_table", item_data.branch, item_data.level);
            table.className = class_prefixes;

            var tmp;
/*
            if ((tmp = wdc_full_get (item_data.prefix, 'width', item_data.branch, item_data.level)) !== undefined) {table.style.width = tmp; alert ("WIDTH: " + tmp);}
            if ((tmp = wdc_full_get (item_data.prefix, 'height', item_data.branch, item_data.level)) !== undefined) table.style.height = tmp;

            if ((tmp = wdc_full_get (item_data.prefix, 'color', item_data.branch, item_data.level)) !== undefined) table.style.color = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'background-color', item_data.branch, item_data.level)) !== undefined) table.style.backgroundColor = tmp;

            if ((tmp = wdc_full_get (item_data.prefix, 'text-align', item_data.branch, item_data.level)) !== undefined) table.style.textAlign = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'vertical-align', item_data.branch, item_data.level)) !== undefined) table.style.verticalAlign = tmp;

            if ((tmp = wdc_full_get (item_data.prefix, 'table-cellspacing', item_data.branch, item_data.level)) !== undefined) table.setAttribute ("cellpadding", tmp);
            if ((tmp = wdc_full_get (item_data.prefix, 'table-cellpadding', item_data.branch, item_data.level)) !== undefined) table.setAttribute ("cellspacing", tmp);
            if ((tmp = wdc_full_get (item_data.prefix, 'table-cellspacing', item_data.branch, item_data.level)) !== undefined) table.cellPadding = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'table-cellpadding', item_data.branch, item_data.level)) !== undefined) table.cellSpacing = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'table-border', item_data.branch, item_data.level)) !== undefined) table.setAttribute ("border", tmp);
            if ((tmp = wdc_full_get (item_data.prefix, 'table-border', item_data.branch, item_data.level)) !== undefined) table.border = tmp;

            if ((tmp = wdc_full_get (item_data.prefix, 'padding', item_data.branch, item_data.level)) !== undefined) table.style.padding = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'border', item_data.branch, item_data.level)) !== undefined) table.style.border = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'border-color', item_data.branch, item_data.level)) !== undefined) table.style.borderColor = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'border-width', item_data.branch, item_data.level)) !== undefined) table.style.borderWidth = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'border-style', item_data.branch, item_data.level)) !== undefined) table.style.borderStyle = tmp;
*/
            if (item_data.id)
            {
                table.id = "wdm_" + item_data.id;
                table.myself_id = item_data.id;

                //to są poddrzewa, schowaj je
                table.style.position = "absolute";
                table.style.visibility = "hidden";
                table.wdj_state = "closed";

                // jeśli kursor najedzie na nie, to pokaż je (rekursywnie, czyli rodziców też)
                table.onmouseover = wdj_openMenu_c1;
                table.onmouseout = wdj_hideMenu_c1;

                // Jesli rodzic nie jest głównym drzewem, zapamiętaj jego id dla rekursywnego rozwijania
                if (item_data.parent)
                    table.wdj_parent = item_data.parent;
            }

            var i;
            for (i = 0; i < item_data.items.length; i++)
            {
                wdj_create_item (orientation % 2 ? row : item, item_data.items [i], orientation);

                // Jeśli chcesz tworzyć całe menu na starcie, to odkomentuj poniższe linie
                // if (item_data.items [i].items.length)
                //     wdj_create_main_item (item_data.items [i]);
            }

            placeholder.appendChild (table);
        }
    }

    function wdj_create_item (placeholder, item_data, orientation)
    {
        var item_td;
	
//	item_td = document.createElement("td");
//        var item = document.createElement("a");
//        item_td.appendChild (item);
	
        var item = document.createElement("td");

        item.myself = item_data;
        item.id = "wdi_" + item_data.id;

        var class_prefix = wdc_full_get (item_data.prefix, 'prefix-class', item_data.branch, item_data.level);
        var class_prefixes = get_class_prefixes (class_prefix, item_data.branch, item_data.level);
	
	if (item_td)
    	    item_td.className = class_prefixes;
	else
    	    item.className = class_prefixes;

        item.orientation = orientation;

        if (item_data.items.length)
        {
            item.onmouseover = wdj_openMenu_c0;
            item.onmouseout = wdj_hideMenu_c0;
        }

        if (! orientation)
        {
            var row;
            row = document.createElement("tr");
            placeholder.appendChild (row);

            placeholder = row;
        }

        var item_html = wdc_full_get (item_data.prefix, 'item-html', item_data.branch, item_data.level);
        if (item_html)
        {
            // dzi?ki temu mo?na dodawa? obrazki....
            item.innerHTML = item_html;
        }
        else
        {
            // standartowo zwyk?y tekst
            var txt = document.createTextNode(item_data.txt ? item_data.txt : "");
            item.appendChild (txt);
        }

        if (item_data.items.length)
        {
            var pre = wdc_full_get (item_data.prefix, orientation ? 'item-image-horizontal-pre' : 'item-image-vertical-pre', item_data.branch, item_data.level);
            var post = wdc_full_get (item_data.prefix, orientation ? 'item-image-horizontal-post' : 'item-image-vertical-post', item_data.branch, item_data.level);
            item.innerHTML = (pre ? pre : "") + item.innerHTML + (post ? post : "");
        }

        var pre = wdc_full_get (item_data.prefix, 'item-pre', item_data.branch, item_data.level);
        var post = wdc_full_get (item_data.prefix, 'item-post', item_data.branch, item_data.level);
        item.innerHTML = (pre ? pre : "") + item.innerHTML + (post ? post : "");


        var tmp;
/*
        if ((tmp = wdc_full_get (item_data.prefix, 'item-width', item_data.branch, item_data.level)) !== undefined) item.style.width = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-height', item_data.branch, item_data.level)) !== undefined) item.style.height = tmp;

        if ((tmp = wdc_full_get (item_data.prefix, 'item-color', item_data.branch, item_data.level)) !== undefined) item.style.color = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-background-color', item_data.branch, item_data.level)) !== undefined) item.style.backgroundColor = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-font-size', item_data.branch, item_data.level)) !== undefined) item.style.fontSize = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-font-style', item_data.branch, item_data.level)) !== undefined) item.style.fontStyle = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-font-weight', item_data.branch, item_data.level)) !== undefined) item.style.fontWeight = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-text-decoration', item_data.branch, item_data.level)) !== undefined) item.style.textDecoration = tmp;

        if ((tmp = wdc_full_get (item_data.prefix, 'item-text-align', item_data.branch, item_data.level)) !== undefined) item.style.textAlign = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-vertical-align', item_data.branch, item_data.level)) !== undefined) item.style.verticalAlign = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-align', item_data.branch, item_data.level)) !== undefined) item.setAttribute ("align", tmp);
        if ((tmp = wdc_full_get (item_data.prefix, 'item-valign', item_data.branch, item_data.level)) !== undefined) item.setAttribute ("valign", tmp);
        if ((tmp = wdc_full_get (item_data.prefix, 'item-align', item_data.branch, item_data.level)) !== undefined) item.style.align = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-valign', item_data.branch, item_data.level)) !== undefined) item.style.verticalAlign = tmp;

        if ((tmp = wdc_full_get (item_data.prefix, 'item-padding', item_data.branch, item_data.level)) !== undefined) item.style.padding = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-border', item_data.branch, item_data.level)) !== undefined) item.style.border = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-border-color', item_data.branch, item_data.level)) !== undefined) item.style.borderColor = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-border-style', item_data.branch, item_data.level)) !== undefined) item.style.borderStyle = tmp;
        if ((tmp = wdc_full_get (item_data.prefix, 'item-border-width', item_data.branch, item_data.level)) !== undefined) item.style.borderWidth = tmp;
*/

        // link może wskazywać gdzieś indziej ... albo zupełnie nie byc linkiem
        if ((tmp = wdc_full_get (item_data.prefix, 'item-href', item_data.branch, item_data.level)) !== undefined) item_data.href = tmp;
        if (item_data.href)
        {
            // pointer nie dziala w Explorerze :(
	    // hand nie dziala w Gecko, pointer dziala w IE i Gecko!
            item.style.cursor = "pointer";
            //item.style.cursor = "hand";
            item.onclick = wdj_click;

            var class_prefix = wdc_full_get (item_data.prefix, 'prefix-class', item_data.branch, item_data.level);
            var class_prefixes = get_class_prefixes (class_prefix + "_link", item_data.branch, item_data.level);
//            item.className = item.className.toString () + " " + class_prefixes;

	    var html = item.innerHTML;
	    item.innerHTML = "<a class=\"" + class_prefixes + "\" href=\"" + item_data.href + "\">" + html + "</a>";
/*
            if ((tmp = wdc_full_get (item_data.prefix, 'link-color', item_data.branch, item_data.level)) !== undefined) item.style.color = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'link-background-color', item_data.branch, item_data.level)) !== undefined) item.style.backgroundColor = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'link-font-size', item_data.branch, item_data.level)) !== undefined) item.style.fontSize = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'link-font-style', item_data.branch, item_data.level)) !== undefined) item.style.fontStyle = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'link-font-weight', item_data.branch, item_data.level)) !== undefined) item.style.fontWeight = tmp;
            if ((tmp = wdc_full_get (item_data.prefix, 'link-text-decoration', item_data.branch, item_data.level)) !== undefined) item.style.textDecoration = tmp;
*/
        }

	if (item_td)
            placeholder.appendChild (item_td);
	else
    	    placeholder.appendChild (item);
    }

    function get_class_prefixes (class_prefix, branch, level)
    {
        branch = branch.toString ();
        level = level.toString ();

        var class_prefixes;
        class_prefixes = class_prefix;
        class_prefixes += " " + class_prefix + level;

        var c = "";
        var b = branch;
        while (b.length)
        {
            c = class_prefix + b + " " + c;
            b = b.substring (0, b.lastIndexOf ("_"));
        }

        class_prefixes += " " + c;
        class_prefixes += " " + class_prefix + level + branch;

        return class_prefixes;
    }
