//-------------------- 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 MM_jumpMenu(targ,selObj,restore) {
	eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
	if (restore) selObj.selectedIndex=0;
}
function change_row(style,count,row) {
	for (var i = 1; i <= count; i++) {
		if (style == 1) bg = '#ffedca';
		else if (style==2) {
			if (row%2 != 0) bg = '#FFFFFF';
			else bg = '#EEEEEE'; 
		}
		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='#ffedca';
		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 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 markDownload(elem) {
	var parent = elem.parentNode;
	if (elem.name != 'downloaded') {
		elem.name = 'downloaded';
		parent.innerHTML += ' <img src="templates/images/checked.gif" alt="" />';
	}
}

// USED <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

var _BROWSER = new Object();
_BROWSER.IE = !!(window.attachEvent && !window.opera);
_BROWSER.Opera = !!window.opera;
_BROWSER.WebKit = navigator.userAgent.indexOf('AppleWebKit/') > -1;
_BROWSER.Gecko = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1;
_BROWSER.MobileSafari = !!navigator.userAgent.match(/Apple.*Mobile.*Safari/);

var _HTTP_LPT = null;
var _PLAYING_ID = null;
var _WINDOWS = new Array();


function changeMarks(_input) {
	var elements = document.getElementsByName(_input + '[]');
 	for (var i = 0; i < elements.length; i++)
    	elements[i].checked = !elements[i].checked;
}

function loadPreviousTips(_chartsId)
{
	try {
		var loader = document.getElementById('load_previous_tips_loader');
		loader.style.visibility = 'visible';
		if (window.XMLHttpRequest) _HTTP_LPT = new XMLHttpRequest();
		else if (window.ActiveXObject) _HTTP_LPT= new ActiveXObject('Microsoft.XMLHTTP');
		_HTTP_LPT.open('POST', _INTERFACE_URL, true);
		_HTTP_LPT.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		_HTTP_LPT.onreadystatechange = function() {
			if (_HTTP_LPT.readyState == 4) {
				var result = eval('(' + _HTTP_LPT.responseText + ')');
				if (result['message'] != null) alert(result['message']);
				if (result['tips'] != null) {
					for (var i = 0; i < result['tips'].length; i++) {
						var tip = result['tips'][i];
						var artistName = document.getElementById('artist_name_' + tip['position']);
						var songTitle = document.getElementById('song_title_' + tip['position']);
						var labelName = document.getElementById('label_name_' + tip['position']);
						if (artistName != null) artistName.value = tip['artist_name'];
						if (songTitle != null) songTitle.value = tip['song_title'];
						if (labelName != null) labelName.value = tip['label_name'];
					}
				}
				var loader = document.getElementById('load_previous_tips_loader');
				loader.style.visibility = 'hidden';
			}
		}
		_HTTP_LPT.send('_do=load_previous_tips&_charts_id=' + _chartsId);
	} catch(e) {
		alert(e);
	}
}

function play(_id, _src)
{
	var player = document.getElementById("mp3player");
	var playerImg = document.getElementById("play_" + _id);
	// first stop other players
	if (_id != _PLAYING_ID && _PLAYING_ID != null) {
		player.innerHTML = "";
		document.getElementById("play_" + _PLAYING_ID).src = _TEMPLATE_URL + "images/play.gif";
	}
	// play
	if (player.innerHTML == '') {
		_PLAYING_ID = _id;
		playerImg.src = _TEMPLATE_URL + "images/stop.gif";
		player.innerHTML =
    	"<object type=\"application/x-shockwave-flash\" data=\"" + _TEMPLATE_URL + "emff_standard.swf\" width=\"0\" height=\"0\">"
    	+ "<param name=\"movie\" value=\"" + _TEMPLATE_URL + "templates/emff_standard.swf\">"
    	+ "<param name=\"quality\" value=\"high\">"
    	+ "<param name=\"FlashVars\" value=\"src=" + encodeURIComponent(_src) + "&amp;autostart=yes\">"
    	+ "<\/object>";
    }
    // stop
    else {
    	playingId = null;
		playerImg.src = _TEMPLATE_URL + "images/play.gif";
    	player.innerHTML = "";
    }
}

function openPopup(_url, _width, _height, _arrange)
{
	var x = 10;
	var y = 10;
	var params = 'toolbar=no,location=no,directories=no,status=no,copyhistory=no,scrollbars=yes,resizable=no,width='
	           + _width + ',height=' + _height + ',screenX=' + x + ',screenY=' + y;
	_WINDOWS[_WINDOWS.length] = window.open(_url, 'wnd' + _WINDOWS.length, params);
	if (_WINDOWS[_WINDOWS.length - 1].opener == null) {
		_WINDOWS[_WINDOWS.length - 1].opener = window;
	}
	_WINDOWS[_WINDOWS.length - 1].focus();
}

function switchChartsPos(pos, newPos)
{
	var fields = new Array('artist_name', 'song_title', 'label_name');
	for (var i = 0; i < fields.length; i++) {
		var source = document.getElementById(fields[i] + '_' + pos);
		var target = document.getElementById(fields[i] + '_' + newPos);
		var temp = target.value;
		target.value = source.value;
		source.value = temp;
	}
}

