/* $Id: menue.js - 05.05.2007 */

var quitCounter;
var arrayMainLinks = new Array
(
	'mainlink_index',
	'mainlink_profile',
	'mainlink_users',
	'mainlink_musicbase',
	'mainlink_djcharts',
	'mainlink_logout'
);
var arrayMenueLinks = new Array
(
 	'menuelink_user_add',
	'menuelink_artists',
	'menuelink_songs',
	'menuelink_records',
	'menuelink_labels',
	'menuelink_genres',
	'menuelink_mb_config',
	'menuelink_csv_import',
	'menuelink_mb_maintenance',
	'menuelink_artist_add',
	'menuelink_song_add',
	'menuelink_record_add',
	'menuelink_label_add',
	'menuelink_genre_add',
	'menuelink_dc_config',
	'menuelink_emails',
	'menuelink_news',
	'menuelink_djs',
	'menuelink_downloads',
	'menuelink_dc_maintenance',
	'menuelink_dc_email_write',
	'menuelink_djs_add',
	'menuelink_dc_downloads_add'
);
var arrayMenuesLevel1 = new Array
(
	'menue_users',
	'menue_musicbase',
	'menue_djcharts'
);
var arrayMenuesLevel2 = new Array
(
	'menue_artists',
	'menue_songs',
	'menue_records',
	'menue_labels',
	'menue_genres',
	'menue_emails',
	'menue_news',
	'menue_djs',
	'menue_downloads'
);


function extendNone()
{
	//hide all menues
	for (i = 0; i < arrayMenuesLevel1.length; i++)
		document.getElementById(arrayMenuesLevel1[i]).style.visibility = 'hidden';
	for (i = 0; i < arrayMenuesLevel2.length; i++)
		document.getElementById(arrayMenuesLevel2[i]).style.visibility = 'hidden';
	//remove hover style
	for (i = 0; i < arrayMainLinks.length; i++)
		document.getElementById(arrayMainLinks[i]).className = 'mainlink';
}

function extendNavi1(id)
{
	stopRetractNavi();
	this.id = id;
	this.menue = document.getElementById('menue_' + this.id);
	this.caller = document.getElementById('mainlink_' + this.id);
	//hide all menues
	for (i = 0; i < arrayMenuesLevel1.length; i++)
		document.getElementById(arrayMenuesLevel1[i]).style.visibility = 'hidden';
	//remove hover style
	for (i = 0; i < arrayMainLinks.length; i++)
		document.getElementById(arrayMainLinks[i]).className = 'mainlink';
	for (i = 0; i < arrayMenueLinks.length; i++)
		document.getElementById(arrayMenueLinks[i]).className = 'menuelink';
	//make right menue visible
	var callerPos = RicoUtil.toDocumentPosition(this.caller);
	this.caller.className = "mainlink_hover";
	this.menue.style.visibility = 'visible';
	this.menue.style.left = callerPos.x + 'px';
	this.menue.style.top = callerPos.y + this.caller.offsetHeight - 1 + 'px';
}

function extendNavi2(parent,id)
{
	stopRetractNavi();
	this.parentId = parent;
	this.id = id;
	this.parentMenue = document.getElementById('menue_' + this.parentId);
	this.menue = document.getElementById('menue_' + this.id);
	this.parentCaller = document.getElementById('mainlink_' + this.parentId);
	this.caller = document.getElementById('menuelink_' + this.id);
	//hide all menues
	for (i = 0; i < arrayMenuesLevel2.length; i++)
		document.getElementById(arrayMenuesLevel2[i]).style.visibility = 'hidden';
	//remove hover style
	for (i = 0; i < arrayMainLinks.length; i++)
		document.getElementById(arrayMainLinks[i]).className = 'mainlink';
	//make right menue and submenue visible
	var callerPos = RicoUtil.toDocumentPosition(this.caller);
	this.parentCaller.className = "mainlink_hover";
	this.caller.className = "menuelink_hover";
	this.parentMenue.style.visibility = 'visible';
	this.menue.style.visibility = 'visible';
	this.menue.style.left = callerPos.x + this.caller.offsetWidth + 'px';
	this.menue.style.top = callerPos.y  + 'px';
}

function retractNavi1(id)
{
	this.id = id;
	this.menue = document.getElementById('menue_' + this.id);
	this.caller = document.getElementById('mainlink_' + this.id);
	//hide menue
	this.caller.className = "mainlink";
	this.menue.style.visibility = 'hidden';
}

function retractNavi2(parent,id)
{
	this.parentId = parent;
	this.id = id;
	this.parentMenue = document.getElementById('menue_' + this.parentId);
	this.menue = document.getElementById('menue_' + this.id);
	this.parentCaller = document.getElementById('mainlink_' + this.parentId);
	this.caller = document.getElementById('menuelink_' + this.id);
	//hide menue and submenue
	this.parentCaller.className = "mainlink";
	this.caller.className = "menuelink";
	this.parentMenue.style.visibility = 'hidden';
	this.menue.style.visibility = 'hidden';	
}

function stopRetractNavi()
{
	if (quitCounter)
		clearTimeout(quitCounter);
}

function startRetractNavi1(id)
{
	quitCounter = setTimeout('retractNavi1(\'' + id + '\')',500);
}

function startRetractNavi2(parent,id)
{
	quitCounter = setTimeout('retractNavi2(\'' + parent + '\',\'' + id + '\')',500);
}

//-------------------- ricoUtil.js

var RicoUtil = {

   getElementsComputedStyle: function ( htmlElement, cssProperty, mozillaEquivalentCSS) {
      if ( arguments.length == 2 )
         mozillaEquivalentCSS = cssProperty;

      var el = $(htmlElement);
      if ( el.currentStyle )
         return el.currentStyle[cssProperty];
      else
         return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozillaEquivalentCSS);
   },

   createXmlDocument : function() {
      if (document.implementation && document.implementation.createDocument) {
         var doc = document.implementation.createDocument("", "", null);

         if (doc.readyState == null) {
            doc.readyState = 1;
            doc.addEventListener("load", function () {
               doc.readyState = 4;
               if (typeof doc.onreadystatechange == "function")
                  doc.onreadystatechange();
            }, false);
         }

         return doc;
      }

      if (window.ActiveXObject)
          return Try.these(
            function() { return new ActiveXObject('MSXML2.DomDocument')   },
            function() { return new ActiveXObject('Microsoft.DomDocument')},
            function() { return new ActiveXObject('MSXML.DomDocument')    },
            function() { return new ActiveXObject('MSXML3.DomDocument')   }
          ) || false;

      return null;
   },

   getContentAsString: function( parentNode ) {
      return parentNode.xml != undefined ? 
         this._getContentAsStringIE(parentNode) :
         this._getContentAsStringMozilla(parentNode);
   },

   _getContentAsStringIE: function(parentNode) {
      var contentStr = "";
      for ( var i = 0 ; i < parentNode.childNodes.length ; i++ )
         contentStr += parentNode.childNodes[i].xml;
      return contentStr;
   },

   _getContentAsStringMozilla: function(parentNode) {
      var xmlSerializer = new XMLSerializer();
      var contentStr = "";
      for ( var i = 0 ; i < parentNode.childNodes.length ; i++ )
         contentStr += xmlSerializer.serializeToString(parentNode.childNodes[i]);
      return contentStr;
   },

   toViewportPosition: function(element) {
      return this._toAbsolute(element,true);
   },

   toDocumentPosition: function(element) {
      return this._toAbsolute(element,false);
   },

   /**
    *  Compute the elements position in terms of the window viewport
    *  so that it can be compared to the position of the mouse (dnd)
    *  This is additions of all the offsetTop,offsetLeft values up the
    *  offsetParent hierarchy, ...taking into account any scrollTop,
    *  scrollLeft values along the way...
    *
    * IE has a bug reporting a correct offsetLeft of elements within a
    * a relatively positioned parent!!!
    **/
   _toAbsolute: function(element,accountForDocScroll) {

      if ( navigator.userAgent.toLowerCase().indexOf("msie") == -1 )
         return this._toAbsoluteMozilla(element,accountForDocScroll);

      var x = 0;
      var y = 0;
      var parent = element;
      while ( parent ) {

         var borderXOffset = 0;
         var borderYOffset = 0;
         if ( parent != element ) {
            var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth" ));
            var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth" ));
            borderXOffset = isNaN(borderXOffset) ? 0 : borderXOffset;
            borderYOffset = isNaN(borderYOffset) ? 0 : borderYOffset;
         }

         x += parent.offsetLeft - parent.scrollLeft + borderXOffset;
         y += parent.offsetTop - parent.scrollTop + borderYOffset;
         parent = parent.offsetParent;
      }

      if ( accountForDocScroll ) {
         x -= this.docScrollLeft();
         y -= this.docScrollTop();
      }

      return { x:x, y:y };
   },

   /**
    *  Mozilla did not report all of the parents up the hierarchy via the
    *  offsetParent property that IE did.  So for the calculation of the
    *  offsets we use the offsetParent property, but for the calculation of
    *  the scrollTop/scrollLeft adjustments we navigate up via the parentNode
    *  property instead so as to get the scroll offsets...
    *
    **/
   _toAbsoluteMozilla: function(element,accountForDocScroll) {
      var x = 0;
      var y = 0;
      var parent = element;
      while ( parent ) {
         x += parent.offsetLeft;
         y += parent.offsetTop;
         parent = parent.offsetParent;
      }

      parent = element;
      while ( parent &&
              parent != document.body &&
              parent != document.documentElement ) {
         if ( parent.scrollLeft  )
            x -= parent.scrollLeft;
         if ( parent.scrollTop )
            y -= parent.scrollTop;
         parent = parent.parentNode;
      }

      if ( accountForDocScroll ) {
         x -= this.docScrollLeft();
         y -= this.docScrollTop();
      }

      return { x:x, y:y };
   },

   docScrollLeft: function() {
      if ( window.pageXOffset )
         return window.pageXOffset;
      else if ( document.documentElement && document.documentElement.scrollLeft )
         return document.documentElement.scrollLeft;
      else if ( document.body )
         return document.body.scrollLeft;
      else
         return 0;
   },

   docScrollTop: function() {
      if ( window.pageYOffset )
         return window.pageYOffset;
      else if ( document.documentElement && document.documentElement.scrollTop )
         return document.documentElement.scrollTop;
      else if ( document.body )
         return document.body.scrollTop;
      else
         return 0;
   }

};
