/*
Author: mg12
Update: 2008/12/29
Author URI: http://www.neoease.com/
*/
(function() {

var Class = {
    create: function() {
        return function() {
            this.initialize.apply(this, arguments);
        }
    }
}

var GhostlyMenu = Class.create();
GhostlyMenu.prototype = {

    initialize: function(target, align, opacity, offset) {
        this.obj = cleanWhitespace(target);
        this.align = align || 'left';
        this.opacity = 0;
        this.maxopacity = opacity || 1;
        this.offset = offset || 0;

        this.menu = this.obj.childNodes
        if (this.menu.length < 2) { return; }

        this.title = this.menu[0];
        this.body = this.menu[1];

        cleanWhitespace(this.body).firstChild.className = 'first';

        if (/MSIE/i.test(navigator.userAgent)) {
            var readers = getElementsByClassName('reader', 'a', this.body);
            for (var i = 0; i < readers.length; i++) {
                setStyle(readers[i], 'cursor', 'hand');
            }
        }

        setStyle(this.body, 'visibility', 'hidden');
        setStyle(this.body, 'position', 'absolute');
        setStyle(this.body, 'overflow', 'hidden');
        setStyle(this.body, 'display', 'block');

        addListener(this.obj, 'mouseover', bind(this, this.activate), false);
        addListener(this.obj, 'mouseout', bind(this, this.deactivate), false);
    },

    activate: function() {
        var pos = cumulativeOffset(this.title);
        var left = pos[0];
        if (this.align == 'right') {
            var offset = getWidth(this.title) - getWidth(this.body) + this.offset;
            left += offset;
        }
        var top = pos[1] + getHeight(this.title);

        setStyle(this.body, 'left', left + 'px');
        setStyle(this.body, 'top', top + 'px');
        setStyle(this.body, 'visibility', 'visible');
        setStyle(this.body, 'opacity', this.opacity);
        setStyle(this.body, 'MozOpacity', this.opacity);
        setStyle(this.body, 'KhtmlOpacity', this.opacity);
        setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');

        if(this.tid) {
            clearTimeout(this.tid);
        }
        this.tid = setInterval(bind(this, this.appear), 30);
    },

    deactivate: function(){
        if(this.tid) {
            clearTimeout(this.tid);
        }
        this.tid = setInterval(bind(this, this.fade), 30);
    },

    appear: function() {
        this.opacity += 0.1;
        if(this.opacity >= this.maxopacity) {
            this.opacity = this.maxopacity;
            clearTimeout(this.tid);
        }
        setStyle(this.body, 'opacity', this.opacity);
        setStyle(this.body, 'MozOpacity', this.opacity);
        setStyle(this.body, 'KhtmlOpacity', this.opacity);
        setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');
    },

    fade:function() {
        this.opacity -= 0.1;
        if(this.opacity <= 0) {
            this.opacity = 0;
            setStyle(this.body, 'visibility', 'hidden');
            clearTimeout(this.tid);
        }
        setStyle(this.body, 'opacity', this.opacity);
        setStyle(this.body, 'MozOpacity', this.opacity);
        setStyle(this.body, 'KhtmlOpacity', this.opacity);
        setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');
    }
}

$ = function(id) {
    return document.getElementById(id);
}

$A = function(iterable) {
    if(!iterable) {
        return [];
    }
    if(iterable.toArray) {
        return iterable.toArray();
    } else {
        var results = [];
        for(var i = 0; i < iterable.length; i++) {
            results.push(iterable[i]);
        }
        return results;
    }
}

getElementsByClassName = function(className, tag, parent) {
    parent = parent || document;

    var allTags = (tag == '*' && parent.all) ? parent.all : parent.getElementsByTagName(tag);
    var matchingElements = new Array();

    className = className.replace(/\-/g, '\\-');
    var regex = new RegExp('(^|\\s)' + className + '(\\s|$)');

    var element;
    for (var i = 0; i < allTags.length; i++) {
        element = allTags[i];
        if (regex.test(element.className)) {
            matchingElements.push(element);
        }
    }

    return matchingElements;
}

bind = function() {
    var array = this.$A(arguments);
    var func = array[array.length - 1];
    var _method = func, args = array, object = args.shift();
    return function() {
        return _method.apply(object, args.concat(array));
    }
}

getHeight = function(element) {
    return element.offsetHeight;
}

getWidth = function(element) {
    return element.offsetWidth;
}

setStyle = function(element, key, value) {
    element.style[key] = value;
}

getStyle = function(element, key) {
    return element.style[key];
}

cleanWhitespace = function(list) {
    var node = list.firstChild;
    while (node) {
        var nextNode = node.nextSibling;
        if(node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
            list.removeChild(node);
        }
        node = nextNode;
    }
    return list;
}

cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
        valueT += element.offsetTop  || 0;
        valueL += element.offsetLeft || 0;
        element = element.offsetParent;
    } while (element);
    return [valueL, valueT];
}

addListener = function(element, name, observer, useCapture) {
    if(element.addEventListener) {
        element.addEventListener(name, observer, useCapture);
    } else if(element.attachEvent) {
        element.attachEvent('on' + name, observer);
    }
}

function loadMenus() {
    var subscribe = $('subscribe');
    if (subscribe) {
        new GhostlyMenu(subscribe, 'left', 1, 1);
    }

    var menubar = $('menus');
    if (menubar) {
        var list = cleanWhitespace(menubar.childNodes);
        for (var i = 0; i < list.length; i++) {
            new GhostlyMenu(list[i], 'left', 1, 1);
        }
    }
}

if (document.addEventListener) {
    document.addEventListener("DOMContentLoaded", loadMenus, false);

} else if (/MSIE/i.test(navigator.userAgent)) {
    document.write('<script id="__ie_onload_for_inove" defer src="javascript:void(0)"></script>');
    var script = $('__ie_onload_for_inove');
    script.onreadystatechange = function() {
        if (this.readyState == 'complete') {
            loadMenus();
        }
    }

} else if (/WebKit/i.test(navigator.userAgent)) {
    var _timer = setInterval( function() {
        if (/loaded|complete/.test(document.readyState)) {
            clearInterval(_timer);
            loadMenus();
        }
    }, 10);

} else {
    window.onload = function(e) {
        loadMenus();
    }
}

window['MGJS_MENU'] = {};

})();
