/* ********************************** */
/* SimplestNet Inc. menu js utils     */
/* 07 fev 2006 by Eric Grossi         */
/* egrossi@simplestnet.com            */
/* ********************************** */

/* Example

in html: <div id="menulang"></div>

var menulang = {
// Menu item config
"frclass"   : "menuLnf"        // Define style for frame
"orient"	: "h",             // Menu orientation
"items"	:                      // Menu item list
[{ "text" : 'fr',              // Item text
// Next line define params for item with 'fr' text.
"class" : "menuLnis",          // Item class
"overstyle" : { "backgroundColor" : "#fffbf1" }, // Item over style
"frclass" : "menuLnsfr", "orient" : "v", // this part define submenu
"items" : [                    // Submenu item list
{
    "text"  : "en",
    "class" : "menuLnsi", "overstyle" : { "backgroundColor" : "#fffbf1" },
    "src"   : "index.php?action=language&name=en", // Menu link
    "target": "_blank"                             // Menu target
},
{
    "text"  : "fr",
    "class" : "menuLnsi", "overstyle" : { "backgroundColor" : "#fffbf1" },
    "src"   : "index.php?action=language&name=fr"
},
{
    "text"  : "js test",
    "class" : "menuLnsi", "overstyle" : { "backgroundColor" : "#fffbf1" },
    "js"   : "alert('javascript test');"
}]
}]};

var lngmenu = new SimplestNetMenu(menulang, 'menulang');

*/

/* SimplestNet menu object declaration
	param
		menu	menu definition object.
		idobj	id of div menu container.
*/
var SimplestNetMenu = function(menu, idobj) {
    var it=menu['items'], obj;

	if ( typeof(menu) != "object" || typeof(it) !="object" ||
		typeof(idobj) != "string" ) {
        alert("Invalid params to create menu");
        return 0;
    }

    if ( !(obj=document.getElementById(idobj)) || "DIV"!=obj.tagName ) {
        alert("Container div tag not found");
        return 0;
    }

    if ( obj.menu ) return 1;

    this.idobj = idobj;
    this.counter = 0;
    obj.innerHTML = this._write_items(menu, false);
    obj.menu = this;
    return 1;
}

/* write menu items */
SimplestNetMenu.prototype._write_items = function(menu, swap) {
    var orient = menu['orient'] ? menu['orient'] : "h";
    var s = "<table cellpadding='0' cellspacing='0' border='0'><tr><td";

    if ( menu['frclass'] ) s+=" class='"+menu['frclass']+"'";

    s += "><table cellpadding='0' cellspacing='0' border='0'>";

    switch ( orient ) {
    case 'h':
        s += this._writeh_items(menu, menu['items']);
        break;

    default:
        s += this._writev_items(menu, menu['items']);
        break;
    }

    s += "</table></td></tr></table>";
    return s;
}

/* write horizontal items */
SimplestNetMenu.prototype._writeh_items = function(menu, items) {
    var s = "<tr>";

    for ( var i = 0; i < items.length; i++ ) {
        this.counter++;
        s += "<td><div style='cursor: pointer;' id='snmenu_"+this.idobj+"_"+this.counter+"'";
        s += SimplestNetMenu._overstring(items[i]['overstyle'], "h");

        if ( items[i]['class'] ) s+= " class='"+items[i]['class']+"'";

        if ( items[i]['src'] ) {
			s+=" onclick=\"window.open('"+items[i]['src']+"'";

			if ( items[i]['target'] )
				s+=", '"+items[i]['target']+"'";
			else
				s+=", '_self'";

			s+=")\"";
		}
        else if ( items[i]['js'] ) {
			s+=" onclick=\""+items[i]['js']+"\"";
		}

        s += ">"+items[i]['text'];

        if ( items[i]['items'] && items[i]['items'].length ) {
            s += "<div style='visibility: hidden; position: absolute;' id='snsmenu_"+this.idobj+"_"+this.counter+"'>";
            s += this._write_items(items[i], true);
            s += "</div>";
        }

        s += "</div></td>";
    }

    s += "</tr>";
    return s;
}

/* write vertical items */
SimplestNetMenu.prototype._writev_items = function(menu, items) {
    var s = "";

    for ( var i = 0; i < items.length; i++ ) {
        this.counter++;
        s += "<tr><td><div style='cursor: pointer;' id='snmenu_"+this.idobj+"_"+this.counter+"'";
        s += SimplestNetMenu._overstring(items[i]['overstyle'], "v");

        if ( items[i]['class'] ) s+= " class='"+items[i]['class']+"'";

        if ( items[i]['src'] ) {
			s+=" onclick=\"window.open('"+items[i]['src']+"'";

			if ( items[i]['target'] )
				s+=", '"+items[i]['target']+"'";
			else
				s+=", '_self'";

			s+=")\"";
		}
        else if ( items[i]['js'] ) {
			s+=" onclick=\""+items[i]['js']+"\"";
		}

        s += ">"+items[i]['text'];

        if ( items[i]['items'] && items[i]['items'].length ) {
            s += "<div style='visibility: hidden; position: absolute;' id='snsmenu_"+this.idobj+"_"+this.counter+"'>";
            s += this._write_items(items[i], true);
            s += "</div>";
        }

        s += "</div></td></tr>";
    }

    return s;
}

/* write over style */
SimplestNetMenu._overstring = function(ostyle, orient) {
    var s = "", ost, est;

    if ( ostyle ) {
        ost = "", est = "";

        for ( var k in ostyle ) {
            ost += ";this.style."+k+"='"+ostyle[k]+"'";
            est += ";this.style."+k+"=''";
        }

        if ( ost.length ) ost = ost.substring(1);
        if ( est.length ) est = est.substring(1);
    }

    s += " onmouseover=\"SimplestNetMenu._inMouse(event, this, '"+orient+"');"+ost+
        "\" onmouseout=\"SimplestNetMenu._outMouse(event, this);"+est+"\"";

    return s;
}

/* ************* Debug part **************** */
var wdebug = 0;

SimplestNetMenu._addEvent = function(el, evname, func) {
	if ( el.attachEvent ) { // IE
		el.attachEvent("on" + evname, func);
	} else if ( el.addEventListener ) { // Gecko / W3C
		el.addEventListener(evname, func, true);
	} else {
		el["on" + evname] = func;
	}
}

SimplestNetMenu._onmousemove = function(ev) {
    var m = SimplestNetMenu._getMousePos(ev);
    //wdebug.innerHTML = m.x+", "+m.y+"<br/>";
}

function mydebug() {
    var p = document.getElementsByTagName("body")[0];

    wdebug = document.createElement("div");
    wdebug.style.backgroundColor = "#000000";
    wdebug.style.color = "#ffffff";
    wdebug.style.position = "absolute";
    wdebug.style.top = "5px";
    wdebug.style.left = "250px";
    wdebug.style.width = "200px";
    wdebug.style.height = "150px";
    wdebug.style.zIndex = 1000;
    p.appendChild(wdebug);
    SimplestNetMenu._addEvent(document, "mousemove", SimplestNetMenu._onmousemove);
}
/* ************* End Debug part **************** */

SimplestNetMenu._inMouse = function(ev, obj, orient) {
    if ( !obj.id ) return;

    var id = "snsmenu"+obj.id.substring(6), el;

    if ( !(el = document.getElementById(id)) || "visible"==el.style.visibility ) return;

    var sub = SimplestNetMenu._getParentMenu(obj);

    if ( sub )
        var pos = {
            x: "v"==orient && (SimplestNetMenu.is_ie || SimplestNetMenu.is_opera) ?
                -obj.offsetLeft - obj.clientLeft : 0,
            y: "h"==orient && (SimplestNetMenu.is_ie || SimplestNetMenu.is_opera) ?
                -obj.offsetTop - obj.clientTop : 0 };
    else
        var pos = SimplestNetMenu._getAbsolutePos(obj);

    if ( "h"==orient ) {
        el.style.top = pos.y + obj.offsetHeight + (SimplestNetMenu.is_ie || SimplestNetMenu.is_opera ? obj.offsetTop + obj.clientTop : 0)+"px";
        el.style.left = pos.x + (SimplestNetMenu.is_ie || SimplestNetMenu.is_opera ? obj.offsetLeft : 0)+"px";
    } else {
        el.style.top = pos.y + (SimplestNetMenu.is_ie || SimplestNetMenu.is_opera ? obj.offsetTop : 0)+"px";
        el.style.left = pos.x + obj.offsetWidth + (SimplestNetMenu.is_ie || SimplestNetMenu.is_opera ? obj.offsetLeft + obj.clientLeft : 0)+"px";
    }

    el.style.visibility = "visible";
}

SimplestNetMenu._outMouse = function(ev, obj) {
    if ( !obj.id ) return;

    var id = "snsmenu"+obj.id.substring(6), el;

    if ( !(el = document.getElementById(id)) || "hidden"==el.style.visibility ) return;

    var r = SimplestNetMenu._getAbsolutePos(el);
    var m = SimplestNetMenu._getMousePos(ev);
    var of = (SimplestNetMenu.is_ie || SimplestNetMenu.is_opera ? 2 : 0);

    if ( m.x<r.x+of || m.x>r.x+el.offsetWidth-2 || m.y<r.y+of || m.y>r.y+el.offsetHeight-2 )
         el.style.visibility = "hidden";
}

/* stop event propagation */
SimplestNetMenu._stopEvent = function(ev) {
    if ( !ev && !(ev = window.event) ) return;

    if ( SimplestNetMenu.is_ie ) {
		ev.cancelBubble = true;
		ev.returnValue = false;
	} else {
		ev.preventDefault();
		ev.stopPropagation();
	}
};

SimplestNetMenu._getTargetElement = function(ev) {
	var f = null;

    if ( SimplestNetMenu.is_ie )
        f = ev.srcElement;
    else
        f = ev.target;

    return f;
}

SimplestNetMenu._getMousePos = function(ev) {
    var r = { x: ev.clientX, y: ev.clientY };

    /*if ( SimplestNetMenu.is_ie ) {
        r.x -= document.body.parentNode.clientLeft;
        r.y -= document.body.parentNode.clientTop;
    } */

    return r;
}

/* detect a special case of "web browser" */
SimplestNetMenu.is_ie = ( /msie/i.test(navigator.userAgent) &&
		   !/opera/i.test(navigator.userAgent) );

SimplestNetMenu.is_ie5 = ( SimplestNetMenu.is_ie && /msie 5\.0/i.test(navigator.userAgent) );

/* detect Opera browser */
SimplestNetMenu.is_opera = /opera/i.test(navigator.userAgent);

/* detect KHTML-based browsers */
SimplestNetMenu.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);

/* get absolute position of element */
SimplestNetMenu._getAbsolutePos = function(el) {
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(el.tagName);

	if ( is_div && el.scrollLeft )
		SL = el.scrollLeft;

	if ( is_div && el.scrollTop )
		ST = el.scrollTop;

	var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };

	if ( el.offsetParent ) {
		var tmp = this._getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;

        /*if ( SimplestNetMenu.is_ie ) {
            r.x += el.clientLeft;
            r.y += el.clientTop;
        } */
	}

	return r;
};

/* get the first parent menu */
SimplestNetMenu._getParentMenu = function(el) {
    var p = el, res = null;

    while ( p=p.parentNode ) {
        if ( "DIV"!=p.tagName || !p.id || "snsmenu"!=p.id.substring(0,7)) continue;

        return p;
    }
}

function _dump(obj) {
    var s="", cnt = 0;

    for ( var key in obj ) {
        s += "  "+key+", "+obj[key]+"**";

        if ( 0 == cnt % 5 ) s+= "\r\n";
        cnt++;
    }

    alert(s);
}

function GetParentDiv(obj)
{
	var p=obj;
	var res=false;
    var s="";
	
	if ( typeof(obj)!="object" ) return res;
	
	while ( p=p.parentNode )  {
        s+=p.tagName;
        if (p.id) s+="("+p.id+")";
        s+=", ";
		if ( "DIV"!=p.tagName ) continue;
		
		res=p;
		break;
	}

    //window.status=s;
	return res;
}

function GetChildDiv(obj, name)
{
	var d=obj.childNodes;
	var res=false;

	for (var i=0; i<d.length; i++) {
		if ( "DIV"!=d[i].tagName ) continue;
		var dname=d[i].getAttribute("sname");

		if ( typeof(name)=="string" && name!=dname ) continue;

		res = d[i];
		break;
	}

	return res;
}