function getPageOffsetLeft(object) {
  var x;
  // Return the x coordinate of an element relative to the page.
  x = object.offsetLeft;
  if (object.offsetParent != null)
    x += getPageOffsetLeft(object.offsetParent);
  return x;
}

function getPageOffsetTop(object) {
  var y;
  // Return the x coordinate of an element relative to the page.
  y = object.offsetTop;
  if (object.offsetParent != null)
  y += getPageOffsetTop(object.offsetParent);
  return y;
}

function stringTrim(string) {
  var left;
  var right;
  for(left=0; left<string.length && string.charAt(left)<=" "; left++);
  for(right=string.length-1; right>=0 && string.charAt(right)<=" "; right--);
  if(left > right) {
    return "";
  }
  return string.substring(left,right+1);
}

function InitImageViewerLanguage(oImageViewer) {
  oImageViewer.ReplaceTextString(3,  "No iniciado");
  oImageViewer.ReplaceTextString(4,  "No conectado");
  oImageViewer.ReplaceTextString(5,  "¡Conexión con motor fallida! Reintentando...");
  oImageViewer.ReplaceTextString(6,  "Conectando con: %s en %s:%d...");
  oImageViewer.ReplaceTextString(7,  "Conectado a: %d en %s:%d");
  oImageViewer.ReplaceTextString(8,  "No se ha podido hallar el escritorio");
  oImageViewer.ReplaceTextString(9,  "Directo");
  oImageViewer.ReplaceTextString(10, "Antes del inicio de Base de datos");
  oImageViewer.ReplaceTextString(11, "Después de finalizar Base de datos");
  oImageViewer.ReplaceTextString(12, "Conexión rechazada. Razón: %s");
  oImageViewer.ReplaceTextString(13, "¡Conexión con: %s en %s:%d perdida! Reconectando...");
  oImageViewer.ReplaceTextString(14, "¡Error Interno!");
  oImageViewer.ReplaceTextString(15, "N/A");
  oImageViewer.ReplaceTextString(16, "No hay imágenes disponibles para %s en %s. La base de datos puede estar vacía.");
  oImageViewer.ReplaceTextString(17, "Incapaz de crear directorio: '%s' - can't export");
  oImageViewer.ReplaceTextString(19, "Incapaz de crear el archivo:  '%s' - no puede exportarse.");
  oImageViewer.ReplaceTextString(20, "Parado");
  oImageViewer.ReplaceTextString(22, "El servidor se está quedando sin espacio en el disco");
  oImageViewer.ReplaceTextString(23, "El servidor ha perdido la conexión con la cámara");
  oImageViewer.ReplaceTextString(24, "El servidor ha encontrado un problema en la base de datos");
  oImageViewer.ReplaceTextString(25, "Sin movimiento");
  oImageViewer.ReplaceTextString(27, "Grabando");
}

function stringContainsReserverdChars(string) {
  //remember to update getReserverdCharsString()
  if(string.indexOf("<") >= 0) return true;
  if(string.indexOf(">") >= 0) return true;
  if(string.indexOf("&") >= 0) return true;
  if(string.indexOf("\"") >= 0) return true;
  if(string.indexOf("'") >= 0) return true;
}

function getReserverdCharsString() {
  return "<, >, &, \", y '";
}

function convertQualityToIpixQuality(quality) {
  quality = parseInt(quality);
  switch(quality) {
    case 101  :
      return 35;
    case 102  :
      return 30;
    case 103  :
      return 25;
    case 104  :
      return 20;
    default   : 
      return 100;
  }
}

function convertIpixSplitModeToNumberOfViewpoints(ipixSplitMode)
{
  var viewpointCount;
  switch(ipixSplitMode) {
    case 0  : viewpointCount = 1; break;
    case 1  : viewpointCount = 4; break;
    default : viewpointCount = 1; break;
  }
  
  return viewpointCount;
}

function saveActiveViewGroup() {
  var nResult = top.configManager.SaveActiveViewGroup();
  switch(nResult) {
    case 0 :
      //everything ok
      break;
    case 2 :
      //ViewGroup is read only
      alert("Error al guardar información del Grupo de vistas." + " " + "Grupo de vistas sólo lectura.");
      break;
    case 3 :
      //ViewGroup modified by other user
      alert("Error al guardar información del Grupo de vistas." + " " + "Grupo de vistas modificado por." + " " + top.configManager.GetLastModifiedErrorUsername() + "\n\n" + "Debe volver a autenticarse para que los cambios en su Grupo de vistas tengan efecto.");
      break;
    case 1 :
    default:
      //Unspecified error
      alert("Error al guardar información del Grupo de vistas." + " " + "Error no especificado.");
      break;
  }
}

/**************************************************************
Parse URL query string (the part after "?") into a collection
of [key][value].
The result is stored in variable m_params
**************************************************************/
function parseQueryString() {
  var params= new Object();
  window.parameters= params;

  var reEquals= /=/ig;
  var reAnd= /&/ig;
  var reQuestionMark= /\?/ig;
  var query= window.location.href.split(reQuestionMark);

  if (query.length > 1) {
    var querySplit= query[1].split(reAnd);
    var length= querySplit.length;
    var split, arr, name;

    for (var i=0;i<length;i++) {
      split= querySplit[i].split(reEquals);
      name= split[0];
      if(!params[name]) {
        arr= new Array();
        params[name]= arr; 
      }
      else {
        arr= params[name];
      }
      if(split.length < 2) {
        arr[arr.length]= "";
      }
      else {
        arr[arr.length]= unescape(split[1]);
      }
    }
  }
}
    
/**************************************************************
Get parameter value by it`s name. Parameters are received from
URL`s query string, and sores in m_params variable
by parseQueryString() function

Argument: sName - parameter name (e.g. "starttime").

Return: parameter value
**************************************************************/
function getParam(sName) {
  if(window.parameters != null) {
    return window.parameters[sName];
  }
  return null;
}

function doesCamConfContainConnectInfo(cameraConfigurationXml) {
  var cameraConfDoc = new ActiveXObject("Microsoft.XMLDOM");
  cameraConfDoc.async = false;

  //load camera configuration xml into dom
  if(cameraConfDoc.loadXML(cameraConfigurationXml) == false) {
    return; //not a valid camera configuration xml document
  }

  var tempNode;
  //validate that hostname contains valid data
  tempNode = cameraConfDoc.selectSingleNode("/camera/hostname");
  if(tempNode == null)
  {
    return false;
  }
  if(tempNode.text == "")
  {
    return false;
  }

  //validate that port contains valid data
  tempNode = cameraConfDoc.selectSingleNode("/camera/port");
  if(tempNode == null)
  {
    return false;
  }
  if(tempNode.text == "")
  {
    return false;
  }
  
  return true;
}