﻿/*
[cai] (C)2001-2007 Comsenz Inc.
This is NOT a freeware, use is subject to license terms

$RCSfile: menuControl.js,v $
$Revision: 1.65.2.1 $
$Date: 2007/07/24 17:50:16 $
*/

var ctrlobjclassName;
var userAgent = navigator.userAgent.toLowerCase();
var is_opera = userAgent.indexOf('opera') != -1 && opera.version();
var is_moz = (navigator.product == 'Gecko') && userAgent.substr(userAgent.indexOf('firefox') + 8, 3);
var is_ie = (userAgent.indexOf('msie') != -1 && !is_opera) && userAgent.substr(userAgent.indexOf('msie') + 5, 3);
var jsmenu = new Array();
jsmenu['active'] = new Array();
jsmenu['timer'] = new Array();
jsmenu['iframe'] = new Array();

function doane(event) {
    e = event ? event : window.event;
    if (is_ie) {
        e.returnValue = false;
        e.cancelBubble = true;
    } else if (e) {
        e.stopPropagation();
        e.preventDefault();
    }
}
function isUndefined(variable) {
    return typeof variable == 'undefined' ? true : false;
}
function getPopuID(id) {
    return document.getElementById(id);
}

function initCtrl(ctrlobj, click, duration, timeout, layer) {
    if (ctrlobj && !ctrlobj.initialized) {
        ctrlobj.initialized = true;
        ctrlobj.unselectable = true;

        ctrlobj.outfunc = typeof ctrlobj.onmouseout == 'function' ? ctrlobj.onmouseout : null;
        ctrlobj.onmouseout = function() {
            if (this.outfunc) this.outfunc();
            if (duration < 3) jsmenu['timer'][ctrlobj.id] = setTimeout('hidePopu(' + layer + ')', timeout);
        }

        if (click && duration) {
            ctrlobj.clickfunc = typeof ctrlobj.onclick == 'function' ? ctrlobj.onclick : null;
            ctrlobj.onclick = function(e) {
                doane(e);
                if (jsmenu['active'][layer] == null || jsmenu['active'][layer].ctrlkey != this.id) {
                    if (this.clickfunc) this.clickfunc();
                    else showPopu(this.id, true);
                } else {
                    hidePopu(layer);
                }
            }
        }

        ctrlobj.overfunc = typeof ctrlobj.onmouseover == 'function' ? ctrlobj.onmouseover : null;
        ctrlobj.onmouseover = function(e) {
            doane(e);
            if (this.overfunc) this.overfunc();
            if (click) {
                clearTimeout(jsmenu['timer'][this.id]);
            } else {
                for (var id = 0; id < jsmenu['timer'].length; id++) {
                    if (jsmenu['timer'][id]) clearTimeout(jsmenu['timer'][id]);
                }
            }
        }
    }
}

function initMenu(ctrlid, menuobj, duration, timeout, layer) {
    if (menuobj && !menuobj.initialized) {
        menuobj.initialized = true;
        menuobj.ctrlkey = ctrlid;
        menuobj.onclick = ebygum;
        menuobj.style.position = 'absolute';
        if (duration < 3) {
            if (duration > 1) {
                menuobj.onmouseover = function() {
                    clearTimeout(jsmenu['timer'][ctrlid]);
                }
            }
            if (duration != 1) {
                menuobj.onmouseout = function() {
                    jsmenu['timer'][ctrlid] = setTimeout('hidePopu(' + layer + ')', timeout);
                }
            }
        }
        menuobj.style.zIndex = 50;
        if (is_ie) {
            menuobj.style.filter += "progid:DXImageTransform.Microsoft.shadow(direction=135,color=#CCCCCC,strength=2)";
        }
    }
}

function showPopu(ctrlid, myPosX, myPosY, click, offset, duration, timeout, layer, showid, maxh, containerid) {
    e = window.event ? window.event : showPopu.caller.arguments[0];
    var ctrlobj = getPopuID(ctrlid);
    if (!ctrlobj) return;
    if (isUndefined(click)) click = false;
    if (isUndefined(offset)) offset = 0;
    if (isUndefined(duration)) duration = 2;
    if (isUndefined(timeout)) timeout = 500;
    if (isUndefined(layer)) layer = 0;
    if (isUndefined(showid)) showid = ctrlid;
    var showobj = getPopuID(showid);
    var menuobj = getPopuID(showid + '_menu');
    if (!showobj || !menuobj) return;
    if (isUndefined(maxh)) maxh = 400;

    hidePopu(layer);

    for (var id = 0; id < jsmenu['timer'].length; id++) {
        if (jsmenu['timer'][id]) clearTimeout(jsmenu['timer'][id]);
    }

    initCtrl(ctrlobj, click, duration, timeout, layer);
    ctrlobjclassName = ctrlobj.className;
    ctrlobj.className += ' hover';
    initMenu(ctrlid, menuobj, duration, timeout, layer);

    menuobj.style.display = '';
    if (!is_opera) {
        menuobj.style.clip = 'rect(auto, auto, auto, auto)';
    }

    setPopuPosition(showid, offset, containerid, myPosX, myPosY);

    if (is_ie && is_ie < 7) {
        if (!jsmenu['iframe'][layer]) {
            var iframe = document.createElement('iframe');
            iframe.style.display = 'none';
            iframe.style.position = 'absolute';
            iframe.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';
            try {
                getPopuID('append_parent').appendChild(iframe);
            }
            catch (e) {
            }
            jsmenu['iframe'][layer] = iframe;
        }
        jsmenu['iframe'][layer].style.top = menuobj.style.top;
        jsmenu['iframe'][layer].style.left = menuobj.style.left;
        jsmenu['iframe'][layer].style.width = menuobj.w;
        jsmenu['iframe'][layer].style.height = menuobj.h;
        jsmenu['iframe'][layer].style.display = 'block';
    }

    if (maxh && menuobj.scrollHeight > maxh) {
        menuobj.style.height = maxh + 'px';
        if (is_opera) {
            menuobj.style.overflow = 'auto';
        } else {
            menuobj.style.overflowY = 'auto';
        }
    }

    if (!duration) {
        setTimeout('hidePopu(' + layer + ')', timeout);
    }

    jsmenu['active'][layer] = menuobj;
}

function setPopuPosition(showid, offset, containerid, myPosX, myPosY) {
    var showobj = getPopuID(showid);
    var menuobj = getPopuID(showid + '_menu');
    var container = getPopuID(containerid);
    if (isUndefined(offset)) offset = 0;
    if (showobj) {
        showobj.pos = fetchOffset(showobj);
        if (container) {
            showobj.X = showobj.pos['left'] - container.offsetLeft;
            showobj.Y = 0;
        }
        else {
            showobj.X = showobj.pos['left'];
            showobj.Y = showobj.pos['top'];
        }
        showobj.w = showobj.offsetWidth;
        showobj.h = showobj.offsetHeight;
        menuobj.w = menuobj.offsetWidth;
        menuobj.h = menuobj.offsetHeight;
        menuobj.style.left = (showobj.X + menuobj.w > document.body.clientWidth) && (showobj.X + showobj.w - menuobj.w >= 0) ? showobj.X + showobj.w - menuobj.w + myPosX + 'px' : showobj.X + myPosY + 'px';
        menuobj.style.top = offset == 1 ? showobj.Y + 'px' : (offset == 2 || ((showobj.Y + showobj.h + menuobj.h > document.documentElement.scrollTop + document.documentElement.clientHeight) && (showobj.Y - menuobj.h >= 0)) ? (showobj.Y - menuobj.h) - myPosX + 'px' : showobj.Y + showobj.h - myPosY + 'px');
        if (menuobj.style.clip && !is_opera) {
            menuobj.style.clip = 'rect(auto, auto, auto, auto)';
        }
    }
}

function hidePopu(layer) {
    if (isUndefined(layer)) layer = 0;
    if (jsmenu['active'][layer]) {
        try {
            getPopuID(jsmenu['active'][layer].ctrlkey).className = ctrlobjclassName;
        } catch (e) { }
        clearTimeout(jsmenu['timer'][jsmenu['active'][layer].ctrlkey]);
        jsmenu['active'][layer].style.display = 'none';
        if (is_ie && is_ie < 7 && jsmenu['iframe'][layer]) {
            jsmenu['iframe'][layer].style.display = 'none';
        }
        jsmenu['active'][layer] = null;
    }
}

function fetchOffset(obj) {
    var left_offset = obj.offsetLeft;
    var top_offset = obj.offsetTop;
    while ((obj = obj.offsetParent) != null) {
        left_offset += obj.offsetLeft;
        top_offset += obj.offsetTop;
    }
    return { 'left': left_offset, 'top': top_offset };
}

function ebygum(eventobj) {
    if (!eventobj || is_ie) {
        window.event.cancelBubble = true;
        return window.event;
    } else {
        if (eventobj.target.type == 'submit') {
            eventobj.target.form.submit();
        }
        eventobj.stopPropagation();
        return eventobj;
    }
}

function popuoption_onclick_function(e) {
    this.clickfunc();
    hidePopu();
}

function popuoption_onclick_link(e) {
    choose(e, this);
}

function popuoption_onmouseover(e) {
    this.className = 'popupmenu_highlight';
}

function popuoption_onmouseout(e) {
    this.className = 'popupmenu_option';
}

function choose(e, obj) {
    var links = obj.getElementsByTagName('a');
    if (links[0]) {
        if (is_ie) {
            links[0].click();
            window.event.cancelBubble = true;
        } else {
            if (e.shiftKey) {
                window.open(links[0].href);
                e.stopPropagation();
                e.preventDefault();
            } else {
                window.location = links[0].href;
                e.stopPropagation();
                e.preventDefault();
            }
        }
        hidePopu();
    }
}

function setBubble(showid, tipname) {
    var menuobj = getPopuID(showid + '_menu');
    menuobj.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)';
    menuobj.style.opacity = 0;

    _attachEvent(window, 'load', function() { initBubble(showid, tipname) });
    _attachEvent(window, 'resize', function() { initBubble(showid, tipname, true) });
}

function initBubble(showid, tipname, onresize) {
    var menuid = showid + "_menu";


    var showobj = getPopuID(showid);
    var menuobj = getPopuID(showid + '_menu');
    var offset = 0;
    if (showobj) {
        showobj.pos = fetchOffset(showobj);
        showobj.X = showobj.pos['left'];
        showobj.Y = showobj.pos['top'];
        showobj.w = showobj.offsetWidth;
        showobj.h = showobj.offsetHeight;
        if (menuobj.style.display == 'none') {
            menuobj.style.visibility = 'hidden';
            menuobj.style.display = '';
            menuobj.w = menuobj.offsetWidth;
            menuobj.h = menuobj.offsetHeight;
            menuobj.style.visibility = 'visible';
            menuobj.style.display = 'none';
        } else {
            menuobj.w = menuobj.offsetWidth;
            menuobj.h = menuobj.offsetHeight;
        }
        menuobj.style.left = (showobj.X + menuobj.w > document.body.clientWidth) && (showobj.X + showobj.w - menuobj.w >= 0) ? showobj.X + showobj.w - menuobj.w + 'px' : showobj.X + 'px';
        menuobj.style.top = offset == 1 ? showobj.Y + 'px' : (offset == 2 || ((showobj.Y + showobj.h + menuobj.h > document.documentElement.scrollTop + document.documentElement.clientHeight) && (showobj.Y - menuobj.h >= 0)) ? (showobj.Y - menuobj.h) + 'px' : showobj.Y + showobj.h + 'px');
        if (menuobj.style.clip && !is_opera) {
            menuobj.style.clip = 'rect(auto, auto, auto, auto)';
        }
    }
    getPopuID(menuid).style.top = parseInt(getPopuID(menuid).style.top) - menuobj.h - 18 + 'px';
    getPopuID(menuid).style.left = parseInt(getPopuID(menuid).style.left) + 5 + 'px';
    getPopuID(menuid).style.height = menuobj.h;

    menuobj.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=100)';
    menuobj.style.opacity = 1;

    if (typeof onresize != 'undefined' && onresize === true)
        return;
    if (getcookie('discuz_tips_' + tipname) == "1") {
        menuobj.style.display = 'none';
    } else {
        setTimeout('display_opacity(\'' + menuid + '\',100)', 8000);
        setcookie('discuz_tips_' + tipname, 1, 365 * 24 * 60 * 60);
    }

}

