﻿/**
 * Code mfDropDownMenu.js.
 * using eventUtil.js
 * Version 1.0
 * Copyright (C) 2008- myfootprints.cn@gmail.com.
 * http://www.myfootprints.cn/compress
 * 
 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General 
 * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) 
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 *
 */
 
//
// Create name spaces
//
var mfDDM = {
    Version: '1.0',
    DropDownMenus: {}
}; 

// make an alias
mfDropDownMenu = mfDDM;

//
// DropDownMenu Object
//
mfDDM.DropDownMenu = function () {
    this.menuNode = null;
    this.current = false;
}

mfDDM.setup = function (oMenuNode) { 
    var dropDownMenu = null;
    
    dropDownMenu = new mfDDM.DropDownMenus.DropDownMenu;
    dropDownMenu.menuNode = oMenuNode;
    
    // 如果不是UL结点，则寻找其子结点，直到找到UL结点为止
    
    if (dropDownMenu.menuNode.nodeName != 'UL') {
        dropDownMenu.menuNode = dropDownMenu.findChild(dropDownMenu.menuNode, 'UL');
    }
    
    if (typeof(dropDownMenu.menuNode) == 'undefined') {
        return false;
    }
    var oMenus = dropDownMenu.menuNode.childNodes;

    var fnShowMenu = function (v) {dropDownMenu.showMenu(v);};
    var fnHideMenu = function () {dropDownMenu.hideMenu();};
    
    for (var i = 0; i < oMenus.length; i++) {
        // set up event handlers
        EventUtil.addEventHandler(oMenus[i], 'mouseover', fnShowMenu, oMenus[i]);
        EventUtil.addEventHandler(oMenus[i], 'mouseout', fnHideMenu);
    
        // is there a submenu?
        var ul = dropDownMenu.findChild(oMenus[i], 'UL');
        if (ul) {
            ul.style.display = 'none';
            for (var j = 0; j < ul.childNodes.length; j++) {
                EventUtil.addEventHandler(ul.childNodes[j], 'mouseover', fnShowMenu, ul.childNodes[j]);
                EventUtil.addEventHandler(ul.childNodes[j], 'mouseout', fnHideMenu);
            }
        }
    }
};

//
// find the first child object of a particular type
//
mfDDM.DropDownMenu.prototype.findChild = function (obj, tag) {
    if (typeof(obj) != 'object') {
        return null;
    }
    if (obj.hasChildNodes()) {
        var cn = obj.childNodes;
        for (var k = 0; k < cn.length; k++) {
            if (cn[k].nodeName == tag) return cn[k];
        }
    } else {
        return null;
    }
};

//
// find all the children objects of a particular type
//
mfDDM.DropDownMenu.prototype.findChildren = function (obj, tag) {
    var children = new Array();
    var cn = obj.childNodes;
    
    for (var k = 0; k < cn.length; k++) {
        if (cn[k].nodeName == tag) {
            children.push(cn[k]);
        }
    }
    
    return children;
};

//
// is mouse over an object?
//
mfDDM.DropDownMenu.prototype.isMouseOver = function (obj, iX, iY) {
    var iX1 = obj.offsetLeft;
    var iX2 = iX1 + obj.offsetWidth;
    var iY1 = obj.offsetTop;
    var iY2 = iY1 + obj.offsetHeight;
    
    return (iX >= iX1 && iX <= iX2 && iY > iY1 && iY <= iY2);
};


mfDDM.DropDownMenu.prototype.showMenu = function (oMenu) {
    if (this.current) {
        // hide it
        this.hideMenu();
    }
    this.current = oMenu;
    var ul = this.findChild(oMenu, 'UL');
    if (!ul) {
        return; 
    } else {
        ul.style.display = 'block';
    }
};

mfDDM.DropDownMenu.prototype.hideMenu = function () {
    // find the sub menu, if any
    var ul = this.findChild(this.current, 'UL');
    if (!ul) {
        return;
    } else {
        ul.style.display = 'none';
    }
};

mfDDM.DropDownMenus.DropDownMenu = function () {
    
};

mfDDM.DropDownMenus.DropDownMenu.prototype = new mfDDM.DropDownMenu;