//--------------------------------------------------------------------------------------------------
//
//  DECLARACION Y  DEFINICION DE LOS OBJETOS
//

//
// Declaracion y definición del objeto 'Mapa'.
//

function Mapa(nombre)
{
  // ...
  // propiedades asociadas al objeto Mapa.
  // ...

  this.nombre = nombre;
  this.formulario = nombre;
  this.factorX = 0.9;     // porcentaje en el desplazameniento/mover en X del mapa.
  this.factorY = 0.9;     // porcentaje en el desplazameniento/mover en Y del mapa.
  this.escalas = null;    // objeto.
  this.capas = null;      // objeto.
  this.temporalX = 0;     // coordenada X temporal
  this.temporalY = 0;     // coordenada Y temporal
  this.despX = 0;         // desplazamiento en X
  this.despY = 0;         // desplazamiento en Y
  this.raton = false;     // estado del raton para el arrastre: true=pulsado
  this.limpiarDir = false // indica si se ha de limpiar NOMDIR al enviar el formulario
  this.mensajesAyuda = new Array();
  this.mensajesError = new Array();
  this.codigoDinamico = '';
   
  // ...
  // Declaración de los metodos asociados al objeto 'Mapa'.
  // ...
  
  // ... Métodos Públicos del objeto: 'Mapa'.  Podrán aparecer incrustadas las llamadas en el codigo HTML.
  
  this.cargarCapas = Mapa_cargarCapas;
  this.seleccionCapas = Mapa_seleccionCapas;
  this.cargarCodigoDinamico = Mapa_cargarCodigoDinamico;
  this.cargarEscalas = Mapa_cargarEscalas;
  this.cargarEscalasDeSelect = Mapa_cargarEscalasDeSelect;
  this.factorEscalado = Mapa_factorEscalado;
  this.escalar = Mapa_escalar;
  this.onMouseDown = Mapa_onMouseDown;
  this.onMouseMove = Mapa_onMouseMove;
  this.onMouseUp = Mapa_onMouseUp;
  this.onClick = Mapa_onMouseUp;
  this.zoomIn = Mapa_zoomIn;
  this.zoomOut = Mapa_zoomOut;
  this.rotacion = Mapa_rotacion;
  this.rotarAngulo = Mapa_rotarAngulo;
  this.centrarPto = Mapa_centrarPto;
  this.arrastrar = Mapa_arrastrar;
  this.zoomInPto = Mapa_zoomInPto;
  this.zoomOutPto = Mapa_zoomOutPto;
  this.informacion = Mapa_informacion;
  this.moverArriba = Mapa_moverArriba;
  this.moverAbajo = Mapa_moverAbajo;
  this.moverDerecha = Mapa_moverDerecha;
  this.moverIzquierda = Mapa_moverIzquierda;
  this.moverArribaDerecha = Mapa_moverArribaDerecha;
  this.moverArribaIzquierda = Mapa_moverArribaIzquierda;
  this.moverAbajoDerecha = Mapa_moverAbajoDerecha;
  this.moverAbajoIzquierda = Mapa_moverAbajoIzquierda;
  this.enviar = Mapa_enviar;

  // ... Métodos Privados del objeto: 'Mapa'.  Invocables desde funciones javascript NO desde codigo HTML.

  this.crearEscalas = Mapa_crearEscalas;
  this.ponerEscalaActual = Mapa_ponerEscalaActual;
  this.leerEscalaActual = Mapa_leerEscalaActual;
  this.ponerFormulario = Mapa_ponerFormulario;
  this.leerFormulario = Mapa_leerFormulario;
  this.ponerEstado = Mapa_ponerEstado;
  this.leerEstado = Mapa_leerEstado;
  this.prepararUsoMapa = Mapa_prepararUsoMapa;
  this.prepararEscalado = Mapa_prepararEscalado;
  this.coordX = Mapa_coordX;
  this.coordY = Mapa_coordY;
  this.calcularCoords = Mapa_calcularCoords;
  this.mover = Mapa_mover;
  this.rotarCoords = Mapa_rotarCoords;
  this.ejecutarCentrarPto = Mapa_ejecutarCentrarPto;
  this.ejecutarArrastrar = Mapa_ejecutarArrastrar;
  this.ejecutarZoomInPto = Mapa_ejecutarZoomInPto;
  this.ejecutarZoomOutPto = Mapa_ejecutarZoomOutPto;
  this.limpiarCalles = Mapa_limpiarCalles;
  this.dirPostal = Mapa_dirPostal;
  this.enviarCoords = Mapa_enviarCoords;
  this.prepararMensajes = Mapa_prepararMensajes;
  this.prepararMensajesCat = Mapa_prepararMensajesCat;
  this.prepararMensajesEsp = Mapa_prepararMensajesEsp;
  this.prepararMensajesEng = Mapa_prepararMensajesEng;
  this.mensajeAyuda = Mapa_mensajeAyuda;
  this.mensajeError = Mapa_mensajeError;
}

  // ...
  // Definición de los metodos asociados al objeto 'Mapa'.
  // ...


function Mapa_cargarCapas(grupo, param)
{
// grupo = Nombre que comparten todos los elementos de un formulario que se refieren a una capa a activar/desactivar
// param = Puede tener tres valores:
//         null      -> .
//         VN_XXXXX  -> .
//         miFuncion -> .

  if (document.forms[this.leerFormulario()].MP_CAPAS) {
    this.capas = new Capas('CapasIco',grupo, param);
    if (document.forms[this.leerFormulario()].MP_CAPAS.value == "'*'")
    {
      cap = document.forms[this.leerFormulario()].elements[grupo];
      for (i = 0; i < cap.length; i++){
        cap[i].checked = true;
      }
    } else {
      ini = document.forms[this.leerFormulario()].MP_CAPAS.value.split(',');
      cap = document.forms[this.leerFormulario()].elements[grupo];
      for (j = 0; j < ini.length; j++){
        val = ini[j];
        for (i = 0; i < cap.length; i++){
          if (cap[i].value == val) {
            cap[i].checked = true;
            break;
          }
        }
      }
    }
    // Actualizar variable de usuario o llamar a funcion de usuario
    if ((typeof param == 'string') && (document.forms[this.leerFormulario()].elements[param])) {
      if (document.forms[this.leerFormulario()].MP_CAPAS.value != "'*'") {
        document.forms[this.leerFormulario()].elements[param].value = document.forms[this.leerFormulario()].MP_CAPAS.value;
      } else {
        vnCapas = document.forms[this.leerFormulario()].VN_CAPA;
        vnCapas.value = '';
        capasDef = document.forms[this.leerFormulario()].elements[grupo];
        for (i = 0; i < capasDef.length; i++){
          if (vnCapas.value != '') {
            vnCapas.value = vnCapas.value + ',';
          }
          vnCapas.value = vnCapas.value + capasDef[i].value;
        }
      }
    } else {
      if (typeof param == 'function') param();
    }
  }
}

function Mapa_seleccionCapas()
{
  val = document.forms[this.leerFormulario()].MP_CAPAS;
  val.value = '';
  cap = document.forms[this.leerFormulario()].elements[this.capas.leerGrupo()];
  for (i = 0; i < cap.length; i++){
    if (cap[i].checked) {
      if (val.value != '') {
        val.value = val.value + ',';
      }
      val.value = val.value + cap[i].value;
    }
  }
  // Actualizar variable de usuario o llamar a funcion de usuario
  if ((typeof this.capas.leerParam() == 'string') && (document.forms[this.leerFormulario()].elements[this.capas.leerParam()])) {
    document.forms[this.leerFormulario()].elements[this.capas.leerParam()].value = document.forms[this.leerFormulario()].MP_CAPAS.value;
  } else {
    fParam = this.capas.leerParam();
    if (typeof  fParam == 'function') fParam();
  }
}

function Mapa_cargarCodigoDinamico(codigoDinamico)
{
  this.codigoDinamico = codigoDinamico;
  document.write(codigoDinamico);
} 

function Mapa_crearEscalas(nombre)
{
  this.escalas = new Escalas(nombre);
  this.escalas.ponerEscalaActual(leerVEntorno(this.leerFormulario(), 'VN_ESCALA'));
}

function Mapa_cargarEscalasDeSelect(eSelect)
{
  if (document.forms[this.leerFormulario()].elements[eSelect]) {
    this.escalas.escalas = new Array();
    numEsc = document.forms[this.leerFormulario()].elements[eSelect].length;
    for (i = 0; i < numEsc ; i++) {
      this.escalas.escalas[i] = document.forms[this.leerFormulario()].elements[eSelect][i].value;
      if (this.escalas.escalas[i] == leerVEntorno(this.leerFormulario(), 'VN_ESCALA')) {
        this.escalas.ponerEscalaActual(this.escalas.escalas[i]);
        this.escalas.ponerPosicionActual(i);
        document.forms[this.leerFormulario()].elements[eSelect].selectedIndex = i;
      }
    }
    this.escalas.ponerNumeroEscalas(numEsc);
    return true;
  } else {
    return false;
  }
}

function Mapa_cargarEscalas()
{
  numArgs = Mapa_cargarEscalas.arguments.length;
  if (numArgs > 0){
    this.escalas.escalas = new Array();
    this.escalas.ponerNumeroEscalas(numArgs);
    for (i = 0; i < numArgs ; i++) {
      this.escalas.escalas[i] = Mapa_cargarEscalas.arguments[i];
      if (this.escalas.escalas[i] == leerVEntorno(this.leerFormulario(), 'VN_ESCALA')) {
        this.escalas.ponerEscalaActual(this.escalas.escalas[i]);
        this.escalas.ponerPosicionActual(i);
      }
    }
    return true;
  } else {
    return false;
  }   
}

function Mapa_ponerEscalaActual(escala)
{
  ponerVEntorno(this.leerFormulario(), 'VN_ESCALA', escala);
  this.escalas.ponerEscalaActual(escala);
}

function Mapa_leerEscalaActual()
{
  return leerVEntorno(this.leerFormulario(), 'VN_ESCALA');
}

function Mapa_ponerFormulario(formulario)
{
  this.formulario = formulario;
}

function Mapa_leerFormulario()
{
  return this.formulario;
}

function Mapa_prepararUsoMapa()
{  
  if (document.images['idgif']) {
    gifMapa = document.images['idgif'];
    estado = leerVEntorno(this.leerFormulario(), 'MP_ESTADO');
    switch (estado) {
      case 'INFORMACION':
        gifMapa.useMap = '#info';    
        gifMapa.style.cursor = 'hand';
        break;
      case 'CENTRARPTO':
      case 'ZOOMINPTO':
      case 'ZOOMOUTPTO':
        gifMapa.useMap = '';    
        gifMapa.style.cursor = 'crosshair';
        break;
      case 'ARRASTRAR':
        gifMapa.useMap = '';    
        gifMapa.style.cursor = 'move';
        break;
      default:
        gifMapa.useMap = '';    
        gifMapa.style.cursor = 'default';
        break;
    }
    gifMapa.alt = this.mensajeAyuda(estado);
  }
}

function Mapa_prepararMensajesCat() {
  this.mensajesAyuda['CENTRARPTO'] = 'Feu click en el punt del mapa\nque voleu CENTRAR';
  this.mensajesAyuda['ARRASTRAR'] = 'Feu click sobre el mapa\ni ARROSSEGUEU-lo';
  this.mensajesAyuda['ZOOMINPTO'] = 'Feu click en el punt del mapa\nque voleu APROPAR';
  this.mensajesAyuda['ZOOMOUTPTO'] = 'Feu click en el punt del mapa\nque voleu ALLUNYAR';
  this.mensajesAyuda['INFORMACION'] = 'Feu click sobre una icona\nper veure la seva FITXA';

  this.mensajesError["No se ha encontrado ningún elemento."] = 
                     "No existeix informació associada al punt del mapa seleccionat";
  this.mensajesError["[DIRPOST] Demasiadas direcciones encontradas"] = 
                     "L'adreça especificada és massa ambígua.<br>Si us plau, entreu més caràcters";
  this.mensajesError["[DIRPOST] Dirección no encontrada"] = 
                     "L'adreça indicada no es troba a les nostres bases de dades";
  this.mensajesError["[DIRPOST] Dirección incompleta"] = 
                     "Cal especificar el nom del carrer";
  this.mensajesError["[DIRPOST] Número postal incorrecto" ] = 
                     "Número postal incorrecte";
}

function Mapa_prepararMensajesEsp() {
  this.mensajesAyuda['CENTRARPTO'] = 'Pinche en el punto del mapa\nque desee CENTRAR';
  this.mensajesAyuda['ARRASTRAR'] = 'Pinche sobre el mapa\ny ARRÁSTRELO';
  this.mensajesAyuda['ZOOMINPTO'] = 'Pinche en el punto del mapa\nque desee ACERCAR';
  this.mensajesAyuda['ZOOMOUTPTO'] = 'Pinche en el punto del mapa\nque desee ALEJAR';
  this.mensajesAyuda['INFORMACION'] = 'Pinche sobre un icono\npara ver su FICHA';

  this.mensajesError["No se ha encontrado ningún elemento."] = 
                     "No existe información asociada al punto del mapa seleccionado";
  this.mensajesError["[DIRPOST] Demasiadas direcciones encontradas"] = 
                     "La dirección especificada es demasiado ambígua.<br>Por favor, introduzca más caracteres";
  this.mensajesError["[DIRPOST] Dirección no encontrada"] = 
                     "La dirección indicada no se encuentra en nuestras bases de datos";
  this.mensajesError["[DIRPOST] Dirección incompleta"] = 
                     "Es necesario especificar el nombre de la calle";
  this.mensajesError["[DIRPOST] Número postal incorrecto" ] = 
                     "Número postal incorrecto";
}

function Mapa_prepararMensajesEng() {
  this.mensajesAyuda['CENTRARPTO'] = 'CENTER the map on\nthe click position';
  this.mensajesAyuda['ARRASTRAR'] = 'Hold and move the mouse\non the map to PAN';
  this.mensajesAyuda['ZOOMINPTO'] = 'Click on the map\nto ZOOM IN';
  this.mensajesAyuda['ZOOMOUTPTO'] = 'Click on the map\nto ZOOM OUT';
  this.mensajesAyuda['INFORMACION'] = 'Click on a map icon\nto get more INFORMATION';

  this.mensajesError["No se ha encontrado ningún elemento."] = 
                     "There isn't information linked to this point";
  this.mensajesError["[DIRPOST] Demasiadas direcciones encontradas"] = 
                     "The addres is too ambiguous.<br>Please, enter more characters";
  this.mensajesError["[DIRPOST] Dirección no encontrada"] = 
                     "Address not found in our database";
  this.mensajesError["[DIRPOST] Dirección incompleta"] = 
                     "Incomplete address: the street is missing";
  this.mensajesError["[DIRPOST] Número postal incorrecto" ] = 
                     "The number is wrong";
}

function Mapa_prepararMensajes(idioma) {  
  idioma = idioma.toLowerCase();
  switch (idioma) {
    case 'esp':
    case 'cas':
      this.prepararMensajesEsp();
      break;
    case 'eng':
    case 'ing':
      this.prepararMensajesEng();
      break;
    case 'cat':
    default:
      this.prepararMensajesCat();
      break;
  }
}

function Mapa_mensajeAyuda(estado) {
  if (this.mensajesAyuda[estado]) {
    return this.mensajesAyuda[estado];
  } else {
    return '';
  }
}

function Mapa_mensajeError(texto) {
  if (this.mensajesError[texto]) {
    return this.mensajesError[texto];
  } else {
    return 'ERROR: "' + texto + '"';
  }  
}

function Mapa_ponerEstado(estado)
{
  ponerVEntorno(this.leerFormulario(), 'MP_ESTADO', estado);
  this.prepararUsoMapa();
}

function Mapa_centrarPto()
{
  this.ponerEstado('CENTRARPTO');
}

function Mapa_arrastrar()
{
  this.ponerEstado('ARRASTRAR');
}

function Mapa_zoomInPto()
{
  this.ponerEstado('ZOOMINPTO');
}

function Mapa_zoomOutPto()
{
  this.ponerEstado('ZOOMOUTPTO');
}

function Mapa_informacion()
{
  this.ponerEstado('INFORMACION');
}

function Mapa_leerEstado()
{
  return leerVEntorno(this.leerFormulario(), 'MP_ESTADO');
}

function Mapa_limpiarCalles() {
  limpiar(this.leerFormulario(), 'DP_CALLE');
  limpiar(this.leerFormulario(), 'DP_CALLE2');
  limpiar(this.leerFormulario(), 'DP_NUMERO');
}

function Mapa_prepararEscalado(escala){
  this.limpiarCalles();
  this.ponerEscalaActual(escala);
};

function Mapa_escalar(escala) {
  this.prepararEscalado(escala);
  this.enviar();
}

function Mapa_coordX(event, elem) {
  if (typeof event.offsetX != "undefined") {
    return event.offsetX;
  } else {
    if (typeof event.clientX != "undefined" && 
        typeof elem.offsetLeft != "undefined") {
      return event.clientX - elem.offsetLeft;
    } else {
      return -1;
    }
  }
}

function Mapa_coordY(event, elem) {
  if (typeof event.offsetY != "undefined") {
    return event.offsetY;
  } else {
    if (typeof event.clientY != "undefined" && 
        typeof elem.offsetTop != "undefined") {
      return event.clientY - elem.offsetTop;
    } else {
      return -1;
    }
  }
}

function Mapa_onMouseDown(event, elem) {
  if (this.leerEstado() == 'ARRASTRAR') {  
    this.raton = true;
    this.temporalX = this.coordX(event, elem);
    this.temporalY = this.coordY(event, elem);
    this.despX = 0;
    this.despY = 0;
    return false;
  } else {
    this.raton = false;
    return true;  
  }
}

function Mapa_onMouseMove(event, elem) {
  if (this.raton && (this.leerEstado() == 'ARRASTRAR')) {  
    if (event.target) evElem = event.target
    else if (event.srcElement) evElem = event.srcElement;
    var obj = document.getElementById('divgif').style;
    if (obj && evElem.name == 'idgif') {
      document.images['idgif'].alt = '';
      var incx = this.coordX(event, elem) - this.temporalX;
      var incy = this.coordY(event, elem) - this.temporalY;
/* document.forms[0].melem.value = elem.name;
document.forms[0].mevent.value = evElem.name;
document.forms[0].mleft.value = obj.left;
document.forms[0].mtop.value = obj.top;
document.forms[0].mincx.value = incx;
document.forms[0].mincy.value = incy;
document.forms[0].mcoorx.value = this.coordX(event, elem);
document.forms[0].mcoory.value = this.coordY(event, elem);
document.forms[0].mtempx.value = event.offsetX;
document.forms[0].mtempy.value = event.offsetY; */
//      this.temporalX = this.coordX(event, elem);
//      this.temporalY = this.coordY(event, elem);
      this.despX += incx;
      this.despY += incy;
      var left = parseInt(obj.left) + incx;
      var top = parseInt(obj.top) + incy;
      var width = parseInt(obj.width) - left;
      var height = parseInt(obj.height) - top;
      obj.left = left;
      obj.top = top;
      obj.clip = 'rect(' + (-top) + ',' + width + ',' + height + ',' + (-left) + ')';
    }
    return false;
  } else {
    return true;
  }
}

function Mapa_onMouseUp(event, elem) {
  this.raton = false;
  if (this.leerEstado() == 'CENTRARPTO') {  
    this.ejecutarCentrarPto(this.coordX(event, elem), this.coordY(event, elem));
    return true;
  }
  if (this.leerEstado() == 'ARRASTRAR') {  
    this.ejecutarArrastrar(this.coordX(event, elem), this.coordY(event, elem));
    return false;
  }
  if (this.leerEstado() == 'ZOOMINPTO') {  
    this.ejecutarZoomInPto(this.coordX(event, elem), this.coordY(event, elem));
    return true;
  }
  if (this.leerEstado() == 'ZOOMOUTPTO') {  
    this.ejecutarZoomOutPto(this.coordX(event, elem), this.coordY(event, elem));
    return true;
  }
}

function Mapa_rotarCoords(x, y, x0, y0) {
  angulo = parseFloat(leerVEntorno(this.leerFormulario(), 'VN_ROTACION'));
  if (angulo == 0) return;
  angulo = angulo * Math.PI / 180.00;
  seno = Math.sin(angulo);
  coseno = Math.cos(angulo);
  xrot = (x - x0) * coseno + (y - y0) * seno + x0;
  yrot = -(x - x0) * seno + (y - y0) * coseno + y0;
  coordX = Math.round(xrot).toString(10);
  coordY = Math.round(yrot).toString(10);
  ponerVEntorno(this.leerFormulario(), 'VN_COORDX', coordX);
  ponerVEntorno(this.leerFormulario(), 'VN_COORDY', coordY);
}

function Mapa_calcularCoords(xPant, yPant) {
  xMundo = parseInt(leerVEntorno(this.leerFormulario(), 'VN_COORDX'));
  yMundo = parseInt(leerVEntorno(this.leerFormulario(), 'VN_COORDY'));
  escala = parseInt(this.leerEscalaActual());
  despPant = xPant - (leerVEntorno(this.leerFormulario(), 'VN_BMPX') / 2);
  despMundo = Math.round((despPant * escala) / leerVEntorno(this.leerFormulario(), 'IN_ESCALA')) ;
  coordX = xMundo + despMundo;
  ponerVEntorno(this.leerFormulario(), 'VN_COORDX', coordX);
  despPant = (leerVEntorno(this.leerFormulario(), 'VN_BMPY') / 2) - yPant;
  despMundo = Math.round((despPant * escala) / leerVEntorno(this.leerFormulario(), 'IN_ESCALA')) ;
  coordY = yMundo + despMundo;
  ponerVEntorno(this.leerFormulario(), 'VN_COORDY', coordY);
  this.rotarCoords(coordX, coordY, xMundo, yMundo);
  this.limpiarDir = true;
}

function Mapa_mover(factorX, factorY) {
  escala = parseInt(this.leerEscalaActual());
  despX = Math.round((leerVEntorno(this.leerFormulario(), 'VN_BMPX') * escala * factorX) / leerVEntorno(this.leerFormulario(), 'IN_ESCALA'));
  actX = parseInt(leerVEntorno(this.leerFormulario(), 'VN_COORDX'));
  coordX = despX + actX;
  ponerVEntorno(this.leerFormulario(), 'VN_COORDX', coordX);
  despY = Math.round((leerVEntorno(this.leerFormulario(), 'VN_BMPY') * escala * factorY) / leerVEntorno(this.leerFormulario(), 'IN_ESCALA'));
  actY = parseInt(leerVEntorno(this.leerFormulario(), 'VN_COORDY'));
  coordY = despY + actY;
  ponerVEntorno(this.leerFormulario(), 'VN_COORDY', coordY);
  this.rotarCoords(coordX, coordY, actX, actY);
  this.limpiarDir = true;
  this.limpiarCalles();
  this.enviar();
}

function Mapa_moverArriba()
{
  this.mover(0,this.factorY);
}

function Mapa_moverAbajo()
{
  this.mover(0,-this.factorY);
}

function Mapa_moverDerecha()
{
  this.mover(this.factorX,0);
}

function Mapa_moverIzquierda()
{
  this.mover(-this.factorX,0);
}

function Mapa_moverArribaDerecha()
{
  this.mover(this.factorX,this.factorY);
}

function Mapa_moverArribaIzquierda()
{
  this.mover(-this.factorX,this.factorY);
}

function Mapa_moverAbajoDerecha()
{
  this.mover(this.factorX,-this.factorY);
}

function Mapa_moverAbajoIzquierda()
{
  this.mover(-this.factorX,-this.factorY);
}

function Mapa_enviar() {
  if (document.images['idgif']) {
    gifMapa = document.images['idgif'];
    gifMapa.alt = '';
    gifMapa.style.cursor = 'wait';
  }
  document.body.style.cursor = 'wait';
  if (this.limpiarDir) limpiar(this.leerFormulario(), 'NOMDIR');
  document.forms[this.leerFormulario()].submit();
}

function Mapa_ejecutarCentrarPto(xPant, yPant) {
  this.calcularCoords(xPant, yPant);
  this.enviar();
}

function Mapa_ejecutarArrastrar(xPant, yPant) {
  xCent = leerVEntorno(this.leerFormulario(), 'VN_BMPX') / 2;
  yCent = leerVEntorno(this.leerFormulario(), 'VN_BMPY') / 2;
  this.calcularCoords(xCent -  this.despX, yCent - this.despY);
  this.enviar();
}

function Mapa_zoomIn() {
  escalaAnterior = this.escalas.leerEscalaAnterior();
  if (escalaAnterior) {
    this.escalar(escalaAnterior);
  } else {
    this.limpiarDir = false;  
  }
}

function Mapa_ejecutarZoomInPto(xPant, yPant) {
  this.calcularCoords(xPant, yPant);
  this.zoomIn();
}

function Mapa_zoomOut() {
  escalaSiguiente = this.escalas.leerEscalaSiguiente();
  if (escalaSiguiente) {
    this.escalar(escalaSiguiente);
  } else {
    this.limpiarDir = false;  
  }
}

function Mapa_ejecutarZoomOutPto(xPant, yPant) {
  this.calcularCoords(xPant, yPant);
  this.zoomOut();
}

function Mapa_factorEscalado(factorEscala) {
  mapa.escalas.ponerFactorEscala(factorEscala);
}

function Mapa_rotarAngulo(angulo) {
  ponerVEntorno(this.leerFormulario(), 'VN_ROTACION', angulo);
  this.limpiarCalles();
  this.enviar();
}

function Mapa_rotacion() {
  angulo = leerVEntorno(this.leerFormulario(), 'VN_ROTACION');
  if (angulo == '0') {
    angulo = '-44.4679';
  } else {
    angulo = '0';
  }
  this.rotarAngulo(angulo);
}

function Mapa_dirPostal(c, n1, l1, n2, l2) {
  dir = c + ', ';
  dir += eval('n1-0');
  if (l1 != '&nbsp;') dir += l1;
  if ((n1 != n2) || (l1 != l2)) {  
    dir += '-';
    dir += eval('n2-0');
    if (l2 != '&nbsp;') dir += l2;
  }
  return dir;
}

function Mapa_enviarCoords(eSelect) {
  if (document.forms[this.leerFormulario()].elements[eSelect]) {
    lista = document.forms[this.leerFormulario()].elements[eSelect];
    xy = lista.value;
    pos = xy.indexOf("-");
    if (pos > 0) {
      ponerVEntorno(this.leerFormulario(), 'VN_COORDX', xy.substring(0, pos));
      ponerVEntorno(this.leerFormulario(), 'VN_COORDY', xy.substring(++pos, xy.length));
      i = lista.selectedIndex;
      ponerVEntorno(this.leerFormulario(), 'NOMDIR', lista[i].text);
    }
    this.enviar();
  }
}

// ...
// FIN Declaracion de los metodos asociados al objeto Mapa.
// ...

//
// Declaracion y definición del objeto 'Escalas'.
//

function Escalas(nombre)
{
  // ...
  // propiedades asociadas al objeto Escalas.
  // ...

  this.nombre = nombre;
  this.factorEscala = 2; // Valor por defecto. De existir escalas, estas pasan por encima del factor de escala.
  this.escalas = null;
  this.numeroEscalas = null;
  this.escalaActual = null;
  this.posicionActual = null;

  // ...
  // Declaración de los metodos asociados al objeto 'Escalas'.
  // ...

  // ... Métodos Públicos del objeto: 'Escalas'

  // ... Métodos Privados del objeto: 'Escalas'

  this.leerEscalaActual = Escalas_leerEscalaActual;
  this.ponerEscalaActual = Escalas_ponerEscalaActual;
  this.ponerEscalas = Escalas_ponerEscalas;
  this.leerEscalas = Escalas_leerEscalas;
  this.ponerEscalaActual = Escalas_ponerEscalaActual;
  this.leerEscalaActual = Escalas_leerEscalaActual;
  this.leerNumeroEscalas = Escalas_leerNumeroEscalas;
  this.ponerNumeroEscalas = Escalas_ponerNumeroEscalas;
  this.leerPosicionActual = Escalas_leerPosicionActual;
  this.ponerPosicionActual = Escalas_ponerPosicionActual;
  this.cargarEscalasDeArray = Escalas_cargarEscalasDeArray;
  this.leerEscalaAnterior = Escalas_leerEscalaAnterior;
  this.leerEscalaSiguiente = Escalas_leerEscalaSiguiente;
  this.leerFactorEscala = Escalas_leerFactorEscala;
  this.ponerFactorEscala = Escalas_ponerFactorEscala;
}

// ...
// Definición de los metodos asociados al objeto 'Escalas'.
// ...

function Escalas_ponerEscalaActual(escala)
{
  this.escalaActual = escala;
}

function Escalas_leerEscalaActual()
{
  return this.escalaActual; 
}

function Escalas_ponerEscalas(aEscalas){
  this.escalas = aEscalas;
}

function Escalas_leerEscalas() {
  return this.escalas;
}

function Escalas_leerNumeroEscalas()
{
  return this.NumeroEscalas;
}

function Escalas_ponerNumeroEscalas(numeroEscalas)
{
  this.NumeroEscalas = numeroEscalas;
}

function Escalas_leerPosicionActual()
{
  return this.PosicionActual;
}

function Escalas_ponerPosicionActual(posicion)
{
  this.posicionActual = posicion;
}

function Escalas_cargarEscalasDeArray(aEscalas, escalaDefecto) {
  this.ponerEscalas(aEscalas);
  this.ponerNumeroEscalas(aEscalas.length);
  this.ponerEscalaActual(escalaDefecto);
  for (i = 0; i < this.leerNumeroEscalas(); i++) {
    if (this.escalas[i] == escalaDefecto) {
      this.ponerPosicionActual(i);
      break;
    }
  }
  if (i == this.leerNumeroEscalas()){
    return false;
  } else {
    return true;
  }
}

function Escalas_leerEscalaAnterior()
{
  if (this.escalas != null) { // Hay array de escalas.
    escAct = this.leerEscalaActual();
    for (i = 0; i < this.leerNumeroEscalas(); i++) {
      if (this.escalas[i] == escAct) {
        if (i >= 1) {
          return this.escalas[i - 1];
        } else {
          return false;
        }
      }
    }
  } else { // NO hay array de escalas. Busco factor de escalado.
      escalaObtenida = Math.round(this.leerEscalaActual() / this.leerFactorEscala());
      return escalaObtenida;
  }
}

function Escalas_leerEscalaSiguiente()
{
  if (this.escalas != null) {  // Hay array de escalas
    escAct = this.leerEscalaActual();
    for (i = 0; i < this.leerNumeroEscalas(); i++) {
      if (this.escalas[i] == escAct) {
        if (i < (this.leerNumeroEscalas() - 1)) {
          return this.escalas[i + 1];
        } else {
          return false;
        }
      }
    }
  } else {  // NO hay array de escalas. Busco factor de escalado.
      escalaObtenida = Math.round(this.leerEscalaActual() * this.leerFactorEscala());
      return escalaObtenida;
  }
}

function Escalas_leerFactorEscala()
{
  return this.factorEscala;
}

function Escalas_ponerFactorEscala(factorEscala)
{
  if (factorEscala > 0) {
    this.factorEscala = factorEscala;
  }
}

// ...
// FIN Declaracion de los metodos asociados al objeto 'Escalas'.
// ...


//
// Declaracion y definición del objeto 'Capas'.
//

function Capas(nombre, grupo, param)
{
  // ...
  // propiedades asociadas al objeto Capas.
  // ...

  this.nombre = nombre;
  this.grupo = grupo;
  this.param = param;

  // ...
  // Declaración de los metodos asociados al objeto 'Capas'.
  // ...

  // ... Métodos Públicos del objeto: 'Capas'

  // ... Métodos Privados del objeto: 'Capas'

  this.leerNombre = Capas_leerNombre;
  this.leerGrupo = Capas_leerGrupo;
  this.leerParam = Capas_leerParam;

}

// ...
// Definición de los metodos asociados al objeto 'Capas'.
// ...

function Capas_leerNombre()
{
  return this.nombre;
}

function Capas_leerGrupo()
{
  return this.grupo;
}

function Capas_ponerGrupo(grupo)
{
  this.grupo = grupo;
}

function Capas_leerParam()
{
  return this.param;
}

function Capas_ponerParam(param)
{
  this.param = param;
}

// ...
// FIN Declaracion de los metodos asociados al objeto 'Capas'.
// ...


// ============================================================================================
// Inicializaciones
// ============================================================================================

var mapa = new Mapa('');

// ============================================================================================
// Funciones de carácter GENERAL.
// ============================================================================================

function crearMapa(nombre)
{
  mapa.nombre = nombre;
  mapa.formulario = nombre;
  mapa.prepararMensajes(leerVEntorno(nombre, 'MP_IDIOMA'));
  mapa.prepararUsoMapa();
  mapa.crearEscalas(nombre);
  document.forms[nombre].MP_DINAMICO.value = mapa.codigoDinamico.replace(/'/g, "\\'");
}

function leerVEntorno(formulario, vEntorno)
{
  return document.forms[formulario].elements[vEntorno].value; 
}

function ponerVEntorno(formulario, vEntorno, valor)
{
  document.forms[formulario].elements[vEntorno].value = valor; 
}

function limpiar(formulario, variable) {
  if (document.forms[formulario].elements[variable]) {
    document.forms[formulario].elements[variable].value = '';
  }
}
