/*

Example HTML
------------
  <div id="nav">
    <ul>
       <li><a href="one.html">one</a></li>
       <li><a href="two.html">two</a></li>
       <ul>
          <li><a href="twoone.html">two.one</a></li>
          <li><a href="twotwo.html">two.two</a></li>
       <ul>
       <li><a href="three.html">three</a></li>

Javascript DataStructure
------------------------
above will be translated to 

 topNav (<ul> element)
 topNav.items = ...( collection of <li> elements)
    item.href = "one.html"
    item.href = "two.html"
    item.subnav = ... (<ul> element)
       nav.items = ... (collection of <li> elements)
         item.href = "twoone.html"
         item.href = "twotwo.html"


Element properties and methods
------------------------------
each items has the following properties and methods:

  item.pos = the position of the item in it's navigation
  item.parentItem = the <li>-element that belongs to the upper navlevel
  item.parentNav = the <ul>-element that contains this <li>-item
  
nav (<ul>) items have the properties and methods:
  nav.parentItem = the <li>-element associated with this subnav
  nav.active = the currently active item.


Methods
-------


showNav(), hideNav(): 
    displays or hides the navigation

navSync():
    activates the level that matches the current url
    
findItemByHref(nav, href):
    returns the item that has an url pointing to href

*/


var ITEM_TAG = "P";
var LEVEL_TAG = "UL";

var divNav;
var topNav;

function initNav() {
    if (typeof divNav != "undefined") 
        return;

    divNav = findId('nav');
    topNav = initNavItems(divNav);
    
    //hideNav();
    traverseNav(topNav, initItem);
    navSync();
    //dbgNav(topNav);
    
    evtListen(divNav, "mouseout", evtItemOut, false);
    evtListen(divNav, "mouseover", evtItemOver, false);
}

function initNavItems(nav, lvl) { 
    var children, items, item, i, previousItem;
    children = nav.childNodes;
    if (!lvl)
      lvl = 0;

    items = Array();
    previousItem = false;
    for (i=0; i < children.length; ++i) {
        item = children[i];
	item.lvl = lvl;
        if (item.nodeName == ITEM_TAG) {
            item.pos = i;
            items[items.length] = item;
            previousItem = item;
        }
        else
        if (item.nodeName == LEVEL_TAG) {
            item.items = initNavItems(item, lvl+1);
            if (previousItem) {
                previousItem.subnav = item;
                item.parentItem = previousItem;
        item.active = "none";
            } else {
                // top navigation
                return item;
            }
        }
    }
    return items;
}

function navSync() {
    // TODO: navSync only works, if all the links in the original
    // html code are relative and in the same directory
    // now we can just chop off the directory part and compare with a.href
    var item = findItemByHref(topNav, window.location.href);
    if (item) 
        activateItem(item);
}

var showTimer;
function showNav() { 
    if (typeof divNav == "undefined")
        initNav();
    if (showTimer) 
        clearTimeout(showTimer);
    if (divNav.open)
        return;
    showTimer = setTimeout('doShow()', 100);
}

function doShow() {
    divNav.style.display = "block"; 
    divNav.open = true;
    navExpand();
}

function hideNav() {
    if (showTimer) 
        clearTimeout(showTimer);
    if (divNav && !divNav.open)
        return;
    showTimer = setTimeout('doHide()', 100);
}

function doHide() {
    divNav.style.display = "none"; 
    divNav.open = false;
    navCollapse();
}

function navExpand() {
    slideTo(findId('ind_2'), 139, 500, 2);
    slideTo(findId('ind_3'), 274, 500, 2);
}

function navCollapse() {
    slideTo(findId('ind_2'), 18, 500, 2);
    slideTo(findId('ind_3'), 36, 500, 2);
}

function dbgNav(nav, indent) {
    traverseNav(nav, printItem);
}

function initItem(item) {
    // find the anchor (a href) for this item and delete it
    // so that we do not have to deal with event bubbling.
    item.anchor = itemAnchor(item);
    item.href = itemHref(item);
    item.anchor.href = "javascript:;";

    // helper references
    item.parentNav = item.parentNode; 
    item.parentItem = item.parentNav.parentItem;


    item.evtItemClick = evtItemClick    
    // init events
    evtListen(item, "click", item.evtItemClick, true);
    evtListen(item, "mouseover", evtItemOver, false);
    evtListen(item, "mouseout", evtItemOut, false);
    
    evtListen(item.anchor, "mouseout", evtItemOut, false);
}

function evtItemClick(evt) {
     var item;
    //evt = new DOM2Event(evt, window.event, this);

    // stop event propagation
    evtStop(evt);
    item = evtTarget(evt);

    // execute link if there is no subnav    
    if (!item.subnav) {
        window.location.href = item.href;
        return;
    }
    // activateItem
    activateItem(item);
    
    // prevent the event to reach the default a href handler
    evtStop(evt);
}

function activateItem(item) {
    // deactivate currently active item of this level
    if (old = item.parentNav.active) 
        deactivateItem(old);

    activateIndicator(item);
      
    // change the css-class of the items anchor to "active"
    item.anchor.className = "active";
    
    // display the subnav, if there is one
    if (item.subnav) 
        item.subnav.style.display = "block";
        
    // recursively activate parent
    if (item.parentItem) {
        activateItem(item.parentItem);
    }
    // remeber active item in current nav level
    item.parentNav.active = item;
}

function deactivateItem(item) {
    item.anchor.className = "";
    deactivateIndicator(item);
    if (item.subnav) {
        item.subnav.style.display = "none";
        if (item.subnav.active)
            deactivateItem(item.subnav.active);
    }
}

function activateIndicator(item) {
    var lvl = item.lvl;
    var ind = findId('ind_'+lvl);
    if (ind) 
      ind.className = "active";

    if (item.subnav)
      activateIndicator(item.subnav.items[0]);
}

function deactivateIndicator(item) {
    var lvl = item.lvl;
    var ind = findId('ind_'+lvl);
    if (ind) 
      ind.className = "";
    if (item.subnav)
      deactivateIndicator(item.subnav.items[0]);      
}

function evtItemOver(evt) {
    showNav();
}
function evtItemOut(evt) {
    if (hideNav)
      hideNav();
}

function slideTo(div, toX, time, zip) {
    return new Accelimation( div.style, "left", toX, time, zip).start();
}

function findItemByHref(nav, url) {
    var i, file;
    file = url.substring(url.lastIndexOf('/')+1);
    for (i=0; i < nav.items.length; ++i) {
        if (nav.items[i].href == file || nav.items[i].href == url)
            return nav.items[i];
        if (nav.items[i].subnav) {
            var recurse = findItemByHref(nav.items[i].subnav, url);
            if (recurse)
                return recurse;
        }
    }
    return false;
}

function printItem(item) {
    active = item.parentNav.active == item ? " *ACTIVE*": "";
    dbg("ITEM: "+item.href + active);
}

function traverseNav(nav, func) {
    var i;
    for (i=0; i < nav.items.length; ++i) {
        func(nav.items[i])
        if (nav.items[i].subnav)
            traverseNav(nav.items[i].subnav, func);
    }
}

function getNavItem(nav) {
    var item, i;
    item = nav;
    for (i=1; i<arguments.length; i++) {
        item = item.getItem(arguments[i]);
    }
    return item;
}

function itemAnchor(item) {
    return findTag(item, 'a')[0];
}

function itemHref(item) {
    return itemAnchor(item).getAttribute("href");
}

/*
 * utility functions 
 */
 
function dbg(args) {
    var i, div, msg;
    div = findId("log");
    msg = "";
    for (i=0; i<arguments.length; ++i) 
        msg += msg ? ", " + arguments[i] : arguments[i];
    div.innerHTML += msg + "<br/>";
}

function dbgObj(obj, showNull) {
    dbg("Object: "+obj);
    dbg("--------------------");
    for (k in obj) 
        if (obj[k] || showNull)
            dbg(k + ": "+obj[k]);
}

function evtListen(obj, evt, func, phase) {
    if (obj.addEventListener) {
        obj.addEventListener(evt, func, phase)
    }
    else
    if (obj.attachEvent) {
        obj.attachEvent("on"+evt, func);
    }
    else
    throw new Error("can't attach event to "+obj);
}

function evtStop(evt) {
    //window.event.cancelBubble = true;
    if (evt.stopPropagation) 
        evt.stopPropagation();
    if (evt.preventDefault)
        evt.preventDefault();
    evt.returnValue = false;
    evt.cancelBubble = true;
}


function evtTarget(evt) {
    // find the target navitem for this event
    // mozilla points evt.target to the anchor
    // safari points it to the text in the anchor
    var item = evt.srcElement ? evt.srcElement : evt.target;
    if (item.nodeType == 3)
       item = item.parentNode;
    if (item.nodeName == 'A') 
       item = item.parentNode;
    return item;
}

function evtPreventDefault(evt) {
    evt = (evt) ? evt : ((event) ? event : null);
    if (evt) {
        evt.returnValue = false;
        if (evt.preventDefault) {
                evt.preventDefault();
        }
    }
    return false;
}



function findId(n, d) {
    var p,i,x;  
    if(!d) 
        d = document; 
    // fuck the quirks!
    return d.getElementById(n);
    
    // ie
    if (!(x = d[n]) && d.all) 
        x = d.all[n]; 
    // netscape4 in forms
    for (i = 0; !x && i < d.forms.length; i++) 
        x = d.forms[i][n];
    // netscape4 in layers
    for(i = 0; !x && d.layers && i < d.layers.length; i++) 
        x = find(n, d.layers[i].document);
    // dom
    if (!x && d.getElementById)
        x = d.getElementById(n); 
    return x;
}

function findTag(elem, tagname) {
    return elem.getElementsByTagName(tagname);
}


function getStyle(elem, styleProp, jsStyleProp) {
    if (window.getComputedStyle) 
        return window.getComputedStyle(elem, null)[styleProp];
    else
    if (elem.currentStyle)
        return elem.currentStyle[(jsStyleProp ? jsStyleProp : styleProp)];
    else
        return elem.style[(jsStyleProp ? jsStyleProp : styleProp)];
}

function toggleDiv(id) {
    var div = document.getElementById(id);
    if (div) {
	div.style.display = (div.style.display == "none") ? "block" : "none";    
    }
}

function findPosX(obj) {
    var curleft = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curleft += obj.offsetLeft
            obj = obj.offsetParent;
        }
    }
    else if (obj.x)
        curleft += obj.x;
    return curleft;
}

function findPosY(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curtop += obj.offsetTop;
            obj = obj.offsetParent;
        }
    }
    else if (obj.y)
        curtop += obj.y;
    return curtop;
}

var siteName = "atelier w";
function autoStats() {
	var url = document.location;
	var doc = url.pathname.split('/').pop().split('.')[0];
	
	var section = siteName;
	var title = document.title;
	
	if (title.indexOf(' - ')) {
		var elems = title.split(' - ', 2);
		section = elems[0];
		title = elems[1];
	}
	siteStats(section, "html", "")
}

function siteStats(pageitem , section, user) {
  statsite = "stats/img.php?";
  
  opt = "i=" + escape(pageitem ) + "&s=" + escape(section) + "&u=" + escape(user);
  // strip last slash
  r = document.referrer;
  r = (r.lastIndexOf("/") == r.length - 1) ? r.substring(r.lastIndexOf("/"), 0) : r;
  if (r.length > 0)
    opt += "&r=" + escape(r);

  // compose nedstat url and load it
  staturl = statsite + opt;
  alert(staturl);
  
  if (document.images) {
    var statimg = new Image();
    statimg.src = staturl;
  } else {
    document.write('<img src="'+staturl+'" border="0" width="1" height="1" style="display: none"/>');
  }
}

var _onload = Array();
function doOnLoad(f) {
    // add window.onload-function and reroute existing callbacks
    
    // called without a function: execute onload!
    if (typeof f != "function") {
        var i
        for (i=0; i<_onload.length; ++i) 
            _onload[i]();
    return;
    }

    // first function added ? install this callback in window.onload
    if (window.onload && window.onload != doOnLoad) {
        _onload[_onload.length] = f;
    }
    _onload[_onload.length] = f;
    window.onload = doOnLoad;
}


window.onerror = dbg;

doOnLoad(initNav);

var isIE = document.all ? true : false;
var isDOM = document.addEventListener ? true : false;

