//-------------------- 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;
   }

};

function show_time_bar(server_time,difference,lang)
{
	switch (lang)
	{
		case "de" : var weekDay = new Array("Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam");
					var weekName = "Woche";
					var serverTimeName = "Serverzeit";
					break;
		case "en" : var weekDay = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
					var weekName = "Week";
					var serverTimeName = "Servertime";
					break;
		default   : var weekDay = new Array("Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam");
					var weekName = "Woche";
					var serverTimeName = "Serverzeit";
					break;
	}
	clientTime = new Date();
	serverTime = new Date();
	serverTime.setTime(server_time);
	if (server_time!=0)
	{
		var difference = serverTime.getTime()-clientTime.getTime();
	}
	clientTime.setTime(clientTime.getTime()+difference);
	day = weekDay[clientTime.getDay()];
	date = clientTime.getDate();
	month = clientTime.getMonth() + 1;
	year = clientTime.getFullYear()
	hours = clientTime.getHours();
	minutes = clientTime.getMinutes();
	seconds = clientTime.getSeconds();
	weeks = (clientTime.getTime()-Date.UTC(2007,0,0,0,0,0))/(1000*60*60*24*7);
	weeks = Math.ceil(weeks);
	//if (clientTime.getDay()==1 && Math.round(weeks)>Math.floor(weeks)) { weeks = Math.round(weeks); }
	//else { weeks = Math.floor(weeks); }
	if (date < 10) { date = "0" + date; }
	if (month < 10) { month = "0" + month; }
	if (hours < 10) { hours = "0" + hours; }
	if (minutes < 10) { minutes = "0" + minutes; }
	if (seconds < 10) { seconds = "0" + seconds; }
	if (weeks < 10) { weeks = "0" + weeks ; }
	timeString = serverTimeName + ":<br />\n";
	timeString = timeString + day + ", " + date + "." + month + "." + year + " " + hours + ":" + minutes + ":" + seconds;
	timeString = timeString + "<br />\n" + weekName + " <strong>" + weeks + "</strong>\n";
	document.getElementById('time_bar').innerHTML=timeString;
	window.setTimeout("show_time_bar(0," + difference + ",'" + lang + "');", 1000);
}
function MM_jumpMenu(targ,selObj,restore)
{
	eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
	if (restore) selObj.selectedIndex=0;
}
function change_row(style,count,row)
{
	if (style==1) { bg1='#BDE1FF'; bg2='#E2F5FF'; }
	if (style==2) { bg1='#9ECDFB'; bg2='#CEE7FF'; }
	var col=1;
	for (var i=1; i<=count; i++)
	{
		if (col==1) { col=2; bg=bg1;}
		else { col=1; bg=bg2; }
		element=document.getElementById('r' + i + '_' + row);
		element.style.backgroundColor=bg;
	}
	
}
function change_form_row(style,count,row)
{
	for (var i=1; i<=count; i++)
	{
		if (style==1) { bg='#FFFFE1'; }
		if (style==2)
		{
			if (row%2!=0) { bg='#FFFFFF'; }
			else { bg='#EEEEEE'; } 
		}
	
		element=document.getElementById('r' + i + '_' + row);
		element.style.backgroundColor=bg;
	}
	
}
function jump_to_right_row()
{
	if (document.forms['voting'])
	{
		element = document.forms['voting'].elements['jump_element'].value;
		document.forms['voting'].elements[element].focus();
	}
}
function check_all(form_name)
{
  this_form = document.getElementById(form_name);
  for (var i=0; i<this_form.elements.length; i++)
  {
	if(this_form.elements[i].type == 'checkbox')
	{
      this_form.elements[i].checked = !(this_form.elements[i].checked);
    }
  }
}

function changeMarks(inputName)
{
	var elements = document.getElementsByName(inputName + '[]');
 	for (var i = 0; i < elements.length; i++)
    	elements[i].checked = !(elements[i].checked);
}

var wndArr = new Array();
function openWin(url,width,height)
{
	var par = 'toolbar=no,location=no,directories=no,status=no,copyhistory=no,scrollbars=yes,resizable=no,width=' + ((width)?width:630) + ',height=' + ((height)?height:500) + ',screenX=10,screenY=10';
	wndArr[wndArr.length] = window.open( url, 'wnd' + wndArr.length, par );
	if ( wndArr[wndArr.length-1].opener == null)
	{
		wndArr[wndArr.length-1].opener = window;
	}
	wndArr[wndArr.length-1].focus();
}

function MM_setValOfLine(form,x,id,artist,title,label)
{
	opener.document.forms[form].elements['song_id_' + x].value = id;
	opener.document.forms[form].elements['artist_name_' + x].value = unescape(artist);
	opener.document.forms[form].elements['song_title_' + x].value = unescape(title);
	opener.document.forms[form].elements['label_name_' + x].value = unescape(label);
}
function remove_ID(form,x)
{
	document.eval(form).eval("song_id_" + x).value = '';
}
function refresh_me(URL)
{
   if(opener && opener.closed!=1)
   {
      opener.location.href=URL;
	  return;
   }
}
function redirOpener(url)
{
	opener.location.href=url;
}
function change_visibility(id)
{
	element=document.getElementById('change_vis_charts_' + id);
	if (element.style.display=='none') 
 	{
		element.style.display='';
		document['change_img_' + id].src = "templates/images/collapse.gif";
	}	
 	else
	{	
		element.style.display='none';
		document['change_img_' + id].src = "templates/images/expand.gif"; 
	}
}

function getElementsByClass(searchClass,node,tag)
{
  var classElements = new Array();
  if (node == null)
    node = document;
  if (tag == null)
    tag = '*';
  var els = node.getElementsByTagName(tag);
  var elsLen = els.length;
  var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
  for (i = 0, j = 0; i < elsLen; i++) {
    if (pattern.test(els[i].className) ) {
      classElements[j] = els[i];
      j++;
    }
  }
  return classElements;
}

function popDownloads(id)
{
	element = document.getElementById('pop_box_' + id);
	linkElement = document.getElementById('pop_link_' + id);
	callerPos = RicoUtil.toDocumentPosition(linkElement);
	elements = getElementsByClass('pop_box');
	for (i = 0; i < elements.length; i++)
		elements[i].style.display = 'none';
	element.style.left = callerPos.x + 'px';
	element.style.top = callerPos.y  + 'px';
	element.style.display = 'block';
}

function closeDownloads(id)
{
	element = document.getElementById('pop_box_' + id);
	element.style.display = 'none';
}
