/*
 * This is part of the live VDR plugin. See COPYING for license information.
 *
 * Javascript functions for the status update box.
 * This file needs mootools.js to be included on the pages.
 */

var LiveVdrInfo = Ajax.extend({

	  options: {
		  autoCancel: true
	  },

	  initialize: function(url, boxId)
	  {
		  this.parent(url, null);
		  this.addEvent('onComplete', this.showInfo);
		  this.addEvent('onFailure', this.reportError);

		  this.boxId = boxId;
		  this.reload = true;
		  this.timer = null;
	  },

	  request: function(update)
	  {
		  this.parent({update: update ? "1" : "0"});
	  },

	  showInfo: function(text, xmldoc)
	  {
		  try {
			  this.selectInfoElems(xmldoc);

			  this.setEpgInfo(xmldoc);

			  this.setInfoMessage(xmldoc);

			  this.setUpdate(xmldoc);
		  }
		  catch (e) {
			  this.reportError(null);
		  }
	  },

	  reportError: function(transport)
	  {
		  this.setTextContent('caption', 'ERROR');
		  var message;
		  if (transport != null) {
			  message = $("__infobox_request_err").firstChild.nodeValue;
		  }
		  else {
			  message = $("__infobox_update_err").firstChild.nodeValue;
		  }
		  this.setTextContent('name', message);
	  },

	  // private function to switch visibility of controls.
	  selectInfoElems: function(xmldoc)
	  {
		  var infoType = xmldoc.getElementsByTagName('type').item(0);

		  var channel = $(this.boxId + '_channel_buttons');
		  var playback = $(this.boxId + '_recording_buttons');

		  if (infoType.firstChild.nodeValue != "channel") {
			  channel.style.display = 'none';
			  playback.style.display = 'block';
			  this.setTextContent('pause', infoType.firstChild.nodeValue);
			  this.setTextContent('play', infoType.firstChild.nodeValue);
			  this.setTextContent('rwd', infoType.firstChild.nodeValue);
			  this.setTextContent('ffw', infoType.firstChild.nodeValue);
			  this.setTextContent('stop', infoType.firstChild.nodeValue);
		  }
		  else {
			  playback.style.display = 'none';
			  channel.style.display = 'block';
		  }
	  },

	  // private function to activate the info message display if the
	  // corresponding element is found in the current page.
	  setInfoMessage: function(xmldoc)
	  {
		  var info = xmldoc.getElementsByTagName('info').item(0);
		  if (! $defined(info))
			  return;

		  var messagebar = $('messagebar');
		  if (! $defined(messagebar))
			  return;

		  var message = xmldoc.getElementsByTagName('message').item(0);
		  var url = xmldoc.getElementsByTagName('url').item(0);

		  if (message.firstChild.nodeValue != "") {
			  $('mbmessage').setText(message.firstChild.nodeValue);
			  if ($defined(url.firstChild)) {
				  $('mbdelimiter').removeClass('notpresent');
				  $('mbreact').setProperty('href', url.firstChild.nodeValue);
			  }
			  else {
				  $('mbdelimiter').addClass('notpresent');
				  $('mbreact').addClass('notpresent');
			  }
			  messagebar.removeClass('notpresent');
		  }
	  },

	  // private function to display information from EPG info.
	  setEpgInfo: function(xmldoc)
	  {
		  var epgInfo = xmldoc.getElementsByTagName('epginfo').item(0);

		  for (var i = 0; i < epgInfo.childNodes.length; i++) {
			  var node = epgInfo.childNodes.item(i);
			  if (node.nodeType == 1) {
				  var textContent = "";
				  if (node.firstChild != null)
					  textContent = node.firstChild.nodeValue;
				  this.setTextContent(node.nodeName, textContent);
			  }
		  }
	  },

	  // private function to update text contents.
	  setTextContent: function(nodeName, textContent)
	  {
		  var docNode = $(this.boxId + '_' + nodeName);
		  if (docNode != null) {
			  switch (nodeName) {
			  case "caption":
			  case "timenow":
			  case "name":
			  case "duration":
			  {
				  if (docNode.innerHTML != textContent)
					  docNode.innerHTML = textContent;
				  break;
			  }
			  case "elapsed":
			  {
				  var width = textContent + "%";
				  if (docNode.style.width != width)
					  docNode.style.width = width;
				  break;
			  }
			  case "nextchan":
			  case "prevchan":
			  {
				  if (textContent != "") {
					  // docNode.href = "javascript:LiveSimpleAjaxRequest('switch_channel.xml', 'param', '" + textContent + "');";
					  docNode.href = "vdr_request/switch_channel?param=" + textContent;
					  docNode.style.visibility = "visible";
				  }
				  else {
					  docNode.style.visibility = "hidden";
				  }
				  break;
			  }
			  case "pause":
			  case "play":
			  case "rwd":
 			  case "ffw":
			  case "stop":
			  {
				  if (textContent != "") {
					  // docNode.href = "javascript:LiveSimpleAjaxRequest('" + nodeName + "_recording.xml', 'param', '" + textContent + "');";
					  docNode.href = "vdr_request/" + nodeName + "_recording?param=" + textContent;
					  docNode.style.visibility = "visible";
				  }
				  else {
					  docNode.style.visibility = "hidden";
				  }
				  break;
			  }
			  default:
				  break;
			  }
		  }
	  },

	  // private function to determine update status and to trigger
	  // the next update.
	  setUpdate: function(xmldoc)
	  {
		  /* check if we still need to update the status */
		  var upd = xmldoc.getElementsByTagName('update').item(0);
		  var rel = (upd.firstChild.nodeValue == "1");

		  if (rel != this.reload) {
			  this.reload = rel;
			  var img = $('statusReloadBtn');
			  if (img != null) {
				  // change image according to state.
				  img.src = this.reload ? 'img/stop_update.png' : 'img/reload.png';
			  }
		  }
		  if (this.reload)
			  this.timer = this.request.delay(1000, this, true);
	  },

	  toggleUpdate: function()
	  {
		  if (this.reload) {
			  if (this.timer != null) {
				  this.timer = $clear(this.timer);
			  }
		  }
		  this.request(!this.reload);
	  },

	  pageFinished: function()
	  {
		  if (this.reload) {
			  if (this.timer != null) {
				  this.timer = $clear(this.timer);
			  }
		  }
		  this.cancel();
	  }
});
