

/**********************************************************************
 *
 * $Id: kaQuery.js,v 1.9 2006/04/28 11:17:20 pspencer Exp $
 *
 * purpose: a simple tool for supporting queries.  It just provides
 *          the user interface for defining the query point or 
 *          area and defers the actual query to the application
 *
 * author: Paul Spencer (pspencer@dmsolutions.ca)
 *
 * TODO:
 * 
 *   - implement a sample backend for query code
 *
 **********************************************************************
 *
 * Copyright (c) 2005, DM Solutions Group Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 * DEALINGS IN THE SOFTWARE.
 *
 **********************************************************************
 *
 * To use this tool:
 * 
* 1) add a script tag to your page
 * 
 * <script type="text/javascript" src="kaQuery.js"></script>
 * 
 * 2) create a new instance of kaQuery
 * 
 * myKaQuery = new kaQuery( myKaMap, KAMAP_RECT_QUERY );
 * 
 * 3) provide some way of activating it.  This example would allow switching
 *    between querying and navigating.
 * 
 * <input type="button" name="navigate" value="Navigate"
 *  onclick="myKaNavigator.activate()">
 * <input type="button" name="query" value="Query"
 *  onclick="myKaQuery.activate()">
 * 
 * 4) listen for the query event 
 * 
 * myKaMap.registerForEvent( KAMAP_QUERY, null, myQuery );
 * 
 * 5) and do something when the user requests a query
 * 
 * function myQuery( eventID, queryType, coords )
 * {
 *     alert( "QUERY: " + queryType + " " + coords );
 * }
 * 
 * Querying actually does nothing except generate a KAMAP_QUERY event with 
 * the query type and coordinates passed as parameters to the event handler
 *
 * Signature of the query event handler is:
 *
 * function myQueryHandler( eventID, queryType, queryCoords )
 *
 * eventID: int, KAMAP_QUERY
 *
 * queryType: int, one of KAMAP_POINT_QUERY or KAMAP_RECT_QUERY
 *
 * queryCoords: array, array of two or four floating point coordinates
 *              depending on the query type
 *
 * You can affect the style of the zoom box by changing oQuery.domObj.style as
 * you would with any other HTML element (it's a div).
 *
 *****************************************************************************/

// the query event id
var KAMAP_QUERY = gnLastEventId ++;

// human names for the query types
var KAMAP_POINT_QUERY = 0;
var KAMAP_RECT_QUERY = 1;

/**
 * kaQuery constructor
 *
 * construct a new kaQuery object of a given type for a given kaMap instance
 *
 * oKaMap - a kaMap instance
 *
 * type - int, one of KAMAP_POINT_QUERY or KAMAP_RECT_QUERY.  If the type is
 *        KAMAP_POINT_QUERY then only point queries are allowed.  If the type
 *        is KAMAP_RECT_QUERY then point or rectangle queries are possible.
 */
function kaQuery( oKaMap, type ) {
    kaTool.apply( this, [oKaMap] );
    this.name = 'kaQuery';
    this.cursor = 'help';
    
    //this is the HTML element that is visible
    this.domObj = document.createElement( 'div' );
    this.domObj.style.position = 'absolute';
    this.domObj.style.top = '0px';
    this.domObj.style.left = '0px';
    this.domObj.style.width = '1px';
    this.domObj.style.height = '1px';
    this.domObj.style.zIndex = 100;
    this.domObj.style.visibility = 'hidden';
    this.domObj.style.border = '1px solid red';
    this.domObj.style.backgroundColor = 'white';
    this.domObj.style.opacity = 0.50;
    this.domObj.style.mozOpacity = 0.50;
    this.domObj.style.filter = 'Alpha(opacity=50)';
    this.kaMap.theInsideLayer.appendChild( this.domObj );

    this.startx = null;
    this.starty = null;
    this.endx = null;
    this.endy = null;
    this.bMouseDown = false;
    
    this.type = type;
    
    for (var p in kaTool.prototype) {
        if (!kaQuery.prototype[p])
            kaQuery.prototype[p]= kaTool.prototype[p];
    }
};

/*
 * draw a box representing the query region.
 *
 * kaQuery maintains the query region in four variables.  The variables are
 * assumed to be in pixel coordinates and are used to position the box.  If
 * any of the coordinates are null, clear the query box.
 */
kaQuery.prototype.drawZoomBox = function() {
    if (this.startx == null || this.starty == null ||
        this.endx == null || this.endy == null ) {
        this.domObj.style.visibility = 'hidden';
        this.domObj.style.top = '0px';
        this.domObj.style.left = '0px';
        this.domObj.style.width = '1px';
        this.domObj.style.height = '1px';
        return;
    }
    
    this.domObj.style.visibility = 'visible';
    if (this.endx < this.startx) {
        this.domObj.style.left = (this.endx - this.kaMap.xOrigin) + 'px';
        this.domObj.style.width = (this.startx - this.endx) + "px";
    } else {
        this.domObj.style.left = (this.startx - this.kaMap.xOrigin) + 'px';
        this.domObj.style.width = (this.endx - this.startx) + "px";
    }

    if (this.endy < this.starty) {
        this.domObj.style.top = (this.endy - this.kaMap.yOrigin) + 'px';
        this.domObj.style.height = (this.starty - this.endy) + "px";
    } else {
        this.domObj.style.top = (this.starty - this.kaMap.yOrigin) + 'px';
        this.domObj.style.height = (this.endy - this.starty) + "px";
    }
};

/**
 * kaQuery.onmouseout( e )
 *
 * called when the mouse leaves theInsideLayer.  Terminate the query
 *
 * e - object, the event object or null (in ie)
 */
kaQuery.prototype.onmouseout = function(e) {
    e = (e)?e:((event)?event:null);
    if (!e.target) e.target = e.srcElement;
    if (e.target.id == this.kaMap.domObj.id) {
        this.bMouseDown = false;
        this.startx = this.endx = this.starty = this.endy = null;
        this.drawZoomBox();
        return kaTool.prototype.onmouseout.apply(this, [e]);
    }
};

/**
 * kaQuery.onmousemove( e )
 *
 * called when the mouse moves over theInsideLayer.
 *
 * e - object, the event object or null (in ie)
 */
kaQuery.prototype.onmousemove = function(e) {
    e = (e)?e:((event)?event:null);
    
    if (!this.bMouseDown) {
        return false;
    }
    
    var x = e.pageX || (e.clientX +
          (document.documentElement.scrollLeft || document.body.scrollLeft));
    var y = e.pageY || (e.clientY +
                (document.documentElement.scrollTop || document.body.scrollTop));
    if (this.type == KAMAP_RECT_QUERY) {
        var aPixPos = this.adjustPixPosition( x, y );
        
        this.endx=-aPixPos[0];
        this.endy=-aPixPos[1];
        
        this.drawZoomBox();
    }
    return false;
}
;
/**
 * kaQuery.onmousedown( e )
 *
 * called when a mouse button is pressed over theInsideLayer.
 *
 * e - object, the event object or null (in ie)
 */
kaQuery.prototype.onmousedown = function(e) {
    e = (e)?e:((event)?event:null);
    if (e.button==2) {
        return this.cancelEvent(e);
    } else {
        if (this.kaMap.isIE4) document.onkeydown = kaTool_redirect_onkeypress;
        document.onkeypress = kaTool_redirect_onkeypress;
        
        this.bMouseDown=true;
        var x = e.pageX || (e.clientX +
              (document.documentElement.scrollLeft || document.body.scrollLeft));
        var y = e.pageY || (e.clientY +
                    (document.documentElement.scrollTop || document.body.scrollTop));
        var aPixPos = this.adjustPixPosition( x,y );
        this.startx=this.endx=-aPixPos[0];
        this.starty=this.endy=-aPixPos[1];
        
        this.drawZoomBox();
        
        e.cancelBubble = true;
        e.returnValue = false;
        if (e.stopPropogation) e.stopPropogation();
        if (e.preventDefault) e.preventDefault();
        return false;
    }
};

/**
 * kaQuery.onmouseup( e )
 *
 * called when a mouse button is clicked over theInsideLayer.
 *
 * e - object, the event object or null (in ie)
 */
kaQuery.prototype.onmouseup = function(e) {
    e = (e)?e:((event)?event:null);
    
    var type = KAMAP_POINT_QUERY;
    var start = this.kaMap.pixToGeo( -this.startx, -this.starty );
    
    var coords = start;
    if (this.startx!=this.endx&&this.starty!=this.endy) {
        type = KAMAP_RECT_QUERY;
        coords = start.concat(this.kaMap.pixToGeo( -this.endx, -this.endy ));
        if(coords[2] < coords[0]) {
            //minx gt maxx than I invert values
            var minx = coords[2];
            var maxx = coords[0];
            coords[0] = minx;
            coords[2] = maxx;
        }
        if(coords[1] < coords[3]){
            //miny gt maggiore than I invert values
            var miny = coords[1];
            var maxy = coords[3];
            coords[3] = miny;
            coords[1] = maxy;
        }
    }
    this.kaMap.triggerEvent(KAMAP_QUERY, type, coords);
    
    this.startx = this.endx = this.starty = this.endy = null;
    this.drawZoomBox();
        
    return false;
};



function kaMarca(oKaMap)
{
	kaTool.apply( this, [oKaMap] );
	
    this.name = 'kaMarca';

	this.cursor = "pointer";
	
	 for (var p in kaTool.prototype) {
        if (!kaMarca.prototype[p])
            kaMarca.prototype[p]= kaTool.prototype[p];
    }
	
}


kaMarca.prototype.onmousedown = function (e)
{
	var marcax = new Number(document.getElementById('coorX').innerHTML.replace('X:',''));
	var marcay = new Number(document.getElementById('coorY').innerHTML.replace('Y:',''));
	
	var resultado = document.getElementById('marcaOut');
	if(resultado != null)
	{
		var urlxerada = '';
		if ( window.location.href.indexOf('?') > -1)
		{
			urlxerada = window.location.href.substr( 0, window.location.href.indexOf('?') );
		}
		else
		{
			urlxerada = window.location.href;
		}
		
		urlxerada = urlxerada +'?X='+ marcax + '&Y=' + marcay;
		resultado.innerHTML = ""
			+ "<br /><p style='font-size: 8pt;' >O seguinte enlace dirixe ao punto seleccionado:</p>"
			+ "<p><table align='center' class='taboa'><tbody><tr  class=\"fila\" >"
			+ "<td class='filaDato' id='txtFicha'  colspan='2' style='padding:10px 10px 10px 10px;text-align:justify;' >"
			+ "<a href='" + urlxerada + "' >" + urlxerada + "</a>"
			+ "</td></tr></tbody></table></p><br />"
			+ "<hr /><p style='font-size: 8pt;' >Para engadir unha etiqueta ao punto marcado, substituir <i>textoDescripcion</i> no seguinte enlace polo texto desexado:</p>"
			+ "<p><table align='center' class='taboa'><tbody><tr  class=\"fila\" >"
			+ "<td class='filaDato' id='txtFicha'  colspan='2' style='padding:10px 10px 10px 10px;text-align:justify;' >"
			+ "<a href='" + urlxerada + "&NOM=" + myUrlEncode("textoDescripcion") + "' >" + urlxerada + "<br />&NOM="
				+ "textoDescripcion" + "</a>"
			+ "</td></tr></tbody></table></p>"
			+ "" ;
		
	}
}


/**********************************************************************
 * purpose: a structured legend that supports grouped layers, visibility,
 *          expand/collapse, and queryability
 * To use kaLegend:
 * 1) add a script tag to your page:
 * <script type="text/javascript" src="kaLegend.js"></script>
 * 2) add a <div> element to your page to contain the legend.  The div must
 *    have a unique id:
 *
 * <div id="legend"></div>
 * 3) create a new instance of kaLegend and pass it the id of the div:
 * myKaLegend = new kaLegend( 'legend' );
/******************************************************************************
 * oKaMap - the ka-Map object to attach to.
 * szID - string, the id of a div that will contain the legend
 * bStatic - boolean, true to use static legends, false to use dynamic legends
 *****************************************************************************/
function kaLegend(oKaMap, szID, bStatic, options) {
    this.kaMap = oKaMap;
    this.domObj = this.kaMap.getRawObject(szID);
    this.type = (bStatic)?'static':'dynamic';
    this.expanders = [];
    this.queryCBs = [];

    this.urlBase = this.kaMap.server;
    this.urlBase += (this.urlBase!=''&&this.urlBase.substring(-1)!='/')?'':'/';

    this.showQueryCBs = true;

    if (this.type == 'static') {
        this.domImg = document.createElement( 'img' );
        this.domImg.src = this.kaMap.aPixel.src;
        this.domObj.appendChild( this.domImg );
    } else {
        this.domObj.innerHTML = '&nbsp;';
    }
    this.showVisibilityControl = true;
    this.showQueryControl = true;
    this.showOpacityControl = true;
    this.showOrderControl = true;

    if (typeof options != 'undefined') {
        //this.showVisibilityControl = typeof options.visibility != 'undefined' ? options.visibility : true;
        this.showQueryControl = typeof options.query != 'undefined' ? options.query : true;
        this.showOpacityControl = typeof options.opacity != 'undefined' ? options.opacity : true;
        this.showOrderControl = typeof options.order != 'undefined' ? options.order : true;
    }

    this.kaMap.registerForEvent( KAMAP_SCALE_CHANGED, this, this.update );
    this.kaMap.registerForEvent( KAMAP_MAP_INITIALIZED, this, this.update );
    this.kaMap.registerForEvent( KAMAP_LAYERS_CHANGED, this, this.draw );
    this.kaMap.registerForEvent( KAMAP_LAYER_STATUS_CHANGED, this, this.update );
};

kaLegend.prototype.update = function(eventID)
{
    var url = '';
    if (this.type == 'static') {
        this.domImg.src = 'legend.php?map=' +
                          this.kaMap.currentMap +
                          '&scale='+this.kaMap.getCurrentScale();
    } else {
        if (eventID == KAMAP_MAP_INITIALIZED) {
            while(this.domObj.childNodes.length > 0) {
                this.domObj.removeChild(this.domObj.childNodes[0]);
            } this.draw();

        } else if (eventID == KAMAP_SCALE_CHANGED) {
            var oMap = this.kaMap.getCurrentMap();
            var aLayers = oMap.getAllLayers();
            var s = this.kaMap.getCurrentScale();
            for (var i in aLayers) {
                var oLayer = aLayers[i];
                var oImg = this.kaMap.getRawObject( 'legendImg_' + oLayer.name);

                if (oImg) {
                    //added by Lorenzo
                    var oParent = oImg.parentNode;
                    var tId = oImg.id;
                    //var tVisibility = oImg.visibility;
                    oParent.removeChild(oImg);
					//if (oLayer.name != 'Imaxe')
					//{
						oImg = document.createElement('img');
						oImg.id = tId;
						oImg.title = tId;
						//oImg.visibility = tVisibility;
						//oImg.src = 'legend.php?map=' + this.kaMap.currentMap + '&scale=' + s + '&g=' + oLayer.name;
						name = oLayer.name;
						if (name == '__base__') {
							name = 'Fondo';
						}
						oImg.src = 'images/' + name + '.png';
						if (navigator.appName == "Microsoft Internet Explorer")
							if (navigator.appVersion.indexOf('MSIE 7') < 0)
							{
								var srcAux = oImg.src;
								oImg.src = 'images/a_pixel.gif';
								oImg.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+ srcAux +"')";
							}
						oParent.appendChild(oImg);
					/*}
					else
					{
						var icono = document.createElement('DIV');
						icono.id = tId;
						icono.style.width = '15px';
						icono.style.height = '10px';
						icono.style.left = '6px';
						icono.style.top = '4px';
						icono.style.position = 'relative';
						icono.style.backgroundColor = '#22bb22';
						//div.style.textAlign = 'center';
						oParent.appendChild(icono);
					}     */
                    //expander = getRawObject('expander_'+oLayer.name);
                    //expander.expandable = oImg;
                    //expander.expanded = true;
                    //kaLegend_expander.apply( expander );
                }
                //added by cappu
                this.setOnOffLayer(oLayer);
            }
        } else if (eventID == KAMAP_LAYER_STATUS_CHANGED) {
			var layer = arguments[1];
			for (var i=0; i<this.queryCBs.length; i++) {
				if (this.queryCBs[i].oLayer == layer) {
					this.queryCBs[i].checked = layer.visible;
				}
			}
		}
    }
};

/**
 * legend.draw( szContents )
 *
 * render the contents of a legend template into a div
 */
kaLegend.prototype.draw = function() {

// CHAMADA ASINCRONA PARA OBTER LISTA DE CATEGORIAS
    window.parent.call('./vector_lenda.php',this, Crear_vector_lenda);

/*modificato da kappu non trova url corretto se non lo metto anche qui*/
    this.urlBase = this.kaMap.server;
    this.urlBase += (this.urlBase!=''&&this.urlBase.substring(-1)!='/')?'':'/';

    var oMap = this.kaMap.getCurrentMap();

    this.expanders = [];
    this.queryCBs = [];

    /* if (this.domObj.childNodes.length == 0) {
       this.domObj.appendChild(this.createHeaderHTML());
    } */
    this.createLayerHTML( '','Cartografía Base','1' );
    var aLayers = oMap.getAllLayers();
    for (var i=(aLayers.length-1);i>=0;i--) {
        if (aLayers[i].kaLegendObj == null) {
            this.createLayerHTML( aLayers[i],'','' );
        } else {
            try{this.domObj.removeChild( aLayers[i].kaLegendObj );}
            catch(e){};
        }
    }

    for (var i=(aLayers.length-1);i>=0;i--) {
        this.domObj.appendChild( aLayers[i].kaLegendObj );
    }

    if (this.kaMap.isIE4) {
        for(var i=0; i<this.queryCBs.length; i++) {
            this.queryCBs[i].checked = this.queryCBs[i].oLayer.visible;
        }
    }
      
    return;
};

function Crear_vector_lenda(texto_vector)
{
    var asXmlLayers = new Array();
    asXmlLayers= texto_vector.split("@@@");

    for (var i = 0; i < asXmlLayers.length; i++)
    {
       this.createLayerHTMLOverlay( asXmlLayers[i] );
    }
	                                                                                                                                                         
    var Layers_activas = getQueryParam('layers');
    Layers_activas = Layers_activas.split(",");
    var id_layer = null;
    for (var i = 0; i < Layers_activas.length; i++){  
        id_layer = Layers_activas[i];
        switch (id_layer){
        //"Alimentacion""C203""Aloxamento""C201""Areas_de_recreo""C113""Bares_restaurantes_e_pubs""C202""Castros""C105""Cruceiros""C106"
            case 'C203':
                Amosa_A_Capa('C203', 'Alimentacion', true);
                break;
            case 'C201':
                Amosa_A_Capa('C201', 'Aloxamento', true);
                break;
            case 'C113':
                Amosa_A_Capa('C113', 'Areas_de_recreo', true);
                break;
            case 'C202':
                Amosa_A_Capa('C202', 'Bares_restaurantes_e_pubs', true);
                break;
            case 'C105':
                Amosa_A_Capa('C105', 'Castros', true);
                break;
            case 'C106':
                Amosa_A_Capa('C106', 'Cruceiros', true);
                break;
            //"Edificios_civis""C102""Edificios_relixiosos""C101""Escudos""C108""Faros""C112""Fontes_lavadoiros_e_muiños""C110""Horreos""C107"
            case 'C102':
                Amosa_A_Capa('C102', 'Edificios_civis', true);
                break;
            case 'C101':
                Amosa_A_Capa('C101', 'Edificios_relixiosos', true);
                break;
            case 'C108':
                Amosa_A_Capa('C108', 'Escudos', true);
                break;
            case 'C112':
                Amosa_A_Capa('C112', 'Faros', true);
                break;
            case 'C110':
                Amosa_A_Capa('C110', 'Fontes_lavadoiros_e_muiños', true);
                break;
            case 'C107':
                Amosa_A_Capa('C107', 'Horreos', true);
                break;                
                //"Museos""C103""Outros""C204""Pombais""C109""Praias""C104""Servicios_Municipais""C301""Servicios_Turisticos""C302"
            case 'C103':
                Amosa_A_Capa('C103', 'Museos', true);
                break;
            case 'C204':
                Amosa_A_Capa('C204', 'Outros', true);
                break;
            case 'C109':
                Amosa_A_Capa('C109', 'Pombais', true);
                break;
            case 'C104':
                Amosa_A_Capa('C104', 'Praias', true);
                break;
            case 'C301':
                Amosa_A_Capa('C301', 'Servicios_Municipais', true);
                break;
            case 'C302':
                Amosa_A_Capa('C302', 'Servicios_Turisticos', true);
                break;
        }
    }
/* 17-09-2009 comento o seguinte ao non saber de que vai nen para que sirbe. */
  /*  var paramLayers = getQueryParam('layers');
	if(paramLayers == 'Ortofoto,C005')
	{
		Amosa_A_Capa('C005', 'Actividades', true);
		Amosa_A_Capa('C006', 'Tabernas_e_mesons', true);
	}   */
	if (Layers_activas.length > 0){
		myZoomIn();
		myZoomOut();
	}
}

function cbAmosa_A_CapaOverlay()
{

      Amosa_A_Capa(this.oIdCapa, this.value, this.checked );
}

kaLegend.prototype.createLayerHTMLOverlay = function( nomXmlLayer_maisId ) {
    var d, t, tb, tr, td, expander, cb, img, name;

    name =nomXmlLayer_maisId.split("|||")[0];
    codigo =  nomXmlLayer_maisId.split("|||")[1];
    ///////////////// DIV Exterior
    d = document.createElement( 'div' );
    d.id = 'group_' + name;
    if (codigo != "Lenda"){
        d.className = "fila";
		d.style.width = '290px';
		d.style.margin = '0px 0px 0px 5px ';
    }
	else
	{
		 d.style.width = '300px';
	}
    d.style.paddingLeft = '2pt';
    d.style.paddingRight = '2pt';
	
   
    d.style.borderWidth = '2px';
    d.style.borderColor = '#ffffff';
    d.style.borderStyle = 'solid';

    d.nomXmlLayer=name;

     if (name == '__base__') {
       d.style.visibility = 'hidden';
       d.style.position = 'absolute';
       d.style.top = '0px';  d.style.left = '0px';
    }

    //////////////////// TABLE con 1 só fila
    t = document.createElement('table');
    t.setAttribute('width','100%');
    t.setAttribute('cellPadding', "0");
    t.setAttribute('cellSpacing', "0");
    t.setAttribute('border', "0");

    tb = document.createElement( 'tbody' );
    tr = document.createElement('tr');

    if (codigo != "Lenda"){
        ///////////////// TD para o checkbox
        if (this.showVisibilityControl) {
            td = document.createElement('td');
            td.width = '22px';
            td.style.textAlign = 'left';
            if (true) {
                cb = document.createElement( 'input' );
                cb.type = 'checkbox';
                

                
                var nome = nomXmlLayer_maisId.split("|||")[0];
                var id = nomXmlLayer_maisId.split("|||")[1];

                
       
		nome = nome.split(' ').join('_');
		nome = nome.split(',').join(''); 
		nome = nome.split('á').join('a'); 
		nome = nome.split('é').join('e'); 
		nome = nome.split('í').join('i'); 
		nome = nome.split('ó').join('o'); 
		nome = nome.split('ú').join('u'); 
		nome = nome.split('ü').join('u'); 
		nome = nome.split('ñ').join('nh'); 
		nome = nome.split('Á').join('A');  
		nome = nome.split('É').join('E');  
		nome = nome.split('Í').join('I');  
		nome = nome.split('Ó').join('O');  
		nome = nome.split('Ú').join('U'); 
		nome = nome.split('Ñ').join('NH'); 
		
               /* var salida = "NO_OK";
                var nome_temp = "";
                while(salida == "NO_OK"){
                    nome_temp = nome;
                    nome = nome.replace(' ','_')
                            .replace(',', '')
                            .replace('�', 'a')
                            .replace('�', 'e')
                            .replace('�', 'i')
                            .replace('�', 'o')
                            .replace('�', 'u')
                            .replace('�', 'A')
                            .replace('�', 'E')
                            .replace('�', 'I')
                            .replace('�', 'O')
                            .replace('�', 'U')
                    if (nome == nome_temp){
                         salida = "OK";
                    }
                }*/
                cb.name = nome;
                cb.value = nome;
                cb.checked = false;
                cb.kaLegend = this;
                cb.oLayer = nome;
                cb.oIdCapa = id;
                cb.onclick = cbAmosa_A_CapaOverlay;;

                td.appendChild( cb );
            }
            else {
                td.innerHTML = '&nbsp;';
            }
            tr.appendChild(td);
        }
    
        var oMap = this.kaMap.getCurrentMap();
        var aLayers = oMap.getAllLayers();

        /////// TD co nome da capa
        td = document.createElement('td');
        td.width = '150px';
        td.style.textAlign = 'left';
        td.style.paddingLeft = '10px';

        var div = document.createElement('DIV');
        div.style.width = '25px';
        div.style.overflow = 'hidden';

        var texto = document.createElement('SPAN');
        texto.style.position = 'relative';
        texto.style.left = '10px';
        if (codigo != "Lenda"){
            texto.style.fontSize = '11px';  
            //texto.style.color = '#99252C'; 
            }
        else{ 
            texto.style.fontSize = '17px';                        
            texto.style.color = '#99252C'; 
            //texto.font-weight = 'bold';
        }
        texto.appendChild(document.createTextNode(name));
        texto.style.top = '4px'; 
    
        td.appendChild(div);


        if (navigator.appName == "Microsoft Internet Explorer")
        {
            div.style.styleFloat = 'left';
            texto.style.styleFloat = 'left';
        }
        else
        {
            div.style.cssFloat = 'left';
            texto.style.cssFloat = 'left';
        }

        td.appendChild(texto);

        tr.appendChild(td);


        td = document.createElement('td');
        td.width = '50px';
        td.style.textAlign = 'left';
        td.style.paddingTop = '3px';
        td.style.paddingBottom = '3px';
        tr.appendChild(td);
     
    
       
        td = document.createElement( 'td' );
        
        var cadena_imaxen = name;
        cadena_imaxen = cadena_imaxen.split(' ').join('');
        cadena_imaxen = cadena_imaxen.split('á').join('a'); 
        cadena_imaxen = cadena_imaxen.split('é').join('e'); 
        cadena_imaxen = cadena_imaxen.split('í').join('i'); 
        cadena_imaxen = cadena_imaxen.split('ó').join('o'); 
        cadena_imaxen = cadena_imaxen.split('ú').join('u'); 
        cadena_imaxen = cadena_imaxen.split('ü').join('u'); 
        cadena_imaxen = cadena_imaxen.split('ñ').join('nh'); 
        cadena_imaxen = cadena_imaxen.split('Á').join('A');  
        cadena_imaxen = cadena_imaxen.split('É').join('E');  
        cadena_imaxen = cadena_imaxen.split('Í').join('I');  
        cadena_imaxen = cadena_imaxen.split('Ó').join('O');  
        cadena_imaxen = cadena_imaxen.split('Ú').join('U'); 
        cadena_imaxen = cadena_imaxen.split('Ñ').join('NH');   
        cadena_imaxen = cadena_imaxen.substr(0,15);
              
        td.innerHTML = '<img src="images/iconos/'
                     + cadena_imaxen
                     + '.gif" />' ;              
        tr.appendChild(td); 
    }
    else{ 
        td = document.createElement('td');
        td.className = "cabecera";
        td.colspan = "3";
            var capa_1 = document.createElement('DIV');
            capa_1.id = "tituloCen";
                var capa_2 = document.createElement('DIV');
                capa_2.id = "tituloDer";
                    var capa_3 = document.createElement('DIV');
                    capa_3.id = "tituloEsq";
                    capa_3.style.paddingLeft = '5px';
                    capa_3.style.paddingTop = '2px';
                    capa_3.style.Color = 'white';
                    capa_3.style.fontWeight = 'bold';
                    capa_3.innerHTML = name;
                capa_2.appendChild(capa_3);
            capa_1.appendChild(capa_2);
        td.appendChild(capa_1);
        tr.appendChild(td); 
    }
    tb.appendChild(tr);
    t.appendChild( tb );
    d.appendChild(t);


 //   tr.appendChild(td);
    //td.style.visibility = 'hidden';

    this.domObj.appendChild( d);


};




kaLegend.prototype.createHeaderHTML = function() {
    var d, t, tb, tr, td, img;

};

kaLegend.prototype.createLayerHTML = function( oLayer, titulo, codigo ) {
    var d, t, tb, tr, td, expander, cb, img, name; 
    if (codigo == ""){ 
        name = oLayer.name;
        ///////////////// DIV Exterior
        d = document.createElement( 'div' );
        d.id = 'group_' + name;
        d.className = "fila";
        d.style.paddingLeft = '2pt';
        d.style.paddingRight = '2pt';
        d.style.width = '290px';
		d.style.margin = '0px 0px 0px 5px';
        d.style.borderWidth = '2px';
        d.style.borderColor = '#ffffff';
        d.style.borderStyle = 'solid';

        d.oLayer=oLayer; 
    }
    else{
        name =  titulo;
        ///////////////// DIV Exterior
        d = document.createElement( 'div' );
        d.id = 'group_' + name; 
        d.style.paddingLeft = '2pt';
        d.style.paddingRight = '2pt';
        d.style.width = '300px';
        d.style.borderWidth = '2px';
        d.style.borderColor = '#ffffff';
        d.style.borderStyle = 'solid';

        d.nomXmlLayer=name;
    }                          

     if (name == '__base__') {
       d.style.visibility = 'hidden';
       d.style.position = 'absolute';
       d.style.top = '0px';  d.style.left = '0px';
    }

    //////////////////// TABLE con 1 s� fila
    t = document.createElement('table');
    t.setAttribute('width','100%');
    t.setAttribute('cellPadding', "0");
    t.setAttribute('cellSpacing', "0");
    t.setAttribute('border', "0");

    tb = document.createElement( 'tbody' );
    tr = document.createElement('tr');

    if (codigo == ""){
        ///////////////// TD para o checkbox
        if (this.showVisibilityControl) {
            td = document.createElement('td');
            td.width = '22px';
		    td.style.textAlign = 'left';
            if ((oLayer.name != '__base__')) {
                cb = document.createElement( 'input' );
                cb.type = 'checkbox';
                var nome =  oLayer.name;
		
		nome = nome.split(' ').join('_');
		nome = nome.split(',').join(''); 
		nome = nome.split('á').join('a'); 
		nome = nome.split('é').join('e'); 
		nome = nome.split('í').join('i'); 
		nome = nome.split('ó').join('o'); 
		nome = nome.split('ú').join('u'); 
		nome = nome.split('ü').join('u'); 
		nome = nome.split('ñ').join('nh'); 
		nome = nome.split('Á').join('A');  
		nome = nome.split('É').join('E');  
		nome = nome.split('Í').join('I');  
		nome = nome.split('Ó').join('O');  
		nome = nome.split('Ú').join('U'); 
		nome = nome.split('Ñ').join('NH'); 
		/*
                var salida = "NO_OK";
                var nome_temp = "";
                while(salida == "NO_OK"){
                    nome_temp = nome;
                    nome = nome.replace(' ','_')
                            .replace(',', '')
                            .replace('�', 'a')
                            .replace('�', 'e')
                            .replace('�', 'i')
                            .replace('�', 'o')
                            .replace('�', 'u')
                            .replace('�', 'A')
                            .replace('�', 'E')
                            .replace('�', 'I')
                            .replace('�', 'O')
                            .replace('�', 'U')
                    if (nome == nome_temp){
                         salida = "OK";
                    }
                }*/
                cb.name = nome;
                cb.value = oLayer.name;
                cb.checked = oLayer.visible;
                cb.kaLegend = this;
                cb.oLayer = oLayer;
                cb.onclick = kaLegend_toggleLayerVisibility;

			    if (nome == 'Rueiro')
			    {
				    cb.id = "checkboxRueiro";
			    }
			    
                this.queryCBs.push(cb);
                td.appendChild( cb );
            }
            else {
                td.innerHTML = '&nbsp;';
            }
            tr.appendChild(td);
        }
        ///////////////////////////////// fin td con checkbox.
     
	    var oMap = this.kaMap.getCurrentMap();
        var aLayers = oMap.getAllLayers();

	    /////// TD co nome da capa
	    td = document.createElement('td');
        td.width = '150px';
	    td.style.textAlign = 'left';
	    td.style.paddingLeft = '10px';

	    var div = document.createElement('DIV');
	    div.style.width = '25px';
	    div.style.overflow = 'hidden';

        var texto = document.createElement('SPAN');
	    texto.style.position = 'relative';
        texto.style.fontSize = '11px';  
        //texto.style.color = '#99252C'; 
        
	    texto.appendChild(document.createTextNode(name));
	    texto.style.top = '4px'; 

	    td.appendChild(div);


	    if (navigator.appName == "Microsoft Internet Explorer")
	    {
		    div.style.styleFloat = 'left';
		    texto.style.styleFloat = 'left';
	        }
	        else
	    {
		    div.style.cssFloat = 'left';
		    texto.style.cssFloat = 'left';
	    }

	    td.appendChild(texto);

	    tr.appendChild(td);
   
        if (aLayers.length > 1) {
            /////////////// TD con control de opacidade
            if (this.showOpacityControl) {

                td = document.createElement('td');
                td.width = '50px';
			    td.style.textAlign = 'left';
			    td.style.paddingTop = '3px';
			    td.style.paddingBottom = '3px';

			    var capa = document.createElement('DIV');
			    capa.id = 'opacidade_' + oLayer.name;
			    capa.style.position = 'relative';
			    capa.style.height = '15px';
			    capa.style.width = '22px';
			    capa.style.backgroundColor = '#ffffff';
			    capa.style.borderColor = '#003090';
			    capa.style.borderWidth = '1px';
			    capa.style.borderStyle = 'solid';
			    capa.style.paddingRight = '2px';
			    capa.style.textAlign = 'right';
			    if (navigator.appName == "Microsoft Internet Explorer")
				    capa.style.styleFloat = 'right';
			    else
				    capa.style.cssFloat = 'right';
			    capa.innerHTML = '100';
			    td.appendChild( capa );


                img = document.createElement( 'img' );
                img.src = 'images/sun_white.png';
                img.width = '7';
                img.alt = "Disminuir a opacidade da capa";
                img.title = "Disminuir a opacidade da capa";
                img.style.cursor ='pointer';
                img.kaLegend = this;
                img.oLayer = oLayer;
                img.onclick = kaLegend_opacityDown;
                td.appendChild( img );

                img = document.createElement( 'img' );
                img.src = 'images/sun_grey.png';
                img.width = '7';
                img.style.marginLeft = '2px';
                img.alt = "Incrementar a opacidade da capa";
                img.title = "Incrementar a opacidade da capa";
                img.style.cursor ='pointer';
                img.kaLegend = this;
                img.oLayer = oLayer;
                img.onclick = kaLegend_opacityUp;
                td.appendChild( img );

                tr.appendChild(td);


            }
        }    //  FIN de if (aLayers.length > 1) // TD con control de opacidade
    
        td = document.createElement( 'td' );  
        td.innerHTML = name;
        tr.appendChild(td);
        tb.appendChild(tr);

        t.appendChild( tb );
        d.appendChild(t);


        tr.appendChild(td);   
        
	    td.style.visibility = 'hidden'; 
        oLayer.kaLegendObj = d; 
	    this.setOnOffLayer(oLayer,oLayer.isVisible);
    }
    else{ 
        td = document.createElement('td');
        td.className = "cabecera";
        td.colspan = "3";
            var capa_1 = document.createElement('DIV');
            capa_1.id = "tituloCen";
                var capa_2 = document.createElement('DIV');
                capa_2.id = "tituloDer";
                    var capa_3 = document.createElement('DIV');
                    capa_3.id = "tituloEsq";
                    capa_3.style.paddingLeft = '5px';
                    capa_3.style.paddingTop = '2px';
                    capa_3.style.Color = 'white';
                    capa_3.style.fontWeight = 'bold';
                    capa_3.innerHTML = name;
                capa_2.appendChild(capa_3);
            capa_1.appendChild(capa_2);
        td.appendChild(capa_1);
        tr.appendChild(td);            
        
        tb.appendChild(tr);

        t.appendChild( tb );
        d.appendChild(t); 
    
        this.domObj.appendChild( d);
    }
};

function kaLegend_toggleLayerQueryable() {
    this.kaLegend.kaMap.setLayerQueryable( this.value, this.checked );
};

function kaLegend_queryOnMouseOver() {
    if (this.oLayer.queryable) {
        this.src = 'images/icon_query_over.png';
    }
};

function kaLegend_queryOnMouseOut() {
    if (this.oLayer.queryable) {
        if (this.oLayer.isQueryable()) {
            this.src = 'images/icon_query_on.png';
        } else {
            this.src = 'images/icon_query_off.png';
        }
    }
};

function kaLegend_queryOnClick() {
    if (this.oLayer.queryable) {
        if (this.oLayer.isQueryable()) {
            this.oLayer.setQueryable( false );
            this.src = 'images/icon_query_off.png';
        } else {
            this.oLayer.setQueryable( true );
            this.src = 'images/icon_query_on.png';
        }
    }
};

function kaLegend_toggleLayerVisibility() {
    this.kaLegend.kaMap.setLayerVisibility( this.value, this.checked );
};

function kaLegend_expander() {
    this.expanded = !this.expanded;

    this.src = (this.expanded)?'images/collapse.png':'images/expand.png';
    this.expandable.style.display = (this.expanded)?'block':'none';
};

function kaLegend_expandAll() {
    var kaLeg = this.kaLegend;
    for (var i=0; i<kaLeg.expanders.length; i++) {
        kaLeg.expanders[i].expanded = false;
        kaLegend_expander.apply( kaLeg.expanders[i] );
    }
};

function kaLegend_collapseAll() {
    var kaLeg = this.kaLegend;
    if (kaLeg.expanders) {
        for (var i=0; i<kaLeg.expanders.length; i++) {
            kaLeg.expanders[i].expanded = true;
            kaLegend_expander.apply( kaLeg.expanders[i] );
        }
    }
};


function kaLegend_opacityDown() {
    var opc;
    opc=this.oLayer.opacity-10;

	if (opc < 0)
		opc = 0;

	document.getElementById('opacidade_' + this.oLayer.name).innerHTML = opc;

    this.kaLegend.kaMap.setLayerOpacity(this.oLayer.name, opc );
};

function kaLegend_opacityUp() {
    var opc;
    opc=this.oLayer.opacity+10;

	if (opc > 100)
		opc = 100;

	document.getElementById('opacidade_' + this.oLayer.name).innerHTML = opc;

    this.kaLegend.kaMap.setLayerOpacity(this.oLayer.name, opc );
};

/*added by cappu used to hide layer not visible at current scala*/
kaLegend.prototype.setOnOffLayer = function(l) {
    if (l.isVisible()) {
        if (l.kaLegendObj) {
            l.kaLegendObj.style.display='block';
        }
    } else {
        if(l.kaLegendObj) {
            l.kaLegendObj.style.display='none';
        }
    }
};

/**
* kaLegend_moveLayerDown
* About a specific Group of layer, it moves the corresponding Legend div and
*  the Viewport div to the next one
* @private
* @author Lorenzo Becchi
*/

function kaLegend_moveLayerDown() {
    var myLayer= this.oLayer;
    var leg=this.myDiv.parentNode;
    var myDiv = this.myDiv;
    var lowerDiv = findLowerDiv(myDiv);

    if(lowerDiv && lowerDiv.className=='kaLegendLayer') {
        //search correspondant checbox to prevent IE uncheck on move bug
        var aCheckbox = document.getElementsByTagName('input');
        var checkboxStatusUp=null;
        var checkboxStatusDown=null;
        var checkboxUp=null;
        var checkboxDown=null;
        for(var i=0;i<aCheckbox.length;i++) {
            var inputTag = aCheckbox[i];
            if(inputTag.value == myDiv.id.replace(/\bgroup_/, '')) {
                checkboxUp = inputTag;
                checkboxStatusUp = checkboxUp.checked;
            }
            if(inputTag.value == lowerDiv.id.replace(/\bgroup_/, '')) {
                checkboxDown =inputTag;
                checkboxStatusDown = inputTag.checked;
            }
        }

        // move legend group div  (need to do it two allow hidden layers syncing)
        var proxyMy = myDiv.cloneNode(true);
        var proxyLower = lowerDiv.cloneNode(true);
        myDiv.parentNode.insertBefore( proxyMy , myDiv );
        myDiv.parentNode.insertBefore( proxyLower , lowerDiv );
        myDiv.parentNode.replaceChild( lowerDiv , proxyMy );
        myDiv.parentNode.replaceChild( myDiv , proxyLower );

        //confirm checbox status to prevent IE uncheck on move bug
        if(checkboxUp)checkboxUp.checked = checkboxStatusUp;
        if(checkboxDown)checkboxDown.checked = checkboxStatusDown;

		//added by cappu,set zindex order of div layer in vieport
		for  (i=0,n=leg.childNodes.length;i< leg.childNodes.length;i++) {
			var child= leg.childNodes[i];
			if(child && child.className=='kaLegendLayer') {
				child.oLayer.zIndex=(n);
				n--;
			}
		}

		//call function to redrow
		this.kaLegend.kaMap.setMapLayers();
    } else {
        alert('this layer can\'t go farther down');
    }
};

/**
 * kaLegend_moveLayerUp
 * About a specific Group of layer, it moves the corresponding Legend div and
 * the  Viewport div to the previous one
 * @private
 * @author Lorenzo Becchi
 */
function kaLegend_moveLayerUp() {
    var myLayer= this.oLayer;
    var leg=this.myDiv.parentNode;
    var myDiv = this.myDiv;
    var upperDiv = findUpperDiv(myDiv);

     if(upperDiv && upperDiv.className=='kaLegendLayer') {
        //search correspondant checbox to prevent IE uncheck on move bug
        var aCheckbox = document.getElementsByTagName('input');
        var checkboxStatusUp=null;
        var checkboxStatusDown=null;
        var checkboxUp=null;
        var checkboxDown=null;
        for(var i=0;i<aCheckbox.length;i++) {
            var inputTag = aCheckbox[i];
            if(inputTag.value == upperDiv.id.replace(/\bgroup_/, '')) {
                checkboxUp = inputTag;
                checkboxStatusUp = checkboxUp.checked;
            }
            if(inputTag.value == myDiv.id.replace(/\bgroup_/, '')) {
                checkboxDown =inputTag;
                checkboxStatusDown = inputTag.checked;
            }
        }

        // switch legend groups div (need to do it two allow hidden layers syncing)
        var proxyMy = myDiv.cloneNode(true);
        var proxyUpper = upperDiv.cloneNode(true);
        myDiv.parentNode.insertBefore( proxyMy , myDiv );
        myDiv.parentNode.insertBefore( proxyUpper , upperDiv );
        myDiv.parentNode.replaceChild( upperDiv , proxyMy );
        myDiv.parentNode.replaceChild( myDiv , proxyUpper );

        //confirm checbox status to prevent IE uncheck on move bug
        if(checkboxUp)checkboxUp.checked = checkboxStatusUp;
        if(checkboxDown)checkboxDown.checked = checkboxStatusDown;

		//added by cappu,set zindex order of div layer in vieport
		for  (i=0,n=leg.childNodes.length;i< leg.childNodes.length;i++) {
		    var child= leg.childNodes[i];
		    if(child && child.className=='kaLegendLayer') {
				child.oLayer.zIndex=(n);
				n--;
			}
		}
		//call function to redrow
		this.kaLegend.kaMap.setMapLayers();
    } else {
        alert('esta capa non pode ir máis para enriba');
    }
};

/**
* findLowerDiv
* find recursively nextSibling in legend list
* @private
* @author Lorenzo Becchi
*/
function findLowerDiv(div) {
	lDiv = div.nextSibling;
	if(lDiv && lDiv.className=='kaLegendLayer' && lDiv.style.display=='none') {
		findLowerDiv(lDiv);
	}
	return lDiv;
};
/**
* findUpperDiv
* find recursively previousSibling in legend list
* @private
* @author Lorenzo Becchi
*/
function findUpperDiv(div){
	uDiv = div.previousSibling;
	if(uDiv && uDiv.className=='kaLegendLayer' && uDiv.style.display=='none'){
		findUpperDiv(uDiv);
	}
	return uDiv;
}

// JavaScript Document
 function Array_de_novascapas ( nome){
    this.Nome = nome;
    this.Activa = false; // ando creamos o elemento  para estar activo.
}

function mostrarInfo(aTag)
{
  var txtt='';
	for (var i = 0; i<aTag.childNodes.length;i++)
	{
		if (aTag.childNodes[i].tagName == 'SPAN')
		{
			txtt = aTag.childNodes[i].firstChild.nodeValue;
		}
	}
  var iid = txtt.split("###")[0];
  var xx = txtt.split("###")[1];
  var yy = txtt.split("###")[2];
  var tipo = txtt.split("###")[3];
  var oNome = txtt.split("###")[4];

  var capa_a_amosar = tipo.replace(" ", "_"); //Sustituimos calquera espazo en branco por un subrraiado para utilizar o nome da capa coma ID no array.
  var N_capa = -1;
  var Si_non_amosar = false;

  if (tipo != 'C004')
  {
	for( var i = 0; i< window.parent.Array_XmlOverlay_activos.length; i++){
       if (  window.parent.Array_XmlOverlay_activos[i].oId == capa_a_amosar ){
            N_capa = i;
            Si_non_amosar = window.parent.Array_XmlOverlay_activos[i].Activa;
       }
	}
	if(N_capa == -1) // En caso de que a direccin do array de XmlOverlay non exista, a creamos e a cargamos cun novo obxecto en branco.
	{
        window.parent.Array_XmlOverlay_activos[i] = new Array_de_novascapas(capa_a_amosar);
	}
  }
  else
  {
	 var checkboxRueiro = window.parent.document.getElementById('checkboxRueiro');
	 Si_non_amosar = checkboxRueiro.checked;
  }

  
  window.parent.call('ficha.php?si_non='+ Si_non_amosar +'&idFicha='+iid,this, amosarFicha);
	
  if (isNaN(parseInt(xx)) || isNaN(parseInt(yy)))
  {
	alert("Erro ao acceder coordenadas xeogrficas de" + oNome 
		+"\nNon se puido localizar elemento no mapa.");
  }
  else
  {
     window.parent.ponherChincheta(xx,yy,iid,oNome);
     window.parent.centrarMapa(parseInt(xx),parseInt(yy));
  }
  
  
	
}


function amosaFichaInicio()
{
	window.parent.call("Informacion/info.html",this,amosarInfo);	
}


/*********************************************************************
 */
function mostrarInfoMapa(aTag)
{
	var oId; var oIdCategoria;
	for (var i = 0; i<aTag.childNodes.length;i++)
	{
		if (aTag.childNodes[i].tagName == 'SPAN')
		{
			oId = aTag.childNodes[i].firstChild.nodeValue.split('@@@')[0];
			oIdCategoria = aTag.childNodes[i].firstChild.nodeValue.split('@@@')[1];
		}
	}
	
	mostrarInfoMapaById(oId, oIdCategoria);
}

function mostrarInfoMapaById(oId, tipo)
{
  var capa_a_amosar = tipo.replace(" ", "_"); //Sustituimos calquera espazo en branco por un subrraiado para utilizar o nome da capa coma ID no array.
  
  var N_capa = -1;
  var Si_non_amosar = false;

  if (tipo != 'C004')
  {
	for( var i = 0; i< window.parent.Array_XmlOverlay_activos.length; i++){
       if (  window.parent.Array_XmlOverlay_activos[i].oId == capa_a_amosar ){
            N_capa = i;
            Si_non_amosar = window.parent.Array_XmlOverlay_activos[i].Activa;
       }
	}
	if(N_capa == -1) // En caso de que a direccin do array de XmlOverlay non exista, a creamos e a cargamos cun novo obxecto en branco.
	{
        window.parent.Array_XmlOverlay_activos[i] = new Array_de_novascapas(capa_a_amosar);
	}
  }
  else
  {
	 var checkboxRueiro = window.parent.document.getElementById('checkboxRueiro');
	 Si_non_amosar = checkboxRueiro.checked;
  }

  
  window.parent.call('ficha.php?si_non='+ Si_non_amosar +'&idFicha='+oId,this, amosarFicha);
	
}



function esEntero(valor)
{
	if(valor.length == 0)
		return false;
	if(!isNaN(valor))
	{
        for(var i = 0; i<valor.length;i++)
		{
            if(valor.charCodeAt(i)<48 || valor.charCodeAt(i)>57)
                return false;
        }
        }else
		{
            return false;
        }
        return true;
    }

function amosarFicha(html)
{

	var mapInfo = window.parent.document.getElementById('mapInfo');
	mapInfo.innerHTML = html;
	mapInfo.scrollTop = 0;

	//var XUTM = window.parent.document.getElementById('celdaXUTM').innerHTML;
	//var YUTM = window.parent.document.getElementById('celdaYUTM').innerHTML;
//	var idFonte = window.parent.document.getElementById('capaCorpo').className;

	if (/*html.indexOf('Fonte')>0*/ true)
	{
		if (window.parent.document.getElementById('mapInfo').style.visibility == 'hidden')
			window.parent.switchService('toolMapinfo');

		window.parent.document.getElementById('opcionMediaPantalla').style.visibility = 'visible';

		var content = window.parent.document.getElementById('content');
		if (parseInt(content.style.height) > 0)
		{
			var contentText = window.parent.document.getElementById('contentText');
			contentText.innerHTML = html;
		}
		if (window.parent.document.getElementById('botondelarisa')!= null)
			window.parent.document.getElementById('botondelarisa').click();


	}
	else
	{
		mapInfo.innerHTML = "";
		
	}

window.parent.document.getElementById('opcionMediaPantalla').style.visibility = 'hidden';
}

function amosarInfo(html)
{
	var mapInfo = window.parent.document.getElementById('mapInfo');
	mapInfo.innerHTML = html;
	mapInfo.scrollTop = 0;

	if (window.parent.document.getElementById('mapInfo').style.visibility == 'hidden')
		window.parent.switchService('toolMapinfo');

	window.parent.document.getElementById('opcionMediaPantalla').style.visibility = 'visible';

	var content = window.parent.document.getElementById('content');
	if (parseInt(content.style.height) > 0)
	{
		var contentText = window.parent.document.getElementById('contentText');
		contentText.innerHTML = html;
	}
}

function expandeContrae(obj)
{
	var ulTag = obj.parentNode.getElementsByTagName('UL')[0];

	if (ulTag != null)
	{
		//La primera vez tiene que encontrar el estilo en la hoja css
		if ((ulTag.style.display == ''))
		{
			ulTag.style.display = obtenerEstilo('arboreNavegacion UL','display');
		}


		if (ulTag.style.display.indexOf('none') >= 0)
		{
		
			ulTag.style.display = 'block';
            if( obj.tagName != 'IMG' )
			{
                obj.previousSibling.previousSibling.src = obj.previousSibling.previousSibling.src.replace('expand','collapse');
            }
			else
			{
				if(obj.src.indexOf('iconos') >= 0)
				{
					obj.previousSibling.src = obj.previousSibling.src.replace('expand','collapse');
				}
			    obj.src = obj.src.replace('expand','collapse');
			}
		}
		else
		{		
			ulTag.style.display = 'none';
			if( obj.tagName != 'IMG' )
			{
                obj.previousSibling.previousSibling.src = obj.previousSibling.previousSibling.src.replace('collapse','expand');
				}
            else
			{
				if(obj.src.indexOf('iconos') >= 0)
				{
					obj.previousSibling.src = obj.previousSibling.src.replace('collapse','expand');
				}
				obj.src = obj.src.replace('collapse','expand');
			}
		}
	}
	
}

function obtenerEstilo(clase,estilo)
{
	estilo = estilo.toUpperCase();
	clase = clase.toUpperCase();
	var retorno = null;
	if (navigator.appName == "Microsoft Internet Explorer")
	{
		for(var r=0;r<document.styleSheets.length;r++)
		{
			for(var w=0;w<document.styleSheets[r].rules.length;w++)
			{
				if(document.styleSheets[r].rules[w].selectorText.substr(1).toUpperCase()==clase)
				{
					for(var s=0;s<document.styleSheets[r].rules[w].style.cssText.split(';').length;s++)
					{
						if(document.styleSheets[r].rules[w].style.cssText.split(';')[s].split(':')[0].replace(' ','')==estilo)
						{
							retorno = document.styleSheets[r].rules[w].style.cssText.split(';')[s].split(':')[1].replace(' ','');
							return retorno;
						}
					}
				}
			}
		}
	}
	else
	{
		for(var r=0;r<document.styleSheets.length;r++)
		{
			for(var w=0;w<document.styleSheets[r].cssRules.length;w++)
			{
				if(document.styleSheets[r].cssRules[w].selectorText.substr(1).toUpperCase()==clase)
				{
					for(var s=0;s<document.styleSheets[r].cssRules[w].style.cssText.split(';').length;s++)
					{
						if(document.styleSheets[r].cssRules[w].style.cssText.split(';')[s].split(':')[0].replace(' ','').toUpperCase()==estilo)
						{
							retorno = document.styleSheets[r].cssRules[w].style.cssText.split(';')[s].split(':')[1].replace(' ','');
							return retorno;
						}
					}
				}
			}
		}
	}
}




 /******************************************************************************
 * Para personalizar startUp:
 * 1) Modificar toolbar Layout
 *  Co ficheiro screen.css modificar a función myMapInitialized().
 *  Se cambio pan e identificadores de imaxe, editar switchMode() tamén.
 *****************************************************************************/

var myKaMap = myKaNavigator = myKaQuery = myKaKeymap = myScalebar = chincheta = myKaMarca = null;
var scales;
var extents;
var queryParams = null;
var altoIMG = 16;
//alto da imaxe usada para escoller el zoom; defínese pq IE non o pilla
var nDesplegados = 3;
var pilaVistas = [];
var vistaActual = new Array(null,null,null);
var retroceso = false;
var reset = false;
var iconoSinal = 'images/puntoX.gif';
var offX = 3;
var offY = -30;

/**
 * Parsea a cadea de consulta da petición dentro dun array global de parellas
 * clave=valor. Esta función debería chamrse só unha vez.
 */
function parseQueryString() {
    queryParams = {};
    var s=window.location.search;
    if (s!='') {
        s=s.substring( 1 );
        var p=s.split('&');
        for (var i=0;i<p.length;i++) {
            var q=p[i].split('=');
            queryParams[q[0]]=q[1];
        }
    }
}

/**
 * Obtén un valor da cadea de consulta por clave. Se a cadea de consulta da petición
 * non foi parseado ainda, parseao primeiro. Devolve unha cadea vacía se non se acha.
 */
function getQueryParam(p) {
    if (!queryParams) {
        parseQueryString();
    }
    if (queryParams[p]) {
        return queryParams[p];
    } else {
        return '';
    }
}

function redimensiona()
{

drawPage();

   var aMaps = myKaMap.getMaps();

	//update the scales select
    var currentMap = myKaMap.getCurrentMap();
   	scales = currentMap.getScales();
    var currentScale=myKaMap.getCurrentScale();
	var capaEscala = getRawObject('escalaZoom');

	capaEscala.innerHTML = '';
	
	if (altoIMG == 0)
			altoIMG = 16;
		capaEscala.style.height = ((scales.length)*altoIMG) + 'px';
		var capaZoomActual = document.getElementById('capaZoomActual');
		var escala;

		for(var n = 0;n<scales.length;n++)
		{
		
			var img = document.createElement('IMG');
			if (navigator.appName == "Microsoft Internet Explorer")
			{
				if (navigator.appVersion.indexOf('MSIE 7') < 0)
				{
					img.src = 'images/a_pixel.gif';
					img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/casillaZoom.png')";
				}
				else
				{
					img.src = 'images/casillaZoom.png';
				}
			}
			else
			{
				img.src = 'images/casillaZoom.png';
			}
			capaEscala.appendChild(img);

			if (scales[n] == currentScale)
				escala = n;
		}
//capaZoomActual.style.top = (((scales.length - escala - 1)*altoIMG+altoInicialZoomActual)-48) + 'px';	
		for(var n = 0;n<scales.length;n++)
		{
		
			var img = document.createElement('IMG');
			if (navigator.appName == "Microsoft Internet Explorer")
			{
				if (navigator.appVersion.indexOf('MSIE 7') < 0)
				{
					img.src = 'images/a_pixel.gif';
					img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/casillaZoom.png')";
				}
				else
				{
					img.src = 'images/casillaZoom.png';
				}
			}
			else
			{
				img.src = 'images/casillaZoom.png';
			}
			capaEscala.appendChild(img);

			if (scales[n] == currentScale)
				escala = n;
		}
		
	var auxoffset = 48;
	if( currentScale == 750)
		auxoffset = 0;
		else if( currentScale == 1000)
		auxoffset = 16;
		else if( currentScale == 2500)
		auxoffset = 32;
	else if( currentScale == 5000)
		auxoffset = 48;
		else if( currentScale == 7500)
		auxoffset = 64;
		else if( currentScale == 10000)
		auxoffset = 80;
	else if( currentScale == 12500)
		auxoffset = 96;
		
	altoInicialZoomActual = parseInt(capaZoomActual.style.top)-auxoffset;
		
	
}
/***************************************************************************
 * L O A D :
 ***************************************************************************
 */

function myOnLoad() {

    initDHTMLAPI();

	window.onresize=redimensiona;

	myKaMap = new kaMap( 'viewport' );

	var szMap = getQueryParam('map');
    var szExtents = getQueryParam('extents');
    var szCPS = getQueryParam('cps');

	
	/*  http://localhost:8000/corcubion/?map=corcu&cps=484270.14127190155,4754927.7031723745,5000&layers=Ortofoto */
	
	if(szCPS.length <1)
	{
		szMap = 'corcu';
		szCPS = '484270.14127190155,4754927.7031723745,5000';
	}
    var legendOptions = {};
    legendOptions.visibility = typeof gbLegendVisibilityControl != 'undefined' ? gbLegendVisibilityControl : true;
    legendOptions.opacity = typeof gbLegendOpacityControl != 'undefined' ? gbLegendOpacityControl : true;
    legendOptions.order = typeof gbLegendOrderControl != 'undefined' ? gbLegendOrderControl : true;
    legendOptions.query = typeof gbLegendQueryControl != 'undefined' ? gbLegendQueryControl : true;

    var myKaLegend = new kaLegend( myKaMap, 'legend', false, legendOptions);
    myKaKeymap = new kaKeymap( myKaMap, 'keymap' );
    myKaNavigator = new kaNavigator( myKaMap );
    myKaNavigator.activate();
    myKaQuery = new kaQuery( myKaMap, KAMAP_RECT_QUERY );
    myKaRubberZoom = new kaRubberZoom( myKaMap );
    myKaTracker = new kaMouseTracker(myKaMap);
    myKaTracker.activate();

	myKaMarca = new kaMarca(myKaMap);
	
    myKaMap.registerForEvent( KAMAP_INITIALIZED, null, myInitialized );
    myKaMap.registerForEvent( KAMAP_MAP_INITIALIZED, null, myMapInitialized );
    myKaMap.registerForEvent( KAMAP_SCALE_CHANGED, null, myScaleChanged );
    myKaMap.registerForEvent( KAMAP_EXTENTS_CHANGED, null, myExtentChanged );
    myKaMap.registerForEvent( KAMAP_LAYERS_CHANGED, null, myLayersChanged );
    myKaMap.registerForEvent( KAMAP_LAYER_STATUS_CHANGED, null, myLayersChanged );
    myKaMap.registerForEvent( KAMAP_QUERY, null, myQuery );
    myKaMap.registerForEvent( KAMAP_MAP_CLICKED, null, myMapClicked );
    myKaMap.registerForEvent( KAMAP_MOUSE_TRACKER, null, myMouseMoved );

    myScalebar = new ScaleBar(1);
    myScalebar.divisions = 3;
    myScalebar.subdivisions = 2;
    myScalebar.minWidth = 150;
    myScalebar.maxWidth = 250;
    myScalebar.place('scalebar');

	myKaSearch = new kaSearch( myKaMap );

	drawPage();
    myKaMap.initialize( szMap, szExtents, szCPS );
	mySetMap('gmap');

	
	call("Informacion/info.html",this,amosarInfo);

	if (navigator.appName == "Microsoft Internet Explorer")
	{
		if (navigator.appVersion.indexOf('MSIE 7') < 0)
			esExplorer6();
	}
	else
	{
		window.parent.document.getElementById('mapInfo').style.width = "97%";
		window.parent.document.getElementById('mapInfo').style.height = "97%";
	}
	reset = false;
	
	document.getElementById('page').style.visibility='visible';
	document.getElementById('cargandoPpal').style.visibility='hidden';
	
}

/**
 * event handler for KAMAP_INITIALIZED.
 *
 * at this point, ka-Map! knows what map files are available and we have
 * access to them.
 */
function myInitialized() {
    myMapInitialized( null, myKaMap.getCurrentMap().name );

    var oId = RequestQueryString('ID');
	var oX = RequestQueryString('X');
	var oY = RequestQueryString('Y');
	var oNome = RequestQueryString('NOM');

    if(  oId != null && oX != null && oY  != null && oNome != null)
     {
         call('ficha.php?idFicha='+oId,this, amosarFicha);
         window.parent.ponherChincheta(oX,oY,oId,decodeURI(oNome).replace('Ã','Á').replace('Ã¡','á').replace('Âº','º').replace('Âª','ª').replace('Ã­','í').replace('Ã±','ñ').replace('Ã³','ó').replace('Ã©','é').replace('Ãº','ú'));
         window.parent.centrarMapa(parseInt(oX),parseInt(oY));

     }
	if( oId == null && oX != null && oY  != null )
     {
		if( oNome == null || oNome.length <1)
		{
			oNome = 'Punto localizado';
		}
           window.parent.ponherChincheta(oX,oY,'X000', myUrlDecode(oNome).replace('Ã','Á').replace('Ã¡','á').replace('Âº','º')
				.replace('Âª','ª').replace('Ã­','í').replace('Ã±','ñ').replace('Ã³','ó').replace('Ã©','é').replace('Ãº','ú'));
      window.parent.centrarMapa(parseInt(oX),parseInt(oY));

     }
}

/**
 * event handler for KAMAP_MAP_INITIALIZED
 *
 * the scales are put into a select ... this will be used for zooming
 */
function myMapInitialized( eventID, mapName ) {
    //get list of maps and populate the maps select box
    var aMaps = myKaMap.getMaps();

	//update the scales select
    var currentMap = myKaMap.getCurrentMap();
   	scales = currentMap.getScales();
    var currentScale=myKaMap.getCurrentScale();
	var capaEscala = getRawObject('escalaZoom');

		if (altoIMG == 0)
			altoIMG = 16;
		capaEscala.style.height = ((scales.length)*altoIMG) + 'px';
		var capaZoomActual = document.getElementById('capaZoomActual');
		var escala;

		for(var n = 0;n<scales.length;n++)
		{
			var img = document.createElement('IMG');
			if (navigator.appName == "Microsoft Internet Explorer")
			{
				if (navigator.appVersion.indexOf('MSIE 7') < 0)
				{
					img.src = 'images/a_pixel.gif';
					img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/casillaZoom.png')";
				}
				else
				{
					img.src = 'images/casillaZoom.png';
				}
			}
			else
			{
				img.src = 'images/casillaZoom.png';
			}
			capaEscala.appendChild(img);

			if (scales[n] == currentScale)
				escala = n;
		}

		capaZoomActual.style.top = ((scales.length - escala - 1)*altoIMG+altoInicialZoomActual) + 'px';

		if (navigator.appName == "Microsoft Internet Explorer")
			if (navigator.appVersion.indexOf('MSIE 7') < 0)
			{
				getRawObject('capaZoomMenos').style.bottom = '46px';
				getRawObject('capaZoomMenos').style.left = '12px';

				getRawObject('capaMoverAbaixo').style.bottom = '3px';
				getRawObject('capaMoverAbaixo').style.left = '16px';

				getRawObject('capaMoverArriba').style.bottom = '28px';
				getRawObject('capaMoverArriba').style.left = '16px';

				getRawObject('capaMoverDereita').style.bottom = '16px';
				getRawObject('capaMoverDereita').style.left = '28px';

				getRawObject('capaMoverEsquerda').style.bottom = '16px';
				getRawObject('capaMoverEsquerda').style.left = '4px';
			}

	    //}

	//}



    //Activate query button
    switchMode('toolPan');

    //Activate service box
    switchService('toolMapinfo');

	/* handle request for layer visibility */
	var layers = getQueryParam('layers');
	if (layers != '') {
		var map = myKaMap.getCurrentMap();
		//turn off all layers
		var allLayers = map.getAllLayers();
		for (var i=0; i<allLayers.length; i++) {
			allLayers[i].setVisibility(false);
		}
		aLayers = layers.split(',');
		for (var i=0;i<aLayers.length; i++) {
			map.setLayerVisibility (unescape(aLayers[i]), true);
		}
	}
	
}

/**
 * handle the extents changing by updating a link in the interface that links
 * to the current view
 */
function myExtentChanged( eventID, extents ) {

	updateLinkToView();
}

function myMouseMoved( eventID, position) {

    var geopos = document.getElementById('positionBackground');
    if(geopos)
    {
	var coorX = document.getElementById('coorX');
	if (coorX)
		coorX.innerHTML ='X:' + parseInt(position.x);

	var coorY = document.getElementById('coorY');
	if (coorY)
		coorY.innerHTML ='Y:' + parseInt(position.y);


    }
}

function myLayersChanged(eventID, map) {
	updateLinkToView();
}

function volverVistaAtras()
{
	if (pilaVistas.length > 0)
	{
		var vista = pilaVistas.pop();


		var maxExtents = myKaMap.getCurrentMap().maxExtents;
		if ((vista[0] > maxExtents[0])&&(vista[0] < maxExtents[2])&&(vista[1] > maxExtents[1])&&(vista[1] < maxExtents[3]))
		{
			retroceso = true;
			myKaMap.zoomTo(vista[0],vista[1],vista[2]);
			switchMode('toolPan');
		}
		else
			retroceso = false;

		if (pilaVistas.length == 0)
			getRawObject('toolLastView').className = "herramientaDeshabilitada";
	}
	else
	{
		retroceso = false;
		alert('Non hai vistas anteriores almacenadas');
	}
}

function updateOldView(oX,oY,oScale)
{
	if ((oX <= 0) || (oY <= 0))
		return 0;

	if (vistaActual[0] == null)
	{
		vistaActual[0] = oX;
		vistaActual[1] = oY;
		vistaActual[2] = oScale;
		return 0;
	}

	else
	{
		if ((vistaActual[0] != oX)||(vistaActual[1] != oY)||(vistaActual[2] != oScale))
		{

			if (retroceso)
				retroceso = false;
			else
			{
				pilaVistas.push(new Array(vistaActual[0],vistaActual[1],vistaActual[2]));
				if (pilaVistas.length == 6)
					pilaVistas.shift();

				if (pilaVistas.length > 0)
					getRawObject('toolLastView').className = "herramienta";
			}
		}
	}
	vistaActual[0] = oX;
	vistaActual[1] = oY;
	vistaActual[2] = oScale;

}

function updateLinkToView()  {
	var port = (window.location.port)? window.location.port : 80;
	//var url = window.location.protocol+'/'+'/'+window.location.host +':'+ port +''+window.location.pathname+'?';
	var url = window.location.protocol+'/'+'/'+window.location.host + window.location.pathname+'?';
	extents = myKaMap.getGeoExtents();
	var cx = (extents[2] + extents[0])/2;
	var cy = (extents[3] + extents[1])/2;

	var cpsURL = 'cps='+cx+','+cy+','+myKaMap.getCurrentScale();
	var mapURL = 'map=' + myKaMap.currentMap;
    var theMap = myKaMap.getCurrentMap();
	var aLayers = theMap.getLayers();
	var layersURL = 'layers=';
	var sep = '';
	for (var i=0;i<aLayers.length;i++) {
		layersURL += sep + aLayers[i].name;
		sep = ',';
	}
	
 for( i = 0; i< window.parent.Array_XmlOverlay_activos.length; i++){
        if ( window.parent.Array_XmlOverlay_activos[i].Activa == true ){
            layersURL = layersURL + sep + window.parent.Array_XmlOverlay_activos[i].oId;
            sep = ',';
        }
    }
	var link = getRawObject('linkToView');
	if(link) link.href = url + mapURL + '&' + cpsURL + '&' + layersURL;

	var linkContent = getRawObject('linkContent');
	if(linkContent) linkContent.value = myUrlEncode(url + mapURL + '&' + cpsURL + '&' + layersURL);

	updateOldView(cx,cy,myKaMap.getCurrentScale());

	//Muestra las coordenadas maximas y minimas en una capa llamada geoExtent
	/*var geoExtent = getRawObject('geoExtent');

	if(geoExtent) {
		geoExtent.innerHTML = 'minx: ' + roundIt(extents[0],2) +'<br>' +
							'miny: ' + roundIt(extents[1],2) +'<br>' +
							'maxx: ' + roundIt(extents[2],2) +'<br>' +
							'maxy: ' + roundIt(extents[3],2) +'<br>';
	}
	alert('minx: ' + roundIt(extents[0],2));
	alert('miny: ' + roundIt(extents[1],2));
	alert('maxx: ' + roundIt(extents[2],2));
	alert('maxy: ' + roundIt(extents[3],2));*/
}

function enviaMailCallback()
{
  if ((ajax.readyState==4))
  {
     if(ajax.responseText.indexOf('Mail enviado') >= 0)
     {
        document.forms['link'].elements['linkTo'].value = '';
        document.forms['link'].elements['remitente'].value = '';
        getRawObject('alertaEmail').style.color = '#509950';
        getRawObject('alertaEmail').innerHTML = 'Enviado correctamente';
     }
     else
     {
        getRawObject('alertaEmail').style.color = '#cc0000';
        getRawObject('alertaEmail').innerHTML = 'Ocorreu un erro no envio'+ ajax.responseText;
     }
  }

}

function sendLinkToView(destinatario,nome,url)
{
	if(validarEmail(destinatario))
	{
		getRawObject('alertaEmail').style.color = '#003090';
		getRawObject('alertaEmail').innerHTML = 'Enviando...';

		ajax=getXMLHTTP();
		ajax.open("POST", "envia_email.php",true);


		ajax.onreadystatechange= enviaMailCallback;

		extents = myKaMap.getGeoExtents();

		ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		ajax.send("destinatario="+destinatario+"&emisor="+nome+"&url="+url+"&minx="+roundIt(extents[0],2)+"&miny="+roundIt(extents[1],2)+"&maxx="+roundIt(extents[2],2)+"&maxy="+roundIt(extents[3],2));

	}
	else
	{   getRawObject('alertaEmail').style.color = '#cc0000';
		getRawObject('alertaEmail').innerHTML = 'O formato do e-mail non écorrecto';
	}

}



/*******************************************************************************
 * Cando cambia a escala
 ******************************************************************************/
function myScaleChanged( eventID, scale ) {

  var oSelect = document.forms[0].scales;
  if(oSelect){
	    for (var i=0; i<oSelect.options.length; i++)
	    {    if (oSelect.options[i].value == scale)
	         {  oSelect.options[i].selected = true;
	            //document.forms[0].zoomout.disabled = (i==0);
	            //document.forms[0].zoomin.disabled = (i==oSelect.options.length - 1);
	        }
	    }
    }

    //todo: update scale select and enable/disable zoomin/zoomout
    var currentMap = myKaMap.getCurrentMap();
    var scales = currentMap.getScales();
    for(var i in scales){
        var imgString = 'img'+scales[i];
        var scaleString = 'img'+scale;
        if(getRawObject(imgString)) {
            if(imgString == scaleString) {
                getRawObject(scaleString).src = 'images/pixel-red.png';
            } else {
                getRawObject(imgString).src = 'images/pixel-blue.png';
            }
        }
    }

    myScalebar.update(scale);
    if( omeuXmlOverlay != null)
    {
    }
}


/**
 * called when the user changes scales.  This will cause the map to zoom to
 * the new scale and trigger a bunch of events, including:
 * KAMAP_SCALE_CHANGED
 * KAMAP_EXTENTS_CHANGED
 */
function mySetScale( scale , topZoom) {
    myKaMap.zoomToScale( scale , topZoom);
}

/**
 * called when the map selection changes due to the user selecting a new map.
 * By calling myKaMap.selectMap, this triggers the KAMAP_MAP_INITIALIZED event
 * after the new map is initialized which, in turn, causes myMapInitialized
 * to be called
 */
function mySetMap( name ) {
    myKaMap.selectMap( name );
}



var txtAux = "";
function myQuery( eventID, queryType, coords ) {

    var radioX = 1;
    var radioY = 1;

	if (coords.length == 2)
	{
		coords = new Array(coords[0]-radioX,coords[1]+radioY,
                 coords[0]+radioX,coords[1]-radioY);
		queryType = 1;
	}

	var params= 'coords='+coords;
	call('map_query_postgis.php?'+params,this, myQueryOutput);
	getRawObject('queryOut').innerHTML = '<h3 style="color:#991427;" >Procesando consulta. <br> por favor agarde...</h3><hr>';
	txtAux = "";
	

}

function myQueryOutput (szText){
	getRawObject('queryOut').innerHTML=szText;
}


function myMapClicked( eventID, coords ) {

    //alert( 'myMapClicked('+coords+')');
	  //myKaMap.zoomTo(coords[0],coords[1]);

}

function myZoomIn() {
    myKaMap.zoomIn();
}

function myZoomOut() {
    myKaMap.zoomOut();
}

function myPrint(output_type) {
    var szLayers = '';

    var layers = myKaMap.getCurrentMap().getLayers();
    for (var i=0;i<layers.length;i++) {
        szLayers = szLayers + "," + layers[i].name;
    }
 for( i = 0; i< window.parent.Array_XmlOverlay_activos.length; i++){
       if (  window.parent.Array_XmlOverlay_activos[i].Activa == true ){
            szLayers = szLayers + "," + window.parent.Array_XmlOverlay_activos[i].oId;
       }
    }
    var extent = myKaMap.getGeoExtents();
    var scale = myKaMap.getCurrentScale();
    var cMap = myKaMap.getCurrentMap().name;

 var img_width = '600';// pixel dimension. max_img_width set inside print_map.php
 if (parseInt(getRawObject('viewport').style.width) > img_width)
  img_width = parseInt(getRawObject('viewport').style.width);

    //output_type
 var params='output_type='+output_type+'&map='+cMap+'&scale='+scale+'&img_width='+img_width+'&groups='+szLayers+'&extent='+extent[0]+'|'+extent[1]+'|'+extent[2]+'|'+extent[3];

  //create and download the output file
  //location.href='tools/print/print_map.php?'+params;

    WOOpenWin( 'Print', 'tools/print/print_map.php?'+params, 'resizable=yes,scrollbars=yes,width=600,height=400' );

}

/**
* Obtiene el estilo de las hojas de estilos
*/

function obtenerEstilo(clase,estilo)
{
	estilo = estilo.toUpperCase();
	clase = clase.toUpperCase();
	var retorno = null;
	if (navigator.appName == "Microsoft Internet Explorer")
	{
		for(var r=0;r<document.styleSheets.length;r++)
		{
			for(var w=0;w<document.styleSheets[r].rules.length;w++)
			{
				if(document.styleSheets[r].rules[w].selectorText.substr(1).toUpperCase()==clase)
				{
					for(var s=0;s<document.styleSheets[r].rules[w].style.cssText.split(';').length;s++)
					{
						if(document.styleSheets[r].rules[w].style.cssText.split(';')[s].split(':')[0].replace(' ','')==estilo)
						{
							retorno = document.styleSheets[r].rules[w].style.cssText.split(';')[s].split(':')[1].replace(' ','');
							return retorno;
						}
					}
				}
			}
		}
	}
	else
	{
		for(var r=0;r<document.styleSheets.length;r++)
		{
			for(var w=0;w<document.styleSheets[r].cssRules.length;w++)
			{
				if(document.styleSheets[r].cssRules[w].selectorText.substr(1).toUpperCase()==clase)
				{
					for(var s=0;s<document.styleSheets[r].cssRules[w].style.cssText.split(';').length;s++)
					{
						if(document.styleSheets[r].cssRules[w].style.cssText.split(';')[s].split(':')[0].replace(' ','').toUpperCase()==estilo)
						{
							retorno = document.styleSheets[r].cssRules[w].style.cssText.split(';')[s].split(':')[1].replace(' ','');
							return retorno;
						}
					}
				}
			}
		}
	}
}

/**
 * drawPage - calculate sizes of the various divs to make the app full screen.
 */
 var estadoinicial = true;
function drawPage() {


    var browserWidth = getInsideWindowWidth();
    var browserHeight = getInsideWindowHeight();

    var page = getRawObject('page');
	var explorer = getRawObject('explorer');
    var layoutFrame = getRawObject('layoutFrame');
    var viewport = getRawObject('viewport');
	var keymap = getRawObject('keymap');
	var capaZoom = getRawObject('capaZoom');
	var capaZoomActual = getRawObject('capaZoomActual');
	var zoomMovil = getRawObject('zoomMovil');
	var amosaEscala = getRawObject('amosaEscala');

	var menuEsquerda = getRawObject('menuEsquerda');
	var tablaContenido = getRawObject('tablaContenido');
	var contenido = getRawObject('contenido');
	var tablaFicha = getRawObject('tablaFicha');
	var ficha = getRawObject('ficha');

	var content = getRawObject('content');
	var contentBackground = getRawObject('contentBackground');
	var contentText = getRawObject('contentText');


	//Set Viewport Width
    if(myKaMap.isIE4) {
        //terrible hack to avoid IE to show scrollbar
        page.style.width = (browserWidth -2) + "px";
    } else {
        page.style.width = browserWidth + "px";
    }

     if(myKaMap.isIE4) {
        //terrible hack to avoid IE to show scrollbar
        page.style.height = (browserHeight -2) + "px";
		if (parseInt(page.style.height) < 594)
		{
			page.style.height = '594px';
		}
    } else {
        page.style.height = browserHeight + "px";
		if (parseInt(page.style.height) < 605)
		{

			page.style.height = '605px';
		}
    }
	//layoutFrame
	layoutFrame.style.width = parseInt(page.style.width) + "px";
	layoutFrame.style.height = parseInt(page.style.height) -parseInt(getObjectHeight(explorer)) + "px";
	layoutFrame.style.top= parseInt(getObjectHeight(explorer)) + "px";
	layoutFrame.style.left="0";
	layoutFrame.style.right="0";

	//VIEWPORT
	if (navigator.appName == "Microsoft Internet Explorer")
	{
		//document.getElementById('ferramentasDerechaTool').style.right = "-5px";
		//document.getElementById('ferramentasDerechaTool').style.position = "absolute";
	}

	menuEsquerda.style.height = (parseFloat(layoutFrame.style.height)-12)+ 'px';
	tablaContenido.style.height = (parseFloat(menuEsquerda.style.height)/2 - 3) + 'px';
	tablaFicha.style.height = (parseFloat(menuEsquerda.style.height) - parseFloat(tablaContenido.style.height) - 6) + 'px';

	contenido.style.height = (parseFloat(tablaContenido.style.height)-23) + 'px';

	if (navigator.appName != "Microsoft Internet Explorer")
	{
			ficha.style.height = (parseFloat(tablaFicha.style.height)-24) + 'px';
	}
	else
	{
		ficha.style.height = (parseFloat(tablaFicha.style.height)-23) + 'px';
	}

	viewport.style.top = parseInt(obtenerEstilo('viewport','top')) + 'px';
	viewport.style.height = (parseFloat(layoutFrame.style.height) -18) + 'px';
	viewport.style.width = (parseInt(layoutFrame.style.width) - parseInt(obtenerEstilo('menuEsquerda','width')) - parseInt(layoutFrame.style.width)*0.6/100-4) + 'px';
	viewport.style.left= parseInt(getObjectWidth(menuEsquerda)) + "px";
	viewport.style.right = '0px';

	//capaZoom.style.left = (parseFloat(viewport.style.left) + 20) + 'px';
	
	//zoomMovil.style.left = (parseFloat(viewport.style.left) + 20) + 'px';
	//zoomMovil.style.top = (parseFloat(viewport.style.top) + 20) + 'px';

	//variable que nos dice el alto de una celda de la tabla.neceario para el zoom
	var img = document.createElement('IMG');
	img.src = 'images/casillaZoom.gif';
	altoIMG = img.offsetHeight;


	if(estadoinicial == true)
	{
	estadoinicial=false;
	if (navigator.appName == "Microsoft Internet Explorer")
	{

		capaZoom.getElementsByTagName('IMG')[0].style.top = '2px';
		capaZoomActual.style.top = (capaZoom.getElementsByTagName('IMG')[0].offsetHeight +3) + 'px';
	}
	else
	{
         	
		capaZoomActual.style.top = (capaZoom.getElementsByTagName('IMG')[0].offsetHeight +1) + 'px';
	
	}
	}	
	amosaEscala.style.width = obtenerEstilo('amosaEscala','width');
	capaZoomActual.style.width = (parseInt(obtenerEstilo('capaZoomActual','width')) - parseInt(amosaEscala.style.width)) + 'px';

	altoInicialZoomActual = parseInt(capaZoomActual.style.top);

	//capaZoomActual.style.left = (parseInt(capaZoom.style.left) + 1) + 'px';

	var toolbar = getRawObject('toolbar');
	toolbar.style.width = (parseInt(getObjectWidth(viewport))+2) +'px';
	//CONTENT
	if (viewport.style.top.length == 0)
		content.style.top = (parseInt(obtenerEstilo('viewport','top')) + 6) + 'px';
	else
		content.style.top = (parseFloat(viewport.style.top)+6)+'px';
	content.style.left = (parseFloat(viewport.style.left)+6)+'px';
	content.style.width = '0px';
	content.style.height = '0px';
	//contentBackground.style.height = "99%";
	/*contentText.style.height = "92%";
	contentText.style.width = "98%";*/

    myKaMap.resize();

}


var omeuXmlOverlay = null;

function amosaLugar( oId )
{

  if( omeuXmlOverlay == null)
  {
   omeuXmlOverlay = new kaXmlOverlay( myKaMap, 250);
  }

  omeuXmlOverlay.removePoint (null);
 
  omeuXmlOverlay.loadXml('consulta.php?sp=' + oId );

  //var XUTM = document.getElementById('coordenadaX').value;
  //var YUTM = document.getElementById('coordenadaY').value;


  //centrarMapa(XUTM,YUTM);

}

function onClickToolTip()
{
	var aCategoria = this.codigo;
	var oId = this.chincheta.idFonte;
	mostrarInfoMapaById( oId, aCategoria);

	}
	
function ponherChincheta(xutm,yutm,idFonte,oNome)
{
	if (chincheta == null)
	{
		chincheta = new kaToolTip( myKaMap );
		var offsetX= offX;//offset to move the image left-right
		var offsetY= offY;//offset to move the image top-bottom

		chincheta.setTipImage(iconoSinal,offsetX,offsetY);
	}
    else{
        chincheta.eliminarKaToolTip();   
        //chincheta = new kaToolTip( myKaMap );
        var offsetX= offX;//offset to move the image left-right
        var offsetY= offY;//offset to move the image top-bottom

        chincheta.setTipImage(iconoSinal,offsetX,offsetY);
    }
	
    var texto_chincheta = "<div style=' background-color:#FBF2A1;color:#000000;opacity:0.75;"
      +"padding-bottom:3px;padding-left:3px;padding-right:3px;padding-top:3px;font-size: 7.5pt;font-weight:bold;"
      +(navigator.appName == "Microsoft Internet Explorer" ? "position:relative;top:-45px;" : "position:relative;top:-41px;")
	  +"cursor:pointer' "
	  +" title='" + oNome + " (faga click para acceder a ficha)' "
	  +" onclick='onClickToolTip()' " 
	  +" >"
       + oNome
      +"</div>"; 
	if(arguments.length<2)
		chincheta.eliminarKaToolTip();
	else
		chincheta.moveGeo(xutm,yutm,idFonte); //geo coords 

  chincheta.setText(texto_chincheta);
	hideContent();

}

function centrarMapa(XUTM,YUTM)
{
	myKaMap.zoomToExtents(XUTM,YUTM,XUTM,YUTM,true);
  hideContent();
}

function contraePosUTM(img)
{
	var contenedor = img.parentNode;
	var contenido = contenedor.getElementsByTagName('DIV')[0];
	//var img = contenedor.getElementsByTagname('IMG')[0];
	var esExplorer6 = false;

	if(img.src.indexOf('Arriba') >= 0)
	{
		if (navigator.appName == "Microsoft Internet Explorer")
		{
			contenedor.style.filter = 'alpha(opacity=60)';
			if (navigator.appVersion.indexOf('MSIE 7') < 0)
			{
				contenedor.style.height = '3px';
				esExplorer6 = true;
			}
		}
		else
			contenedor.style.opacity = 0.6;

		contenido.style.display = 'none';
		img.src = img.src.replace('Arriba','Abajo');
		img.alt = 'Amosar';
		img.title = 'Amosar';

		nDesplegados--;
		if(nDesplegados == 0)
		{
			if (!esExplorer6)
				getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].src = getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].src.replace('replegar','desplegar');
			else
				getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].style.filter = getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].style.filter.replace('replegar','desplegar');
		}
	}
	else
	{
		if (navigator.appName == "Microsoft Internet Explorer")
		{
			contenedor.style.filter = 'alpha(opacity=100)';
			if (navigator.appVersion.indexOf('MSIE 7') < 0)
			{
				contenedor.style.height = '0px';
				esExplorer6 = true;
			}
		}
		else
			contenedor.style.opacity = 1;
		contenido.style.display = 'block';
		img.src = img.src.replace('Abajo','Arriba');
		img.alt = 'Ocultar';
		img.title = 'Ocultar';

		nDesplegados++;
		if(nDesplegados == 3)
		{
			if (!esExplorer6)
				getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].src = getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].src.replace('desplegar','replegar');
			else
				getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].style.filter = getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].style.filter.replace('desplegar','replegar');
		}
	}
}

function contraeContenedor(img)
{
	var contenedor = img.parentNode;
	var contenido = contenedor.getElementsByTagName('DIV')[0];
	//var img = contenedor.getElementsByTagname('IMG')[0];
	var esExplorer6 = false;

	if(img.src.indexOf('Abajo') >= 0)
	{
		if (navigator.appName == "Microsoft Internet Explorer")
		{
			contenedor.style.filter = 'alpha(opacity=60)';
			if (navigator.appVersion.indexOf('MSIE 7') < 0)
			{
				contenedor.style.height = '5px';
				esExplorer6 = true;
			}
		}
		else
			contenedor.style.opacity = 0.6;

		contenido.style.display = 'none';
		img.src = img.src.replace('Abajo','Arriba');
		img.alt = 'Amosar';
		img.title = 'Amosar';

		nDesplegados--;
		if(nDesplegados == 0)
		{
			if (!esExplorer6)
				getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].src = getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].src.replace('replegar','desplegar');
			else
				getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].style.filter = getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].style.filter.replace('replegar','desplegar');
		}

	}
	else
	{
		if (navigator.appName == "Microsoft Internet Explorer")
		{
			contenedor.style.filter = 'alpha(opacity=100)';
			if (navigator.appVersion.indexOf('MSIE 7') < 0)
			{
				contenedor.style.height = '0px';
				esExplorer6 = true;
			}
		}
		else
			contenedor.style.opacity = 1;
		contenido.style.display = 'block';
		img.src = img.src.replace('Arriba','Abajo');
		img.alt = 'Ocultar';
		img.title = 'Ocultar';

		nDesplegados++;
		if(nDesplegados == 3)
		{
			if (!esExplorer6)
				getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].src = getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].src.replace('desplegar','replegar');
			else
				getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].style.filter = getRawObject('toolDesplegar').getElementsByTagName('IMG')[0].style.filter.replace('desplegar','replegar');
		}
	}
}

/*
Funcion que pliega los paneles del menu de la izquierda
*/

function pliega(id,todo)
{
	var menuEsquerda = getRawObject('menuEsquerda');
	var menu1,menuHijo1,menu2,menuHijo2;

	if (id == 'tablaContenido')
	{
		menuLanzador = getRawObject('tablaContenido');
		menuHijoLanzador = getRawObject('contenido');
		imgFlechaLanzador = getRawObject('flechaEstadoC');

		menuHermano = getRawObject('tablaFicha');
		menuHijoHermano = getRawObject('ficha');
		imgFlechaHermano = getRawObject('flechaEstadoF');
	}
	else
	{
		menuLanzador = getRawObject('tablaFicha');
		menuHijoLanzador = getRawObject('ficha');
		imgFlechaLanzador = getRawObject('flechaEstadoF');

		menuHermano = getRawObject('tablaContenido');
		menuHijoHermano = getRawObject('contenido');
		imgFlechaHermano = getRawObject('flechaEstadoC');
	}

	if((parseInt(menuHijoLanzador.style.height) == 0)&&(todo==null))
	{
		pliega(menuHermano.id);
		return 0;
	}

	if ((parseInt(menuHijoHermano.style.height) > 0)||(todo!=null))
	{
		menuLanzador.style.height = (parseFloat(menuLanzador.style.height)+parseFloat(menuHijoHermano.style.height)) + 'px';
		menuHermano.style.height = (parseFloat(menuHermano.style.height)-parseFloat(menuHijoHermano.style.height)) + 'px';
		menuHijoLanzador.style.height = (parseFloat(menuHijoHermano.style.height)+parseFloat(menuHijoLanzador.style.height)) + 'px';
		menuHijoHermano.style.height = '0px';

		if (id == 'tablaContenido')
		{
			imgFlechaLanzador.src = imgFlechaLanzador.src.replace('Abajo','Arriba');
			imgFlechaLanzador.alt = 'Contrae o panel';
		}
		else
		{
			imgFlechaLanzador.src = imgFlechaLanzador.src.replace('Arriba','Abajo');
			imgFlechaLanzador.alt = 'Expande o panel';
		}

		//imgFlechaLanzador.src = imgFlechaLanzador.src.replace('Abajo','Arriba');

	}
	else
	{
		menuLanzador.style.height = (parseFloat(menuEsquerda.style.height)/2 - 3) + 'px';
		menuHijoLanzador.style.height = (parseFloat(menuLanzador.style.height)-23) + 'px';
		menuHermano.style.height = (parseFloat(menuEsquerda.style.height)/2 - 3) + 'px';
		menuHijoHermano.style.height = (parseFloat(menuHermano.style.height)-23) + 'px';

		if (id == 'tablaContenido')
		{
			imgFlechaLanzador.src = imgFlechaLanzador.src.replace('Arriba','Abajo');
			imgFlechaLanzador.alt = 'Expande o panel';
		}
		else
		{
			imgFlechaLanzador.src = imgFlechaLanzador.src.replace('Abajo','Arriba');
			imgFlechaLanzador.alt = 'Expande o panel';
			imgFlechaHermano.src = imgFlechaHermano.src.replace('Arriba','Abajo');
			imgFlechaHermano.alt = 'Expande o panel';
		}

		//imgFlechaLanzador.src = imgFlechaLanzador.src.replace('Arriba','Abajo');
		//imgFlechaHermano.src = imgFlechaHermano.src.replace('Arriba','Abajo');

	}
}

/*
Funcion que crea el arbol del menu de la izquierda
*/

function creaArbore(szContent) {
	var contenido = getRawObject('contenido');
	contenido.innerHTML = szContent;
}

function expandeContrae(obj)
{
	var ulTag = obj.parentNode.getElementsByTagName('UL')[0];

	if (ulTag != null)
	{
		//La primera vez tiene que encontrar el estilo en la hoja css
		if ((ulTag.style.display == ''))
		{
			ulTag.style.display = obtenerEstilo('arboreNavegacion UL','display');
		}

		if (ulTag.style.display.indexOf('none') >= 0)
		{
			ulTag.style.display = 'block';
			obj.src = obj.src.replace('expand','collapse');
		}
		else
		{
			ulTag.style.display = 'none';
			obj.src = obj.src.replace('collapse','expand');
		}
	}
}

//Funciones del panel zoom

var capaZoomMovil = null;
var posZoomActualY,posInicialZoom;
var altoInicialZoomActual;

function iniciaCambiaZoom(e,obj)
{

	if (e == null)
		e = window.event;
	var amosaEscala = getRawObject('amosaEscala');

	capaZoomMovil = obj.parentNode;
	capaZoomMovil.style.width = (parseInt(capaZoomMovil.style.width) + parseInt(amosaEscala.style.width)) + 'px';;

	amosaEscala.style.visibility = 'visible';
	capaZoomMovil.style.zIndex = '1000';

	posZoomActualY = e.clientY - parseInt(capaZoomMovil.style.top);

	if (navigator.appName == "Microsoft Internet Explorer")
	{
    	document.attachEvent("onmousemove", cambiaZoom);
	    document.attachEvent("onmouseup",   finCambiaZoom);
    	window.event.cancelBubble = true;
	    window.event.returnValue = false;
		//capaZoomMovil.style.filter = 'alpha(opacity=100)';
  	}
	else
	{
    	document.addEventListener("mousemove", cambiaZoom,   true);
    	document.addEventListener("mouseup",   finCambiaZoom, true);
	    e.preventDefault();
  	}
}

function finCambiaZoom(obj)
{

	if(capaZoomMovil!=null)
	{
		var amosaEscala = getRawObject('amosaEscala');
		var pos = parseInt(capaZoomMovil.style.top);

		capaZoomMovil.style.zIndex = '4';
		capaZoomMovil.style.width = (parseInt(capaZoomMovil.style.width) - parseInt(amosaEscala.style.width)) + 'px';;
		amosaEscala.style.visibility = 'hidden';

		if (navigator.appName == "Microsoft Internet Explorer")
		{
    		document.detachEvent("onmousemove", cambiaZoom);
		    document.detachEvent("onmouseup",   finCambiaZoom);
			//capaZoomMovil.style.filter = 'alpha(opacity=75)';
  		}
	  	else
		{
    		document.removeEventListener("mousemove", cambiaZoom,   true);
		    document.removeEventListener("mouseup",   finCambiaZoom, true);
  		}

		capaZoomMovil = null;

		pos -= altoInicialZoomActual;
		pos = pos/altoIMG;
		pos = Math.round(pos);
		pos = scales.length - pos - 1;

		mySetScale(pos,altoInicialZoomActual);
	}
}

function cambiaZoom(e,obj)
{

	if (e == null)
		e = window.event;

	if(capaZoomMovil!=null)
	{
		var pos = e.clientY - posZoomActualY;
		var posMax = parseInt(getObjectHeight(getRawObject('escalaZoom')));
		var posAux;
		var amosaEscala = getRawObject('amosaEscala');

		if (pos<altoInicialZoomActual)
			pos = altoInicialZoomActual;
		if (pos>posMax+altoInicialZoomActual - altoIMG)
			pos = posMax+altoInicialZoomActual - altoIMG;

		posAux = pos - altoInicialZoomActual;

		capaZoomMovil.style.top = pos + 'px';

		posAux = posAux/altoIMG;

		posAux = Math.round(posAux);

		posAux = scales.length - posAux - 1;

		if (amosaEscala.innerHTML != '1:'+scales[posAux])
			amosaEscala.innerHTML = '1:'+scales[posAux];

		if ((isNaN(scales[posAux]))&&(!reset))
		{
			//alert('Ocorreu un erro. Reiniciarase a aplicación');
			reset = true;
		 window.location = window.location.href;
		}

	}

	if (navigator.appName == "Microsoft Internet Explorer")
	{
    	window.event.cancelBubble = true;
	    window.event.returnValue = false;
  	}
	else
		e.preventDefault();
}


/*
moverAbaixo()  funcion chamada dende a ferramenta zoom e despraza o mapa abaixo

*/

function flechaMover(x,y)
{
	myKaMap.moveBy(x,y);
    myKaMap.triggerEvent( KAMAP_EXTENTS_CHANGED, myKaMap.getGeoExtents() );
}


function showContent(url) {
	var content = getRawObject('content');
	var contentText = getRawObject('contentText');
	var viewport = getRawObject('viewport');

	content.style.width = (parseFloat(viewport.style.width)-12)+'px';
	content.style.height = (parseFloat(viewport.style.height)-6)+'px';

	contentText.style.height = (parseInt(content.style.height)-55) + 'px';
	contentText.style.width = (parseInt(content.style.width)-38) + 'px';

	content.style.visibility = 'visible';
	contentText.style.visibility = 'visible';
	call(url,this, setContent);
}

function setContent(szContent){
	var contentText = getRawObject('contentText');
	contentText.innerHTML = szContent;
}
function hideContent() {
	var content = getRawObject('content');
	var viewport = getRawObject('viewport');
	var contentText = getRawObject('contentText');

	content.style.width = '0px';
	content.style.height = '0px';
	content.style.visibility = 'hidden';

	contentText.style.width = '0px';
	contentText.style.height = '0px';
	contentText.style.visibility = 'hidden';
}

//Funcion que amosa a informacion dunha ficha no contedor "Ficha"
function cargaInfFicha(info)
{
	var mapInfo = getRawObject('mapInfo');
	mapInfo.innerHTML = info;
	mapInfo.scrollTop = 0;

	getRawObject('opcionMediaPantalla').style.visibility = 'hidden';
}

function amosaFichaMediaPantalla()
{
  var mapInfo = getRawObject('mapInfo2');
  if (mapInfo == null)
  {
      mapInfo = getRawObject('mapInfo');
  }

	var contentText = getRawObject('contentText');
	var content = getRawObject('content');
	var viewport = getRawObject('viewport');

	content.style.top = (parseInt(viewport.style.top)+6)+'px';
	content.style.left = (parseFloat(viewport.style.left)+6)+'px';
	content.style.width = (parseFloat(viewport.style.width)-6)+'px';
	content.style.height = (parseFloat(viewport.style.height)-6)+'px';;
	content.style.visibility = 'visible';

	contentText.style.height = (parseInt(content.style.height)-55) + 'px';
	contentText.style.width = (parseInt(content.style.width)-38) + 'px';
	contentText.style.visibility = 'visible';

	var txtauxhtml =  mapInfo.innerHTML;
	txtauxhtml = txtauxhtml.replace('http://farm4.static.flickr.com/3141/2365567875_9a188a90fb_d.jpg',
		'http://farm4.static.flickr.com/3141/2365567875_5a5e8bf784_o_d.jpg');
		
	contentText.innerHTML = txtauxhtml;
			
	contentText.scrollTop = 0;	
	
	}

/**
 * getFullExtent
 * ...
 */
function getFullExtent() {
    var exStr = myKaMap.getCurrentMap().defaultExtents.toString();
    var ex = myKaMap.getCurrentMap().defaultExtents;
    myKaMap.zoomToExtents(ex[0],ex[1],ex[2],ex[3]);
}

/**
 * switchMode
 * ...
 */
function switchMode(id) {

	hideContent();

    if (id=='toolQuery') {
        myKaQuery.activate();
        getRawObject('toolQuery').className = 'herramientaSel';
        getRawObject('toolPan').className = 'herramienta';
        getRawObject('toolZoomRubber').className = 'herramienta';
		 getRawObject('toolMarca').className = 'herramienta';
    } else if (id=='toolPan') {
        myKaNavigator.activate();

		getRawObject('toolQuery').className = 'herramienta';
        getRawObject('toolPan').className = 'herramientaSel';
        getRawObject('toolZoomRubber').className = 'herramienta';
		 getRawObject('toolMarca').className = 'herramienta';
    } else if (id=='toolZoomRubber') {
        myKaRubberZoom.activate();
        getRawObject('toolQuery').className = 'herramienta';
        getRawObject('toolPan').className = 'herramienta';
        getRawObject('toolZoomRubber').className = 'herramientaSel';
		 getRawObject('toolMarca').className = 'herramienta';
    }  else if (id=='toolMarca') {
        myKaRubberZoom.activate();
        getRawObject('toolQuery').className = 'herramienta';
        getRawObject('toolPan').className = 'herramienta';
        getRawObject('toolZoomRubber').className = 'herramienta';
		 getRawObject('toolMarca').className = 'herramientaSel';
    } else {
        myKaNavigator.activate();
    }
}


/**
 * switchMode
 * ...
 */
function switchService(id) {

	hideContent();
	getRawObject('alertaEmail').innerHTML = '';

	var tablaFicha = getRawObject('tablaFicha');

    if (id=='toolQuery') {
        myKaQuery.activate();
        getRawObject('toolQuery').className = 'herramientaSel';
        getRawObject('toolLegend').className = 'herramienta';
        getRawObject('toolMapinfo').className = 'herramienta';
        getRawObject('toolPrint').className = 'herramienta';
        getRawObject('toolZoomRubber').className = 'herramienta';
		getRawObject('toolLink').className = 'herramienta';
		getRawObject('toolSearch').className = 'herramienta';
	getRawObject('toolMarca').className = 'herramienta';

		getRawObject('mapInfo').style.visibility = 'hidden';
		getRawObject('mapLegend').style.visibility = 'hidden';
		getRawObject('print').style.visibility = 'hidden';
		getRawObject('identifier').style.visibility = 'visible';
		getRawObject('curtain').style.visibility =  'hidden';
		getRawObject('link').style.visibility =  'hidden';
		getRawObject('search').style.visibility =  'hidden';
		getRawObject('marcador').style.visibility =  'hidden';

		getRawObject('opcionMediaPantalla').style.visibility = 'hidden';

    } else if (id=='toolLegend') {
        myKaNavigator.activate();
        getRawObject('toolQuery').className = 'herramienta';
        getRawObject('toolMapinfo').className = 'herramienta';
        getRawObject('toolLegend').className = 'herramientaSel';
        getRawObject('toolPrint').className = 'herramienta';
        getRawObject('toolPan').className = 'herramientaSel';
        getRawObject('toolZoomRubber').className = 'herramienta';
		getRawObject('toolLink').className = 'herramienta';
		getRawObject('toolSearch').className = 'herramienta';
	getRawObject('toolMarca').className = 'herramienta';

		getRawObject('mapInfo').style.visibility = 'hidden';
		getRawObject('mapLegend').style.visibility = 'visible';
		getRawObject('print').style.visibility = 'hidden';
		getRawObject('identifier').style.visibility = 'hidden';
		getRawObject('curtain').style.visibility =  'hidden';
		getRawObject('link').style.visibility =  'hidden';
		getRawObject('search').style.visibility =  'hidden';
getRawObject('marcador').style.visibility =  'hidden';

		getRawObject('opcionMediaPantalla').style.visibility = 'hidden';

    } else if (id=='toolPrint') {
        myKaNavigator.activate();
        getRawObject('toolQuery').className = 'herramienta';
        getRawObject('toolLegend').className = 'herramienta';
        getRawObject('toolMapinfo').className = 'herramienta';
        getRawObject('toolPrint').className = 'herramientaSel';
        getRawObject('toolPan').className = 'herramientaSel';
        getRawObject('toolZoomRubber').className = 'herramienta';
		getRawObject('toolLink').className = 'herramienta';
		getRawObject('toolSearch').className = 'herramienta';
	getRawObject('toolMarca').className = 'herramienta';

		getRawObject('mapInfo').style.visibility = 'hidden';
		getRawObject('mapLegend').style.visibility = 'hidden';
		getRawObject('print').style.visibility = 'visible';
		getRawObject('identifier').style.visibility = 'hidden';
		getRawObject('curtain').style.visibility =  'hidden';
		getRawObject('link').style.visibility =  'hidden';
		getRawObject('search').style.visibility =  'hidden';
getRawObject('marcador').style.visibility =  'hidden';

		getRawObject('opcionMediaPantalla').style.visibility = 'hidden';

    } else if (id=='toolLink') {
        myKaNavigator.activate();
        getRawObject('toolQuery').className = 'herramienta';
        getRawObject('toolLegend').className = 'herramienta';
        getRawObject('toolMapinfo').className = 'herramienta';
        getRawObject('toolPrint').className = 'herramienta';
        getRawObject('toolPan').className = 'herramientaSel';
        getRawObject('toolZoomRubber').className = 'herramienta';
		getRawObject('toolLink').className = 'herramientaSel';
		getRawObject('toolSearch').className = 'herramienta';
	getRawObject('toolMarca').className = 'herramienta';

		getRawObject('mapInfo').style.visibility = 'hidden';
		getRawObject('mapLegend').style.visibility = 'hidden';
		getRawObject('print').style.visibility = 'hidden';
		getRawObject('identifier').style.visibility = 'hidden';
		getRawObject('curtain').style.visibility =  'hidden';
		getRawObject('link').style.visibility =  'visible';
		getRawObject('search').style.visibility =  'hidden';
getRawObject('marcador').style.visibility =  'hidden';

		getRawObject('opcionMediaPantalla').style.visibility = 'hidden';

	} else if (id=='toolSearch') {
        myKaNavigator.activate();
        getRawObject('toolQuery').className = 'herramienta';
        getRawObject('toolLegend').className = 'herramienta';
        getRawObject('toolMapinfo').className = 'herramienta';
        getRawObject('toolPrint').className = 'herramienta';
        getRawObject('toolPan').className = 'herramientaSel';
        getRawObject('toolZoomRubber').className = 'herramienta';
		getRawObject('toolLink').className = 'herramienta';
		getRawObject('toolSearch').className = 'herramientaSel';
	getRawObject('toolMarca').className = 'herramienta';

		getRawObject('mapInfo').style.visibility = 'hidden';
		getRawObject('mapLegend').style.visibility = 'hidden';
		getRawObject('print').style.visibility = 'hidden';
		getRawObject('identifier').style.visibility = 'hidden';
		getRawObject('curtain').style.visibility =  'hidden';
		getRawObject('link').style.visibility =  'hidden';
		getRawObject('search').style.visibility =  'visible';
getRawObject('marcador').style.visibility =  'hidden';

		getRawObject('opcionMediaPantalla').style.visibility = 'hidden';

    } else if (id=='toolMapinfo' ) {
        myKaNavigator.activate();
        getRawObject('toolQuery').className = 'herramienta';
        getRawObject('toolLegend').className = 'herramienta';
        getRawObject('toolMapinfo').className = 'herramientaSel';
        getRawObject('toolPrint').className = 'herramienta';
        getRawObject('toolPan').className = 'herramientaSel';
        getRawObject('toolZoomRubber').className = 'herramienta';
		getRawObject('toolLink').className = 'herramienta';
		getRawObject('toolSearch').className = 'herramienta';
	getRawObject('toolMarca').className = 'herramienta';

		getRawObject('mapInfo').style.visibility = 'visible';
		getRawObject('mapLegend').style.visibility = 'hidden';
		getRawObject('print').style.visibility = 'hidden';
		getRawObject('identifier').style.visibility = 'hidden';
		getRawObject('curtain').style.visibility =  'hidden';
		getRawObject('link').style.visibility =  'hidden';
		getRawObject('search').style.visibility =  'hidden';
getRawObject('marcador').style.visibility =  'hidden';

		if (getRawObject('mapInfo').innerHTML.length > 0)
			getRawObject('opcionMediaPantalla').style.visibility = 'visible';


    } else if (id=='toolMarca' ) {
        myKaMarca.activate();
        getRawObject('toolQuery').className = 'herramienta';
        getRawObject('toolLegend').className = 'herramienta';
        getRawObject('toolMapinfo').className = 'herramienta';
        getRawObject('toolPrint').className = 'herramienta';
        getRawObject('toolPan').className = 'herramienta';
        getRawObject('toolZoomRubber').className = 'herramienta';
		getRawObject('toolLink').className = 'herramienta';
		getRawObject('toolSearch').className = 'herramienta';
		getRawObject('toolMarca').className = 'herramientaSel';

		getRawObject('mapInfo').style.visibility = 'hidden';
		getRawObject('mapLegend').style.visibility = 'hidden';
		getRawObject('print').style.visibility = 'hidden';
		getRawObject('identifier').style.visibility = 'hidden';
		getRawObject('curtain').style.visibility =  'hidden';
		getRawObject('link').style.visibility =  'hidden';
		getRawObject('search').style.visibility =  'hidden';
getRawObject('marcador').style.visibility =  'visible';

	    getRawObject('opcionMediaPantalla').style.visibility = 'hidden';


    } else {
        myKaNavigator.activate();
    }
}



/*
 *  applyPNGFilter(o)
 *
 *  Applies the PNG Filter Hack for IE browsers when showing 24bit PNG's
 *
 *  var o = object (this png element in the page)
 *
 * The filter is applied using a nifty feature of IE that allows javascript to
 * be executed as part of a CSS style rule - this ensures that the hack only
 * gets applied on IE browsers :)
 */
function applyPNGFilter(o) {
    var t="images/a_pixel.gif";
    if( o.src != t ) {
        var s=o.src;
        o.src = t;
        o.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+s+"',sizingMethod='scale')";
    }
}

//functions to open popup

function WOFocusWin( nn ) {
	eval( "if( this."+name+") this."+name+".moveTo(50,50); this."+name+".focus();" );
}

function WOOpenWin( name, url, ctrl ) {
    eval( "this."+name+"=window.open('"+url+"','"+name+"','"+ctrl+"');" );

    /*IE needs a delay to move forward the popup*/
    // window.setTimeout( "WOFocusWin(nome);", 300 );
}

function WinOpener() {
    this.openWin=WOOpenWin;
	this.focusWin=WOFocusWin;
}


//URL SYNTAX ENCODING
function myUrlEncode(string) {
  encodedHtml = escape(string);
  encodedHtml = encodedHtml.replace("/","%2F");
  encodedHtml = encodedHtml.replace(/\?/g,"%3F");
  encodedHtml = encodedHtml.replace(/=/g,"%3D");
  encodedHtml = encodedHtml.replace(/&/g,"%26");
  encodedHtml = encodedHtml.replace(/@/g,"%40");
  return encodedHtml;
};

function myUrlDecode(sz){
	return unescape(sz).replace(/\+/g," ");
};

//MATH FUNCTIONs
function roundIt(number,decimals){
	var base10 = 10;
	for(var i=0;i<decimals-1;i++)
		base10 = base10 *10;

	return Math.round(number * base10)/base10;
}

function esExplorer6()
{
	var srcImgFantasma = 'images/a_pixel.gif';
	var src = null;
	var imgAux = null;

	//ferramentas
	getRawObject('imprimeFicha').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('imprimeFicha').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('imprimeFicha').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('expandirTodo').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('expandirTodo').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('expandirTodo').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('contraerTodo').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('contraerTodo').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('contraerTodo').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	//toolbar
	getRawObject('toolQuery').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolQuery').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolQuery').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolZoomIn').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolZoomIn').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolZoomIn').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolZoomOut').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolZoomOut').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolZoomOut').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolZoomRubber').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolZoomRubber').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolZoomRubber').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolLastView').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolLastView').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolLastView').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolZoomFull').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolZoomFull').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolZoomFull').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolPan').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolPan').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolPan').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolSearch').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolSearch').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolSearch').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolMapinfo').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolMapinfo').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolMapinfo').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolLegend').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolLegend').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolLegend').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolLink').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolLink').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolLink').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolPrint').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolPrint').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolPrint').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolAxuda').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolAxuda').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolAxuda').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('toolDesplegar').onmouseover = function() {mouseOverToolbar(event,this)};
	getRawObject('toolDesplegar').onmouseout = function() {mouseOutToolbar(event,this)};
	imgAux = getRawObject('toolDesplegar').getElementsByTagName('IMG')[0];
	src = imgAux.src;
	imgAux.src = srcImgFantasma;
	imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	//-------------------------Trataremos as transparencias da ferramenta Zoom

	src = getRawObject('imgZoomMais').src;
	getRawObject('imgZoomMais').src = srcImgFantasma;
	getRawObject('imgZoomMais').style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	src = getRawObject('imgZoomMenos').src;
	getRawObject('imgZoomMenos').src = srcImgFantasma;
	getRawObject('imgZoomMenos').style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";


	src = getRawObject('zoomPresionado').src;
	getRawObject('zoomPresionado').src = srcImgFantasma;
	getRawObject('zoomPresionado').style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"')";

	getRawObject('contenedorKeymap').style.bottom = '-1px';
	getRawObject('contenedorScaleReference').style.bottom = '-1px';

}

function mouseOverToolbar(e,capa)
{
	capa.className = capa.className + 'HoverIE6';

}

function mouseOutToolbar(e,capa)
{
	capa.className = capa.className.replace('HoverIE6','');
}

function validarEmail(valor)
{
  if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(valor))
  {
	return true;
  }
  else
  {
	return false;
  }
 }

function imprimeFicha(idCapa)
{
	var ficha = document.getElementById(idCapa);
	var fiestraAux = window.open(' ', 'imprimir','top=1,left=1,width=1,height=1,scrollbars=NO');
	fiestraAux.document.write( ficha.innerHTML );
	fiestraAux.document.close();
	fiestraAux.print();
	fiestraAux.close();
}


//expandir os nodos da arbore
function expandirTodo()
{
	var arbore = window.frames[0].document.getElementById('arboreNavegacion');
	var imagenes = arbore.getElementsByTagName('IMG');
	for (var i=0;i<imagenes.length;i++)
	{
		if (imagenes[i].src.indexOf('expand.png') >= 0)
		{
			expandeContrae(imagenes[i]);
		}
	}
}


//contraer os nodos da arbore
function contraerTodo()
{
	var arbore = window.frames[0].document.getElementById('arboreNavegacion');
	var imagenes = arbore.getElementsByTagName('IMG');
	for (var i=0;i<imagenes.length;i++)
	{
		if (imagenes[i].src.indexOf('collapse.png') >= 0)
		{
			expandeContrae(imagenes[i]);
		}
	}
}

//Desplegar os paneis
function desplegarTodo(obj)
{
		var img = obj.getElementsByTagName('IMG')[0];

		var src = img.src;
		if (navigator.appName == "Microsoft Internet Explorer")
			if (navigator.appVersion.indexOf('MSIE 7') < 0)
				src = img.style.filter;

		if (src.indexOf('replegar') >= 0)
		{
			if (getRawObject('imgEstadoKeymap').src.indexOf('miniFlechaAbajo') >= 0)
				contraeContenedor(getRawObject('imgEstadoKeymap'));
			if (getRawObject('imgEstadoScale').src.indexOf('miniFlechaAbajo') >= 0)
				contraeContenedor(getRawObject('imgEstadoScale'));
			if (getRawObject('imgEstadoPosUTM').src.indexOf('miniFlechaArriba') >= 0)
				contraePosUTM(getRawObject('imgEstadoPosUTM'));

			img.alt = "Amosar todos os paneis";
			img.parentNode.title = "Amosar todos os paneis";

		}
		else
		{
			if (getRawObject('imgEstadoKeymap').src.indexOf('miniFlechaArriba') >= 0)
				contraeContenedor(getRawObject('imgEstadoKeymap'));
			if (getRawObject('imgEstadoScale').src.indexOf('miniFlechaArriba') >= 0)
				contraeContenedor(getRawObject('imgEstadoScale'));
			if (getRawObject('imgEstadoPosUTM').src.indexOf('miniFlechaAbajo') >= 0)
				contraePosUTM(getRawObject('imgEstadoPosUTM'));

			img.alt = "Ocultar todos os paneis";
			img.parentNode.title = "Amosar todos os paneis";
		}
}


// ****************************************************************************************************/
// ***  Inicio función de Jorge Touris para a adquisición de datos e pegadas dos mesmos na imaxen.  ***/
// ****************************************************************************************************/
function Array_de_capas ( oId, nome_capa ){
    this.oId = oId;
    this.Nome_capa = nome_capa;
    this.Activa = true; // ando creamos o elemento  para estar activo.
}
var novo_XmlOverlay = null;

function Amosa_A_Capa(oId, capa_a_amosar, SI_NON)
{
	
// O Array de XmlOverlay nono funciona pois sempre garda como correcta a ultima cargada, 
//(anque se lle cambie o nome ou ID,
// Por elo defino un array onde veñen as capas de overlay a detectar ou a incluir no XML.

  var datos_xml_overlay = "";
  var N_capa = -1;

  if(novo_XmlOverlay == null)
  {
        novo_XmlOverlay = new kaXmlOverlay( myKaMap, 250); // Se non existe o obxecto o creamos.
  }

  for( var i = 0; i< window.parent.Array_XmlOverlay_activos.length; i++){
       if (  window.parent.Array_XmlOverlay_activos[i].oId == oId ){
            N_capa = i;
            if (SI_NON == true){
                window.parent.Array_XmlOverlay_activos[i].Activa = true;
            }
            else{
                window.parent.Array_XmlOverlay_activos[i].Activa =false;
            }
       }
  }

  if(N_capa == -1) // En caso de que a dirección do array de XmlOverlay non exista, a creamos e a cargamos cun novo obxecto en branco.
  {
        window.parent.Array_XmlOverlay_activos[i] = 
			new Array_de_capas (oId, capa_a_amosar);
  }

  var checkboxes = window.parent.document.forms["legend"];
  for( i=0; i < checkboxes.length; i++){
  
        if (checkboxes[i].oIdCapa == oId) {
            if (SI_NON == true){
                checkboxes[i].checked = true;
            }
            else{
                checkboxes[i].checked = false;
            }
        }
  }

  for( i = 0; i< window.parent.Array_XmlOverlay_activos.length; i++){
       if (  window.parent.Array_XmlOverlay_activos[i].Activa == true ){
            if (datos_xml_overlay == ""){
                datos_xml_overlay = window.parent.Array_XmlOverlay_activos[i].oId;
            }
            else{
                datos_xml_overlay += "@@@" + window.parent.Array_XmlOverlay_activos[i].oId;
            }
       }
  }

 // novo_XmlOverlay.removePoint (null); //Direccionamos o XmlOverlay que nos interesa para eliminar e así borrar os datos.
 // novo_XmlOverlay.loadXml('consulta_xeral.php?sp=' + capa_a_amosar ); //Redibuxamos o XmlOverlay novo ou que nos interesa.
  if (SI_NON == false){

    novo_XmlOverlay.removePoint (null); //Direccionamos o XmlOverlay que nos interesa para eliminar e así borrar os datos.
  }

	var paramLayers = getQueryParam('layers');
	
	if(paramLayers == 'Ortofoto,C005')
	{
		novo_XmlOverlay.loadXml('consulta_xeral.php?sp=' + datos_xml_overlay ); //Redibuxamos o XmlOverlay novo ou que nos interesa.
		
	}
	else
	{
		novo_XmlOverlay.loadXml('consulta_xeral.php?sp=' + datos_xml_overlay ); //Redibuxamos o XmlOverlay novo ou que nos interesa.
	
		updateLinkToView();
	}
	  
  }




function RequestQueryString(parametro)
{
var url =  window.location.href;
    var longitud = parametro.length;
    if (url.split('?')[1] == null)
        return null;
    var parametros = url.split('?')[1].split('&');
    for (var i = 0;i<parametros.length;i++)
    {
        if (parametro == parametros[i].substring(0,longitud))
        {
            return parametros[i].split('=')[1];
            break;
        }
    }
    return null;
}







function ordenAlfabetico()
{
	if( txtAux.length == 0)
	{
		txtAux = document.getElementById('queryOut').firstChild.innerHTML;
	}
	
	document.getElementById('queryOut').firstChild.innerHTML = document.getElementById("divOrdenAlfa").innerHTML;
	
}

function ordenCategorias()
{
	if( txtAux.length > 0)
	{
		document.getElementById('queryOut').firstChild.innerHTML = txtAux;	

	}
}

function myGoogle_earth() {
    var szLayers = '';

    var layers = myKaMap.getCurrentMap().getLayers();
    for (var i=0;i<layers.length;i++) {
        szLayers = szLayers + "," + layers[i].name;
    }
	for( i = 0; i< window.parent.Array_XmlOverlay_activos.length; i++){
       if (  window.parent.Array_XmlOverlay_activos[i].Activa == true ){
            szLayers = szLayers + "," + window.parent.Array_XmlOverlay_activos[i].oId;
       }
    }                                                      
    //output_type
	var params='groups='+szLayers; 
	
	//create and download the output file
	//location.href='kmlmapserver/kmlservice.php?'+params;

	// WOOpenKML( 'Google Earth', 'http://localhost:8000/corcubion/kmlmapserver/kmlservice.php?'+params, 'resizable=yes,scrollbars=yes,width=600,height=400' );

	
	if(szLayers == ',Ortofoto' || szLayers == ',Edificios'
		|| szLayers == ',Ortofoto,Edificios'|| szLayers == '')
	{
		alert("Para a exportación a formato KML de GoogleEarth é necesario activar como mínimo\n"
			+ "algunha capa das categoríaas presentes na árbore de contidos." );
	}
	else
	{
		WOOpenWin( 'print', 'kmlmapserver/kmlservice.php?'+params, 'resizable=yes,scrollbars=yes,width=600,height=400' );
	}
}

var gotoEsquerda = false;













var MinEscalaLabels = 5000;


function kaXmlOverlay( oKaMap, zIndex )
{
    kaTool.apply( this, [oKaMap] );
    this.name = 'kaXmlOverlay';

    for (var p in kaTool.prototype)
    {
        if (!kaXmlOverlay.prototype[p]) 
            kaXmlOverlay.prototype[p]= kaTool.prototype[p];
    }
    
    this.urlBase = this.kaMap.server;
    this.urlBase += (this.urlBase!=''&&this.urlBase.substring(-1)!='/')?'':'/';

	// Lista de puntos de overlay
	this.ovrObjects = new Array();   

	this.z_index = zIndex;
	
	// Lenzo da capa
	this.overlayCanvas = this.kaMap.createDrawingCanvas( zIndex );
	
	// Rexistro de evento de escala modificada
   this.kaMap.registerForEvent( KAMAP_SCALE_CHANGED, this, this.scaleChanged );
	
}
;

kaXmlOverlay.prototype.scaleChanged = function( eventID, mapName ) {

if (this.ovrObjects == null) return;
  	var escalaNumerica = document.getElementById('escalaNumerica');
    var numEscla = parseInt(escalaNumerica.innerHTML.substr(
                    escalaNumerica.innerHTML.lastIndexOf(':') + 1 ));

  var ovrObjects = new Array();
	for (var i=0; i < this.ovrObjects.length; i++)
  	{
	
	this.ovrObjects[i].rescale();
	
		if (this.ovrObjects[i])
    	{
			var aLabel = this.ovrObjects[i].div.getElementsByTagName('div')[1];
			//alert(aLabel.id);
			if(aLabel.style != null && aLabel.style != 'undefined')
			{
				if( numEscla < MinEscalaLabels)
					aLabel.style.visibility = 'visible';
				else aLabel.style.visibility = 'hidden';
			}
    	}
 	}
 	
 }
 ;

kaXmlOverlay.prototype.remove = function() {
  ///////////////////////////////////////////////////////////
  // Elimina a cap overlay e libera recursos
  this.kaMap.deregisterForEvent( KAMAP_SCALE_CHANGED, this, this.scaleChanged );
	this.removePoint();
	this.kaMap.removeDrawingCanvas(this.overlayCanvas);
}
;

/**
 * Load XML from the server and update the overlay.
 *
 * xml_url	URL of th XML with points to plot
 */
kaXmlOverlay.prototype.loadXml = function(xml_url) {

  	document.getElementById('barProgreso').style.visibility = 'visible';
    this.urlBase = this.kaMap.server;
    this.urlBase += (this.urlBase!=''&&this.urlBase.substring(-1)!='/')?'':'/';
                    
	// The URL of the XML
	this.xmlOvrUrl = this.urlNormalize(xml_url);
	
	 call(this.xmlOvrUrl,this,this.loadXmlCallback);
}
;

/**
 * Defines the DOMParser object for IE
 */
if (typeof DOMParser == "undefined") {
   DOMParser = function () {}

   DOMParser.prototype.parseFromString = function (str, contentType) {
      if (typeof ActiveXObject != "undefined") {
         var d = new ActiveXObject("MSXML.DomDocument");
         d.loadXML(str);
         return d;
      } else if (typeof XMLHttpRequest != "undefined") {
         var req = new XMLHttpRequest;
         req.open("GET", "data:" + (contentType || "application/xml") +
                         ";charset=utf-8," + encodeURIComponent(str), false);
         if (req.overrideMimeType) {
            req.overrideMimeType(contentType);
         }
         req.send(null);
         return req.responseXML;
      }
   }
}
;
kaXmlOverlay.prototype.loadXmlCallback = function(xml_string) {


  var xmlDocument =  (new DOMParser()).parseFromString(xml_string, "text/xml");

	this.loadXmlDoc(xmlDocument);
	document.getElementById('barProgreso').style.visibility = 'hidden';
	

}
;
kaXmlOverlay.prototype.loadXmlDoc = function(xmlDocument) {

	var objDomTree = xmlDocument.documentElement;
	
	var dels = objDomTree.getElementsByTagName("delete");
	
	for (var i=0; i<dels.length; i++) {
		// read the id attribute
		var a_id = dels[i].getAttributeNode("id");
		if (a_id == null) {
			// delete all points
			this.removePoint();
		} else {
			this.removePoint(a_id.value);
		}
	}	
	
	var need_update = false;
		
	var points = objDomTree.getElementsByTagName("point");
	for (var i=0; i<points.length; i++) {
		// read the mandatory attributes
		var a_pid = points[i].getAttributeNode("id");
		if (a_pid == null) {
			continue;
		}
		var pid = a_pid.value;
				
		var np = this.getPointObject(pid);
		if (np == null) {
			// Create a new point
			np = new kaXmlPoint(pid,this);
			this.ovrObjects.push(np);
		}

		np.parse(points[i]);
		need_update = true;
	}
	
	if (need_update) this.kaMap.updateObjects();
}
;
/**
 * 
 */
kaXmlOverlay.prototype.urlNormalize = function(url) {
	if (url == null) return "";
	if (url.match(/^\//) != '/') {
		return this.urlBase+url;
	}
	return url;
}
; 
/**
 * pid		Point ID
 * return The DIV object of the given point ID. null if not found.
 */
kaXmlOverlay.prototype.getDiv = function(pid) {
	var div_id = this.getDivId(pid);
	return getRawObject(div_id);
}
;
/**
 * pid		Point ID
 * return The kaXmlPoint object given the point ID. null if not found.
 */
kaXmlOverlay.prototype.getPointObject = function(pid) {
	for (var i=0; i < this.ovrObjects.length; i++) {
		if (this.ovrObjects[i] != null && this.ovrObjects[i].pid == pid) {
			return this.ovrObjects[i];
	 	}
	}
	return null;
}
;
/**
 * Instantiate a new kaXmlPoint adn add it to the overlay. If the PID
 * already exists it's deleted and recreated.
 *
 * pid		Point ID
 * x			X Coordinate
 * y			Y Coordinate
 * return A kaXmlPoint object with the given point ID.
 */
kaXmlOverlay.prototype.addNewPoint = function(pid,x,y) {
	this.removePoint(pid);
	var np = new kaXmlPoint(pid,this);
	np.placeOnMap(x,y);
	this.ovrObjects.push(np);
	return np;
}
;
/**
 * pid		Point ID
 * return the DIV id given the point ID
 */
kaXmlOverlay.prototype.getDivId = function(pid) {
	return 'xmlovr_'+pid+'_div';
}
;


kaXmlOverlay.prototype.removePoint = function( pid ) {
    ///////////////////////////////////////////////////////////////
    // Remove one or more point div from the map.
    // If pid is null or not present remove all points.
    // pid:  Point ID or a regexp
	if ( (this.removePoint.arguments.length < 1) || (pid == null) ) {
	
		for (var i=this.ovrObjects.length; i-- > 0; ) {
			if (this.ovrObjects[i] != null) {
				this.ovrObjects[i].removeFromMap();
				delete this.ovrObjects[i];
				this.ovrObjects[i] = null;
			}
			this.ovrObjects.splice(i,1); 
		}
	} else {
		var re = new RegExp(pid);
		for (var i=this.ovrObjects.length; i-- > 0; ) {
			if (this.ovrObjects[i] != null) {
				if (re.test(this.ovrObjects[i].pid)) {
					this.ovrObjects[i].removeFromMap();
					delete this.ovrObjects[i];
					this.ovrObjects[i] = null;
					this.ovrObjects.splice(i,1);
				}
			} else {
				this.ovrObjects.splice(i,1);
			}
		}
	}
}
 
;
/*********************************************************************************
 * kaXmlGraphicElement: Base class for all graphics elements.
 ********************************************************************************/
function kaXmlGraphicElement() {}
;
/**
 * Initialize the graphics element from an XML element
 *
 * point			The parent kaXmlPoint object
 * domElement	The XML DOM element that describe the graphic
 */
kaXmlGraphicElement.prototype.parseElement = function(point, domElement) {}
;
/**
 * Draw the graphics element
 *
 * point		The parent kaXmlPoint object
 */
kaXmlGraphicElement.prototype.draw = function(point) {}

 ;
/**
 * Draw the graphics element
 *
 * point		The parent kaXmlPoint object
 */
kaXmlGraphicElement.prototype.rescale = function(point)
{

}
;
/**
 * Dispose the resources allocated in the graphics element
 *
 * point		The parent kaXmlPoint object
 */
kaXmlGraphicElement.prototype.remove = function(point) {}

;
/*****************************************************************************
 * kaXmlSymbol: Construct a symbol
 ****************************************************************************/
function kaXmlSymbol() {
	kaXmlGraphicElement.apply(this);
	if (_BrowserIdent_hasCanvasSupport())
		kaXmlSymbol.prototype['draw'] = kaXmlSymbol.prototype['draw_canvas'];
	else
		kaXmlSymbol.prototype['draw'] = kaXmlSymbol.prototype['draw_js'];
		
    for (var p in kaXmlGraphicElement.prototype) {
        if (!kaXmlSymbol.prototype[p]) 
            kaXmlSymbol.prototype[p]= kaXmlGraphicElement.prototype[p];
    }
	
	this.shape = "bullet";
	this.size = 10;
  this.stroke = 1;
	this.color = null;
	this.bcolor = null;
	this.opacity = 1;
	
	this.canvas = null;
	this.ldiv = null;
}
;
kaXmlGraphicElement.prototype.rescale = function(point)
{



}
;


kaXmlSymbol.prototype.remove = function(point) {
	this.canvas = null;
	this.ldiv = null;	
}
;
kaXmlSymbol.prototype.parseElement = function(point, domElement) {
	this.shape = domElement.getAttribute("shape");
	this.size = parseInt(domElement.getAttribute("size"));
	var c = domElement.getAttribute("color");
	if (c != null) this.color = c;
	var c = domElement.getAttribute("bcolor");
	if (c != null) this.bcolor = c;
	c = parseFloat(domElement.getAttribute("opacity"));
	if(! isNaN(c)) this.opacity = c; 
	c = parseInt(domElement.getAttribute("stroke"));
	if (! isNaN(c)) this.stroke = c;
}
;
kaXmlSymbol.prototype.draw_js = function(point) {
	var jsgObject = new jsGraphics(point.divId); 
	var d = this.size / 2;     

	jsgObject.setStroke(this.stroke);

	if (this.shape == 'square') {
	
		if (this.color) {
			jsgObject.setColor(this.color);
			jsgObject.fillRect(-d, -d, this.size, this.size);
		}	
		if (this.bcolor) {
			jsgObject.setColor(this.bcolor);
			jsgObject.fillRect(-d, -d, this.size, this.size);
		}	
		
	} else {
		
		if (this.color) {
			jsgObject.setColor(this.color);
			jsgObject.fillEllipse(-d, -d, this.size, this.size);
		}	
		if (this.bcolor) {
			jsgObject.setColor(this.bcolor);
			jsgObject.drawEllipse(-d, -d, this.size, this.size);
		}	
	}
	
	jsgObject.paint();
}
;
kaXmlSymbol.prototype.draw_canvas = function(point) {
	var d = Math.floor((this.size + this.stroke) / 2);     
	
	if (this.canvas == null) {
		this.ldiv = document.createElement( 'div' );
		this.ldiv.style.position = 'absolute';
	    this.ldiv.style.left = -d+'px';
	    this.ldiv.style.top = -d+'px';
		point.div.appendChild(this.ldiv);
		this.canvas = _BrowserIdent_newCanvas(this.ldiv);
		_BrowserIdent_setCanvasHW(this.canvas,d*2,d*2);
	} 
	
	var ctx = _BrowserIdent_getCanvasContext(this.canvas);
	ctx.save();
	//alert("Point("+point.pid+") Size("+this.size+") D("+d+")");
	
	ctx.translate(d,d);
	ctx.globalAlpha = this.opacity;
	ctx.lineWidth = this.stroke;
	if (this.bcolor) ctx.strokeStyle = this.bcolor;	
	if (this.color) ctx.fillStyle = this.color;
	
	if (this.shape == 'square') {
		if (this.color) ctx.fillRect(-this.size/2.0,-this.size/2.0,this.size,this.size);
		if (this.bcolor) ctx.strokeRect(-this.size/2.0,-this.size/2.0,this.size,this.size);
	} else {
		ctx.beginPath();
		ctx.arc(0,0,this.size/2.0,0,Math.PI*2,false);
		if (this.color) ctx.fill();	
		if (this.bcolor) ctx.stroke();	
	}
	ctx.restore();
}
;
/**
 * Construct a geographic feature
 */
function kaXmlFeature( point ) {
	kaXmlGraphicElement.apply(this);
    for (var p in kaXmlGraphicElement.prototype) {
        if (!kaXmlFeature.prototype[p]) 
            kaXmlFeature.prototype[p]= kaXmlGraphicElement.prototype[p];
    }
    
    this.stroke = 1;
    this.color = null;
    this.bcolor = null;
    this.opacity = 1;

	this.cxmin = 0;
	this.cymax = 0;
	this.cymin = 0;
	this.cxmax = 0;
	this.coords = "";
	this.img = null;
	this.canvas = null;
	this.ldiv = null;	
	this.xn = null;
	this.yn = null;
	
	// Calculate the min cellSize
	var map = point.xml_overlay.kaMap.getCurrentMap();
	var scales = map.getScales();
	this.maxScale = scales[scales.length - 1];
	this.mcs = point.xml_overlay.kaMap.cellSize / (point.xml_overlay.kaMap.getCurrentScale() / this.maxScale);
}
;
kaXmlFeature.prototype.remove = function(point) {
	this.img = null;
	this.canvas = null;
	this.ldiv = null;
	this.coords = null;	
	this.xn.splice(0);
	this.yn.splice(0);
}
;
	
kaXmlFeature.prototype.parseElement = function(point, domElement) {
	var t;
	t = parseInt(domElement.getAttribute("stroke"));
	if (! isNaN(t)) this.stroke = t;
	t = domElement.getAttribute("color");
	if (t != null) this.color = t;
	t = domElement.getAttribute("bcolor");
	if (t != null) this.bcolor = t;
	t = parseFloat(domElement.getAttribute("opacity"));
	if(! isNaN(t)) this.opacity = t; 
	
	var text = "";
	if (domElement.firstChild != null) {
		text = domElement.firstChild.data;
		this.readCoordinates(point, text);	
	}
}
;
/**
 * Read the feature coordinates from a string 
 *
 *   x0 y0, x1 y1, [...], xn yn
 */
kaXmlFeature.prototype.readCoordinates = function(point, text) {
	var cx = new Array();
	var cy = new Array();
	var pp = text.split(',');
	var i;
	for (i=0; i<pp.length; i++) {
		var s = pp[i];
		var xy = s.match(/[-\+\d\.]+/g);
		if (xy != null) {
			var x=parseFloat(xy[0]);
			var y=parseFloat(xy[1]);
			cx.push(x);
			cy.push(y);
		}
	}
	
	this.setCoordinates(point,cx,cy);
}
;
/**
 * Set the coordinates of the feature.
 * 
 * xArray	Ordered array of x coordinates (float)
 * yArray	Ordered array of y coordinates (float)
 */
kaXmlFeature.prototype.setCoordinates = function(point, xArray, yArray) {
	this.cxmin = 0;
	this.cymax = 0;
	this.cymin = 0;
	this.cxmax = 0;
	this.coords = "";
	var i;
	for (i=0; i<xArray.length; i++) {
		var x=xArray[i];
		var y=yArray[i];
		if (i==0 || x<this.cxmin) this.cxmin = x;
		if (i==0 || y>this.cymax) this.cymax = y;
		if (i==0 || y<this.cymin) this.cymin = y;
		if (i==0 || x>this.cxmax) this.cxmax = x;
	}
	
	this.xn = new Array();
	this.yn = new Array();
	
	// Normalize the coordinates
	for (i=0; i<xArray.length; i++) {
		var x = (xArray[i] - this.cxmin) / this.mcs;
		var y = (this.cymax - yArray[i]) / this.mcs;
		if (i>0) this.coords += ",";
			this.coords += Math.round(x)+","+Math.round(y);
		this.xn.push(x);
		this.yn.push(y);
	}
}
;
kaXmlFeature.prototype.rescale = function(point) {
	this.draw(point);
}


/**
 * Construct a linestring 
 */
function kaXmlLinestring( point ) {
	kaXmlFeature.apply(this, [point]);
	
	if (_BrowserIdent_hasCanvasSupport())
		kaXmlLinestring.prototype['draw'] = kaXmlLinestring.prototype['draw_canvas'];
	else
		kaXmlLinestring.prototype['draw'] = kaXmlLinestring.prototype['draw_server'];	
	
    for (var p in kaXmlFeature.prototype) {
        if (!kaXmlLinestring.prototype[p]) 
            kaXmlLinestring.prototype[p]= kaXmlFeature.prototype[p];
    }
}
;
kaXmlLinestring.prototype.draw_server = function(point) {
	var xy = point.xml_overlay.kaMap.geoToPix( this.cxmin, this.cymax );
	var x0 = xy[0];
	var y0 = xy[1];
	
	xy = point.xml_overlay.kaMap.geoToPix( point.div.lon, point.div.lat );
	var xr = xy[0];
	var yr = xy[1];
	
	var border = 5;
	
	if (this.img == null) {
    		this.img = document.createElement( 'img' );
	    point.div.appendChild( this.img );
	    this.img.style.position = 'absolute';
	}
	
    this.img.style.top = (y0 - yr - border)+'px';
    this.img.style.left = (x0 - xr - border)+'px';
    var scf = point.xml_overlay.kaMap.getCurrentScale() / this.maxScale;
    var it = _BrowserIdent_getPreferredImageType();
    var u = point.xml_overlay.kaMap.server+"/XMLOverlay/drawgeom.php?gt=L&st="+this.stroke+"&bp="+border+"&sc="+scf+"&cl="+this.coords;
    if (this.color != null) u += "&lc="+escape(this.color);
    if (it == "P") {
    		u += "&it=P";
    } else {
    		u += "&it=G";
    }
    if (_BrowserIdent_getPreferredOpacity() == "server") {
    		if (this.opacity < 1) u += "&op="+(this.opacity*100);
    } else {
    		if (this.opacity < 1) _BrowserIdent_setOpacity(this.img, this.opacity);
    }
    this.img.src = u;
}
;
kaXmlLinestring.prototype.draw_canvas = function(point) {
	var xy = point.xml_overlay.kaMap.geoToPix( this.cxmin, this.cymax );
	var x0 = xy[0];
	var y0 = xy[1];
	
	xy = point.xml_overlay.kaMap.geoToPix( this.cxmax, this.cymin );
	var x1 = xy[0];
	var y1 = xy[1];
	
	xy = point.xml_overlay.kaMap.geoToPix( point.div.lon, point.div.lat );
	var xr = xy[0];
	var yr = xy[1];
	
	var border = 5;
    var scf = point.xml_overlay.kaMap.getCurrentScale() / this.maxScale;
	
	var sizex = (x1 - x0) + (border*2);
	var sizey = (y1 - y0) + (border*2);
	
	if (this.canvas == null) {
		this.ldiv = document.createElement( 'div' );
		this.ldiv.style.position = 'absolute';
		point.div.appendChild(this.ldiv);
		this.canvas = _BrowserIdent_newCanvas(this.ldiv);
	} 
	
    this.ldiv.style.left = (x0 - xr - border)+'px';
	this.ldiv.style.top = (y0 - yr - border)+'px';
	_BrowserIdent_setCanvasHW(this.canvas,sizey,sizex);
	
	var ctx = _BrowserIdent_getCanvasContext(this.canvas);
	ctx.save();
	ctx.clearRect(0, 0, sizex, sizey);
	ctx.translate(border,border);
	ctx.strokeStyle = this.color;
	ctx.globalAlpha = this.opacity;
	ctx.lineWidth = this.stroke;
	ctx.beginPath();
	ctx.moveTo(this.xn[0]/scf, this.yn[0]/scf);
	
	var i;
	for (i=1; i<this.xn.length; i++) {
		ctx.lineTo(this.xn[i]/scf, this.yn[i]/scf);
	}
	ctx.stroke();
	ctx.restore();
}
;
/**
 * Construct a Polygon from the XML element
 */
function kaXmlPolygon( point ) {
	kaXmlFeature.apply(this, [point]);
	
	if (_BrowserIdent_hasCanvasSupport())
		kaXmlPolygon.prototype['draw'] = kaXmlPolygon.prototype['draw_canvas'];
	else
		kaXmlPolygon.prototype['draw'] = kaXmlPolygon.prototype['draw_server'];
	
    for (var p in kaXmlFeature.prototype) {
        if (!kaXmlPolygon.prototype[p]) 
            kaXmlPolygon.prototype[p]= kaXmlFeature.prototype[p];
    }
}
;
kaXmlPolygon.prototype.draw_server = function(point) {
	var xy = point.xml_overlay.kaMap.geoToPix( this.cxmin, this.cymax );
	var x0 = xy[0];
	var y0 = xy[1];
	
	xy = point.xml_overlay.kaMap.geoToPix( point.div.lon, point.div.lat );
	var xr = xy[0];
	var yr = xy[1];
	
	var border = 5;
	
	if (this.img == null) {
    		this.img = document.createElement( 'img' );
	    this.img.style.position = 'absolute';
	    point.div.appendChild( this.img );
	}
	
    var scf = point.xml_overlay.kaMap.getCurrentScale() / this.maxScale;
    var it = _BrowserIdent_getPreferredImageType();
    var u = point.xml_overlay.kaMap.server+"/XMLOverlay/drawgeom.php?gt=P&st="+this.stroke+"&bp="+border+"&sc="+scf+"&cl="+this.coords;
    if (this.color != null) u += "&fc="+escape(this.color);
    if (this.bcolor != null && this.bcolor != "") u += "&lc="+escape(this.bcolor);
    if (it == "P") {
    		u += "&it=P";
    } else {
    		u += "&it=G";
    }
    if (_BrowserIdent_getPreferredOpacity() == "server") {
    		if (this.opacity < 1) u += "&op="+(this.opacity*100);
    } else {
    		if (this.opacity < 1) _BrowserIdent_setOpacity(this.img, this.opacity);
    }
    
    this.img.style.top = (y0 - yr - border)+'px';
    this.img.style.left = (x0 - xr - border)+'px';
    
    this.img.src = u;
}
;
kaXmlPolygon.prototype.draw_canvas = function(point) {
	var xy = point.xml_overlay.kaMap.geoToPix( this.cxmin, this.cymax );
	var x0 = xy[0];
	var y0 = xy[1];
	
	xy = point.xml_overlay.kaMap.geoToPix( this.cxmax, this.cymin );
	var x1 = xy[0];
	var y1 = xy[1];
	
	xy = point.xml_overlay.kaMap.geoToPix( point.div.lon, point.div.lat );
	var xr = xy[0];
	var yr = xy[1];
	
	var border = 5;
    var scf = point.xml_overlay.kaMap.getCurrentScale() / this.maxScale;
	
	var sizex = (x1 - x0) + (border*2);
	var sizey = (y1 - y0) + (border*2);
	
	if (this.canvas == null) {
		this.ldiv = document.createElement( 'div' );
		this.ldiv.style.position = 'absolute';
		point.div.appendChild(this.ldiv);
		this.canvas = _BrowserIdent_newCanvas(this.ldiv);
	} 
	
    this.ldiv.style.left = (x0 - xr - border)+'px';
	this.ldiv.style.top = (y0 - yr - border)+'px';
	_BrowserIdent_setCanvasHW(this.canvas,sizey,sizex);
	
	var ctx = _BrowserIdent_getCanvasContext(this.canvas);
	ctx.save();
	ctx.clearRect(0, 0, sizex, sizey);
	ctx.translate(border,border);
    if (this.color != null) ctx.fillStyle = this.color;
    if (this.bcolor != null && this.bcolor != "") ctx.strokeStyle = this.bcolor;
	ctx.globalAlpha = this.opacity;
	ctx.lineWidth = this.stroke;
	ctx.beginPath();
	ctx.moveTo(this.xn[0]/scf, this.yn[0]/scf);
	
	var i;
	for (i=1; i<this.xn.length; i++) {
		ctx.lineTo(this.xn[i]/scf, this.yn[i]/scf);
	}
	
	if (this.color != null) ctx.fill();
	if (this.bcolor != null && this.bcolor != "") ctx.stroke();
	ctx.restore();
}
;
/**
 * Construct a label from the XML element
 */
function kaXmlLabel() {
	kaXmlGraphicElement.apply(this);
    for (var p in kaXmlGraphicElement.prototype) {
        if (!kaXmlLabel.prototype[p]) 
            kaXmlLabel.prototype[p]= kaXmlGraphicElement.prototype[p];
    }
	
	this.text = "";
	this.color = "black";
	this.boxcolor = null;
	this.w = 0;
	this.h = 0;
	this.xoff = 0;
	this.yoff = 0;
	this.fsize = "10px";
	this.font = "Arial";
	this.ldiv = null;
	this.ltxt = null;
}
;
kaXmlLabel.prototype.remove = function(point) {
	this.canvas = null;
	this.ldiv = null;	
	this.ltxt = null;
}
;
kaXmlLabel.prototype.parseElement = function(point, domElement) {
	if (domElement.firstChild != null) {
		this.text = domElement.firstChild.data;
	}

	var t;		
	t = domElement.getAttribute("color");
	if (t != null) {
		this.color = t;
	}
	this.boxcolor = domElement.getAttribute("boxcolor");
	t = parseInt(domElement.getAttribute("w"));
	if (!isNaN(t)) {
		this.w = t;
	}
	t = parseInt(domElement.getAttribute("h"));
	if (!isNaN(t)) {
		this.h = t;
	}
	t = parseInt(domElement.getAttribute("px"));
	if (!isNaN(t)) {
		this.xoff = t;
	}
	t = parseInt(domElement.getAttribute("py"));
	if (!isNaN(t)) {
		this.yoff = t;
	}
	t = domElement.getAttribute("fsize");
	if (t != null) {
		this.fsize = t;
	}
	t = domElement.getAttribute("font");
	if (t != null) {
		this.font = t;
	}	
}
;
kaXmlLabel.prototype.draw = function(point) {
	var x = this.xoff + 10;
	var y = this.yoff - 5;

	this.ldiv = document.createElement( 'div' );

  this.ldiv.style.fontWeight = 'bold';
  this.ldiv.style.fontFamily = this.font;
	this.ldiv.style.fontSize = this.fsize;
	this.ldiv.style.textAlign = 'left';
	this.ldiv.style.color = this.color;
  this.ldiv.style.left = x+'px';
  this.ldiv.style.top = y+'px';
	this.ldiv.style.position = 'absolute';
	if (this.boxcolor != null) this.ldiv.style.backgroundColor = this.boxcolor;
	if (this.w>0) this.ldiv.style.width = this.w+'px';
	else this.ldiv.style.whiteSpace = 'nowrap';
	if (this.h>0) this.ldiv.style.height = this.h+'px';
	this.ldiv.style.opacity = 0.65;
	this.ldiv.style.filter = 'alpha(opacity=65)';
	this.ldiv.style.padding = '2px 2px 2px ';


	this.ltxt = document.createTextNode(this.text);
	this.ldiv.appendChild( this.ltxt );


	var escalaNumerica = document.getElementById('escalaNumerica');
  var numEscla = parseInt(escalaNumerica.innerHTML.substr(
                    escalaNumerica.innerHTML.lastIndexOf(':') + 1 ));
  if( numEscla < MinEscalaLabels)
      	this.ldiv.style.visibility = 'visible';
  else 	this.ldiv.style.visibility = 'hidden';
         

	
	
	point.div.appendChild( this.ldiv );
	
}
;
/**
 * Construct an icon
 */
function kaXmlIcon() {
	kaXmlGraphicElement.apply(this);
	if (_BrowserIdent_hasCanvasSupport())
		kaXmlIcon.prototype['draw'] = kaXmlIcon.prototype['draw_canvas'];
	else
		kaXmlIcon.prototype['draw'] = kaXmlIcon.prototype['draw_plain'];
	
	
	if (navigator.appName == "Microsoft Internet Explorer")
	{
		kaXmlIcon.prototype['draw'] = kaXmlIcon.prototype['draw_plain'];
	}
	
	
    for (var p in kaXmlGraphicElement.prototype) {
        if (!kaXmlIcon.prototype[p]) 
            kaXmlIcon.prototype[p]= kaXmlGraphicElement.prototype[p];
    }
    
	this.icon_src = null;
	this.icon_w = 0;
	this.icon_h = 0;
	this.xoff = 0;
	this.yoff = 0;
	this.rot = 0;
	this.ldiv = null;	
	this.img = null;	
	this.canvas = null;
}
;
kaXmlIcon.prototype.remove = function(point) {
	this.ldiv = null;	
	this.canvas = null;
	if (this.img) this.img.onload = null;
	this.img = null;	
}
;
kaXmlIcon.prototype.parseElement = function(point, domElement) {
	this.icon_src = point.xml_overlay.urlNormalize(domElement.getAttribute("src"));
	this.icon_w = parseInt(domElement.getAttribute("w"));
	this.icon_h = parseInt(domElement.getAttribute("h"));
	var t;
	t = parseInt(domElement.getAttribute("px"));
	if (!isNaN(t)) {
		this.xoff = t;
	}
	t = parseInt(domElement.getAttribute("py"));
	if (!isNaN(t)) {
		this.yoff = t;
	}
	t = parseInt(domElement.getAttribute("rot"));
	if (!isNaN(t)) {
		this.rot = t;
	}
}
;


function onClickKaXmlIcon()
{
	var aCategoria = this.point.pid.split('@@@')[0];
	var oId = this.point.idelto;
	mostrarInfoMapaById( oId, aCategoria);
}


kaXmlIcon.prototype.draw_canvas = function(point) {
	var dx = -this.icon_w / 2 + this.xoff;     
	var dy = -this.icon_h / 2 + this.yoff;     
	
	if (this.canvas == null) {
		this.ldiv = document.createElement( 'div' );
		this.ldiv.style.position = 'absolute';
	    this.ldiv.style.top = dy+'px';
    	this.ldiv.style.left = dx+'px';
		
		if(point.idelto.indexOf('M0') < 0)
		{
			point.div.onclick = onClickKaXmlIcon;
			
			point.div.style.cursor = "pointer";
			point.div.title = point.pid.split('@@@')[1]  
			+ ' (faga click para acceder a ficha)';
		}
		
		point.div.point = point;
		
		point.div.appendChild(this.ldiv);
		this.canvas = _BrowserIdent_newCanvas(this.ldiv);
		_BrowserIdent_setCanvasHW(this.canvas,this.icon_h+4,this.icon_w+4);
		
	} 
	
	var ctx = _BrowserIdent_getCanvasContext(this.canvas);
	ctx.save();
    ctx.translate(-dx,-dy);
    ctx.rotate(this.rot * Math.PI/180);
    this.img = new Image();
    this.img.src = this.icon_src;
    var timg = this.img;
    var tw = this.icon_w;
    var th = this.icon_h;
	this.img.onload = function() {
		ctx.drawImage(timg, dx, dy, tw, th);
		ctx.restore();
	}
}
;
kaXmlIcon.prototype.draw_plain = function(point) {
	var dx = -this.icon_w / 2 + this.xoff;     
	var dy = -this.icon_h / 2 + this.yoff;     
	
    this.ldiv = document.createElement( 'div' );
    this.ldiv.style.position = 'absolute';
    this.ldiv.style.top = dy+'px';
    this.ldiv.style.left = dx+'px';
    
    this.img = document.createElement( 'img' );
    this.img.src = this.icon_src;
    //img.class = 'png24';
    this.img.width = this.icon_w;
    this.img.height = this.icon_h;
    
    this.ldiv.appendChild( this.img );
    point.div.appendChild( this.ldiv );
	
	if(point.idelto.indexOf('M0') < 0)
	{
		point.div.onclick = onClickKaXmlIcon;	
	
		point.div.style.cursor = "pointer";
		point.div.title = point.pid.split('@@@')[1]  
			+ ' (faga click para acceder a ficha)';
		this.img.title = point.pid.split('@@@')[1]  
			+ ' (faga click para acceder a ficha)';
		this.ldiv.title = point.pid.split('@@@')[1]  
			+ ' (faga click para acceder a ficha)';
	}
	
	point.div.point = point;
}
;
/********************************************************************************
 * This object is a single point on the overlay. The object hold the div
 * and all the stuff to draw and move the point (symbol, label, icon, etc.).
 * pid:	The point ID (string)
 * xml_overlay:	The kaXmlOverlay object owner of this point
 ********************************************************************************/
function kaXmlPoint(pid, xml_overlay) {
	this.xml_overlay = xml_overlay;
	this.pid = pid;
	this.divId = this.xml_overlay.getDivId(pid);
	this.geox = 0;
	this.geoy = 0;
	this.shown = false;
	
	this.idelto = '000';
	
	this.graphics = new Array();
	
	this.div = document.createElement('div');
	this.div.setAttribute('id', this.divId);
}
;
/**
 * Show the point in the specified geo-position.
 */
kaXmlPoint.prototype.placeOnMap = function( x, y ) {
	if (!this.shown) {
		this.geox = x;
		this.geoy = y;
		this.xml_overlay.kaMap.addObjectGeo( this.xml_overlay.overlayCanvas, x, y, this.div );
		this.shown = true;
	} 
}
;
/**
 * Delete the point.
 */
kaXmlPoint.prototype.removeFromMap = function( ) {
	if (this.shown) {
		this.xml_overlay.kaMap.removeObject( this.div );
		this.shown = false;
	}
	
	var i;
	for (i=0; i<this.graphics.length; i++) {
		this.graphics[i].remove(this);
	}
	
	this.graphics.splice(0);
	
	this.div = null;
	this.xml_overlay = null;
}
;
/**
 * Move the point in the specified geo-position.
 */
kaXmlPoint.prototype.setPosition = function( x, y ) {
	if (this.shown) {
		this.geox = x;
		this.geoy = y;
		this.div.lat = y;
		this.div.lon = x;
	}
}
;
/**
 * Add a new kaXmlGraphicElement to this kaXmlPoint.
 * kaXmlGraphicElement subclasses are:
 *  
 *  kaXmlSymbol
 *  kaXmlIcon
 *  kaXmlLabel
 *  kaXmlLinestring
 *  kaXmlPolygon
 *
 * obj	an object of class kaXmlGraphicElement
 */
kaXmlPoint.prototype.addGraphic = function( obj ) {
		this.graphics.push(obj);
		obj.draw(this);
}
;
/**
 * Clear all the graphic elements of this kaXmlPoint.
 */
kaXmlPoint.prototype.clear = function() {
	this.div.innerHTML = "";
	this.graphics.length = 0;
	//this.graphics = new Array();
}
;
/**
 * Set the HTML content of this kaXmlPoint.
 * This function delete any other content of the point.
 *
 * ihtml		A string containing the HTML
 */
kaXmlPoint.prototype.setInnerHtml = function(ihtml) {
	this.clear();
	this.div.innerHTML = ihtml;
}
;
/**
 * Parse the XML fragment describing the point. Then draw or translate
 * the point on the map.
 *
 * point_element	 A DOM element <point>
 */
kaXmlPoint.prototype.parse = function(point_element) {

	var i;
	var x = parseFloat(point_element.getAttribute("x"));
	var y = parseFloat(point_element.getAttribute("y"));
	
	
	this.idelto = point_element.getAttribute("idelto");
	
	
	var redraw_a = point_element.getAttribute("redraw");
	var redraw = false;
	if (redraw_a == "true")	redraw = true;
			
	if (!this.shown) {
		this.placeOnMap(x,y);
		this.shown = true;
	} else {
		this.setPosition(x,y);
		
		// Need redraw?
		if (!redraw) return;
		
		// clear and redraw the point
		this.clear();
	}
		
	// look for ihtml element
	var ihtml_element = point_element.getElementsByTagName("ihtml");
	for (i=0; i<ihtml_element.length; i++) {
		this.div.innerHTML = ihtml_element[i].firstChild.nodeValue;
	}
	
	var t;
	var elements;
	
	// look for symbol element
	elements = point_element.getElementsByTagName("symbol");
	for (i=0; i<elements.length; i++) {
		t = new kaXmlSymbol();
		t.parseElement(this, elements[i]);
		this.addGraphic(t);
	}
	
	// look for icon element
	elements = point_element.getElementsByTagName("icon");
	for (i=0; i<elements.length; i++) {
		t = new kaXmlIcon();
		t.parseElement(this, elements[i]);
		this.addGraphic(t);
	}

	// look for label element
	elements = point_element.getElementsByTagName("label");
	for (i=0; i<elements.length; i++) {
		t = new kaXmlLabel();
		t.parseElement(this, elements[i]);
		this.addGraphic(t);
	}
	
	// look for linestring element
	elements = point_element.getElementsByTagName("linestring");
	for (i=0; i<elements.length; i++) {
		t = new kaXmlLinestring(this);
		t.parseElement(this, elements[i]);
		this.addGraphic(t);
	}
	
	// look for polygon element
	elements = point_element.getElementsByTagName("polygon");
	for (i=0; i<elements.length; i++) {
		t = new kaXmlPolygon(this);
		t.parseElement(this, elements[i]);
		this.addGraphic(t);
	}
}
;
kaXmlPoint.prototype.rescale = function(point_element) {
	var i;
	for (i=0; i<this.graphics.length; i++) {
		this.graphics[i].rescale(this);
	}
}
;
/**************************************************************/


var _BrowserIdent_browser = null;
var _BrowserIdent_version = null;
var _BrowserIdent_place = 0;
var _BrowserIdent_thestring = null;
var _BrowserIdent_detect = null;

function _BrowserIdent() {
	_BrowserIdent_detect = navigator.userAgent.toLowerCase();

	if (_BrowserIdent_checkIt('konqueror')) {
		_BrowserIdent_browser = "Konqueror";
	} else if (_BrowserIdent_checkIt('safari')) _BrowserIdent_browser = "Safari";
	else if (_BrowserIdent_checkIt('omniweb')) _BrowserIdent_browser = "OmniWeb";
	else if (_BrowserIdent_checkIt('opera')) _BrowserIdent_browser = "Opera"
	else if (_BrowserIdent_checkIt('webtv')) _BrowserIdent_browser = "WebTV";
	else if (_BrowserIdent_checkIt('icab')) _BrowserIdent_browser = "iCab";
	else if (_BrowserIdent_checkIt('msie')) _BrowserIdent_browser = "Internet Explorer";
	else if (_BrowserIdent_checkIt('firefox')) _BrowserIdent_browser = "Firefox";
	else if (!_BrowserIdent_checkIt('compatible')) {
		_BrowserIdent_browser = "Netscape Navigator"
		_BrowserIdent_version = _BrowserIdent_detect.charAt(8);
	} else _BrowserIdent_browser = "An unknown browser";

	if (!_BrowserIdent_version) _BrowserIdent_version = _BrowserIdent_detect.charAt(_BrowserIdent_place + _BrowserIdent_thestring.length);
	
	//alert(navigator.userAgent+"\nBrowser["+_BrowserIdent_browser+"] Version["+_BrowserIdent_version+"]");
}

function _BrowserIdent_checkIt(string) {
	_BrowserIdent_place = _BrowserIdent_detect.indexOf(string) + 1;
	_BrowserIdent_thestring = string;
	return _BrowserIdent_place;
}

function _BrowserIdent_setOpacity(imageobject, opacity) {
	if (opacity == undefined || opacity >= 1) return '';
	if (_BrowserIdent_browser == "Netscape Navigator")
		imageobject.style.MozOpacity=opacity;
	else if (_BrowserIdent_browser == "Internet Explorer" && parseInt(this.version)>=4) {
		//filter: alpha(opacity=50);
		var tmp = imageobject.style.cssText;
		tmp = "filter: alpha(opacity="+(opacity*100)+");" + tmp;
		imageobject.style.cssText = tmp;
	} else {
		var tmp = imageobject.style.cssText;
		tmp = "opacity: "+opacity+";" + tmp;	
		imageobject.style.cssText = tmp;
	}
}

function _BrowserIdent_getPreferredImageType() {
	if (_BrowserIdent_browser == "Netscape Navigator") return "P";
	else if (_BrowserIdent_browser == "Opera") return "P";
	else if (_BrowserIdent_browser == "Firefox") return "P";
	else if (_BrowserIdent_browser == "Safari") return "P";
	else if (_BrowserIdent_browser == "Konqueror") return "P";
	else return "G"
}

function _BrowserIdent_getPreferredOpacity() {
	if (_BrowserIdent_browser == "Netscape Navigator") return "server";
	else if (_BrowserIdent_browser == "Firefox") return "server";
	else if (_BrowserIdent_browser == "Opera") return "server";
	else if (_BrowserIdent_browser == "Konqueror") return "server";
	else return "client"
}

var xmlOverlayUseCanvas = true;

function _BrowserIdent_hasCanvasSupport() {

	if (! xmlOverlayUseCanvas) return false;
	
	if (_BrowserIdent_browser == "Internet Explorer") return true;
	if (_BrowserIdent_browser == "Firefox") return true;
	if (_BrowserIdent_browser == "Safari") return true;
	//if (_BrowserIdent_browser == "Konqueror") return true;
	//if (_BrowserIdent_browser == "Opera") return true;
	
	return false;
}

function _BrowserIdent_newCanvas(parentNode) {
	var el = document.createElement('canvas');
	parentNode.appendChild(el);
	if (typeof G_vmlCanvasManager != "undefined") {
		el = G_vmlCanvasManager.initElement(el);
	}
	return el;
}

function _BrowserIdent_getCanvasContext(canvas) {
	return canvas.getContext('2d');
}

function _BrowserIdent_setCanvasHW(canvas, height, width) {
		canvas.width = width; 
		canvas.height = height;
}

_BrowserIdent();


/**********************************************************************
 *
 * $Id: kaToolTip.js,v 1.3 2006/08/08 20:51:35 lbecchi Exp $
 *
 * purpose: manage simple tool tips for ka-Map (bug 1374)
 *         
 *
 * author: Lorenzo Becchi & Andrea Cappugi
 *
 * TODO:
 *   - 
 * 
 **********************************************************************
 *
 * Copyright (c)  2006, ominiverdi.org
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 * DEALINGS IN THE SOFTWARE.
 *
 **********************************************************************/

/******************************************************************************
 * kaToolTip - 
 *
 * To use kaToolTip:
 * 
 * 1) add a script tag to your page:
 * 
 *   <script type="text/javascript" src="tools/kaToolTip.js"></script>
 * 
 * 2) create a new instance of kaToolTip
 * 
 *   var toolTip = new kaToolTip( oMap);
 * 
 * 3) if you want you can set an image (as the tip pointer)
 * 
 *   var offsetX=-6;//offset to move the image left-right
 *   var offsetY=-19;//offset to move the image top-bottom
 *   toolTip.setTipImage('images/tip-red.png',offsetX,offsetY);
 * 
 * 4) Set text
 * 
 *   toolTip.setText('Some text inside the tooltip');
 * 
 * 6) add it to the map
 * 
 *   toolTip.move(x,y);  //pixel coords
 * 
 * or by geo coords:
 * 
 *  toolTip.moveGeo(x,y); //geo coords
 * 
 * 7) hide the tooltip
 * 
 *  toolTip.move();
 * 
 *
 * 
 *
 *****************************************************************************/
 
 function kaToolTip( oKaMap ){
    this.kaMap = oKaMap;
    
    this.image = null;

    this.domObj = null;
    
    this.viewport = this.kaMap.domObj;
    
    this.visible= false;
    
    this.init();


 };
 
 kaToolTip.prototype.eliminarKaToolTip = function()
 {
	this.domObj.style.visibility = 'hidden';
	this.visible = false;
	this.idFonte = null;
	this.minZindex--;
                            
    if ( this.domObj.lastChild.id != "toolTipImage" ) {
     this.domObj.lastChild.outerHTML = '';
    }
   else {  
         this.domObj.innerHTML = '';    
   }
   this.domObj.textContent = '';
   //var tesi�o = 0;
 }
 
/**
 * wmsLayer.addRequestParameter( name, parameter )
 *
 * add a parameter to the baseURL safely by checking to see if the parameter
 * exists already.  This is an internal function not intended to be used
 * by other code.
 */
kaToolTip.prototype.init = function(){
	if (getRawObject('tooltip'))
		this.domObj = getRawObject('tooltip');
	else
	{
		this.domObj = document.createElement('div');
		this.domObj.setAttribute('id', 'toolTip');
		this.domObj.style.visibility = 'visible';
	}
	
	this.minZindex = 1;
	this.coordX = null;
	this.coordY = null;
	this.idFonte = null;
	
	
	this.viewport.appendChild(this.domObj);	
	this.domObj.style.position='absolute';

	/*Style features*/
	this.move();
	this.domObj.toolTip=this;
	this.domObj.style.zIndex=this.minZindex;

	
	/*Position features*/
	//this.domObj.onclick=this.onclick;
	
//	this.setText('Espera un momento!');
	this.kaMap.registerForEvent( KAMAP_MAP_CLICKED, this, this.onclick );
	this.kaMap.registerForEvent( KAMAP_EXTENTS_CHANGED, this, this.extentChanged );
	//this.KaMap.registerForEvent( KAMAP_MOUSE_TRACKER, this, this.onclick );
	

};


kaToolTip.prototype.onclick=function(e){
 e = (e)?e:((event)?event:null);
//this.move();

};

kaToolTip.prototype.setText = function(text){
                            
	if ( this.domObj.lastChild.id != "toolTipImage" )
     this.domObj.lastChild.outerHTML = text;
   else   
	     this.domObj.innerHTML += text;    
	  
		
};

kaToolTip.prototype.setTipImage = function(url,offsetX,offsetY){
	offsetX = (offsetX)?offsetX:0;
	offsetY = (offsetX)?offsetY:0;
	var img = this.domObj.getElementsByTagName('IMG');
	
	var image = document.createElement('img');
	
	if (img.length > 0)
		image = img[0];

	image.src=url;
	image.setAttribute('id', 'toolTipImage');
	image.style.opacity = "0.75";
	//image.style.position='absolute';
	image.style.zIndex=this.minZindex++;
	//image.style.top='-200px';
	//image.style.left='-200px';
	image.offsetX=offsetX;
	image.offsetY=offsetY;
	
	this.image = 	image;
	
	
	this.domObj.appendChild(image);
	
	
};

//move the tooltip using geo coords
kaToolTip.prototype.moveGeo = function(){
//(int [x],int [y])
	var x = parseInt(arguments[0]);
	var	y = parseInt(arguments[1]);
	
	var pixPos = this.kaMap.geoToPix(x,y);
	var nPixPos = this.kaMap.currentTool.adjustPixPosition( pixPos[0]*(-1), pixPos[1]*(-1) );
	var newX = nPixPos[0];
	var newY = nPixPos[1];

	
	//Calculo yo mis propias coordenadas en pixeles ya que la funcion del KaMap
	var extents = myKaMap.getGeoExtents();
	
	var ancho = extents[2] - extents[0];
	var alto = extents[3] - extents[1];
	
	var anchoViewport = parseInt(document.getElementById('viewport').style.width);
	var altoViewport = parseInt(document.getElementById('viewport').style.height);
	
	var escalaX = ancho/anchoViewport;
	var escalaY = alto/altoViewport;
	
	var nuevoX = (x - extents[0])/escalaX;
	var nuevoY = (extents[3] - y)/escalaY;
	
	if(arguments[2])
	{
		this.idFonte = arguments[2];
		this.coordX = x;
		this.coordY = y;
	}
	
	//if ((nuevoX > 0) && (nuevoY > 0) && (nuevoX < anchoViewport) && (nuevoY < altoViewport))
		this.move(nuevoX,nuevoY,false,arguments[2]);
};

//move the tooltip in pixel space
kaToolTip.prototype.move = function(){
 
 // (int [x],int [y],bool [noRecenter])
 	var x = 0;
	var y = 0;
	var aPixPos = 0;
	var geoPix = 0;
	var noRecenter = false;
	
	if(arguments.length<2){
		
		/*original position*/
		//this.domObj.style.top='-'+getObjectHeight(this.domObj)+'px';
		//this.domObj.style.left= '-'+getObjectWidth(this.domObj)+'px';
		
		this.visible = false;
		
		this.domObj.style.top='-10000px';
		this.domObj.style.left= '-10000px';
		
		aPixPos = this.kaMap.currentTool.adjustPixPosition( parseInt(x) , parseInt(y) );
		var geoCoords = this.kaMap.pixToGeo( aPixPos[0],aPixPos[1]);
		this.coordX = geoCoords[0];
		this.coordY = geoCoords[1];
		
		//if(this.image)this.image.style.top = '-'+getObjectHeight(this.domObj)+'px';
		//if(this.image)this.image.style.left = '-'+getObjectWidth(this.domObj)+'px';
		if(this.image)this.image.style.top = '-100000px';
		if(this.image)this.image.style.left = '-100000px';
		//alert('move to 0');
	
	} else {
		this.domObj.style.visibility = 'visible';
		x = parseInt(arguments[0]);
		y = parseInt(arguments[1]);
		
		this.visible = true;
		
		//alert('move to:' + x +' ' + y);
		
		if (arguments[3] && arguments[3] != this.idFonte)
		{
			aPixPos = this.kaMap.currentTool.adjustPixPosition( parseInt(x) , parseInt(y) );
			var geoCoords = this.kaMap.pixToGeo( aPixPos[0],aPixPos[1]);
			this.coordX = geoCoords[0];
			this.coordY = geoCoords[1];
		}
		
		//alert('coords: '+this.coordX + ' ' +this.coordY);
		
		this.domObj.style.top=(y+this.image.offsetY)+'px';// -10+'px';//
		this.domObj.style.left=(x+this.image.offsetX)+'px';//-(getObjectWidth(this.domObj)/2)+'px';
		if(this.image)this.image.style.top = (y+this.image.offsetY)+'px';
		if(this.image)this.image.style.left = (x+this.image.offsetX)+'px';
		
		//adesso calcolo se il div sta dentro il viewport 
	 	if((arguments[2])&&arguments[2]==true)noRecenter = true;
		if(!noRecenter)this.recenter(this.domObj);
	}
	

};

kaToolTip.prototype.adjustPosition = function(x,y){
 
var ny =parseInt(this.domObj.style.top)+y;
var nx =parseInt(this.domObj.style.left)+x;
	    
		this.domObj.style.top=ny+'px';//
		this.domObj.style.left=nx+'px';
		if(this.image)this.image.style.top = (parseInt(this.image.style.top)+y)+'px';
		if(this.image)this.image.style.left =(parseInt(this.image.style.left)+x)+'px';


};

kaToolTip.prototype.recenter=function(tip){


	//misuro le diemensioni in pix del tip
	var tipWidth = getObjectWidth(tip);
	var tipHeight = getObjectHeight(tip);
	var tipTop = parseInt(tip.style.top);
	var tipLeft= parseInt(tip.style.left);
	
	//prendo i dati del viewport
	var viewportWheight = tip.toolTip.kaMap.viewportHeight; 
	var viewportWidth   = tip.toolTip.kaMap.viewportWidth;
	//calcolo le posizioni di ogni angolo del tip sul viewport
	
	var topSlide=1;
	var leftSlide=1;
	if((tipTop+tipHeight)>viewportWheight) topSlide=(tipTop+tipHeight)-viewportWheight;
	
	if((tipLeft+tipWidth)>viewportWidth) leftSlide=(tipLeft+tipWidth)-viewportWidth;
	if(tipLeft<0) leftSlide=tipLeft-20;
	if(tipTop<0) topSlide=tipTop-20;
	if(topSlide!=1 || leftSlide!=1){
		
		// tip.toolTip.kaMap.slideBy(-(leftSlide+10), -(topSlide+10));
		  
		 //tip.toolTip.adjustPosition(-(leftSlide+10), -(topSlide+10));
	 }	 

};


kaToolTip.prototype.extentChanged=function(){

	if(document.getElementById('viewport'))
	{
		//Calculo yo mis propias coordenadas en pixeles ya que la funcion del KaMap no funciona del todo correcta
		var extents = myKaMap.getGeoExtents();
	
		var ancho = extents[2] - extents[0];
		var alto = extents[3] - extents[1];
	
		var anchoViewport = parseInt(document.getElementById('viewport').style.width);
		var altoViewport = parseInt(document.getElementById('viewport').style.height);

		var escalaX = ancho/anchoViewport;
		var escalaY = alto/altoViewport;

		var newX = (this.coordX - extents[0])/escalaX;
		var newY = (extents[3] - this.coordY)/escalaY;
	}
	else
	{	
		var pixPos = this.kaMap.geoToPix(this.coordX,this.coordY);
		var nPixPos = this.kaMap.currentTool.adjustPixPosition( pixPos[0]*(-1), pixPos[1]*(-1) );
		var newX =nPixPos[0];
		var newY = nPixPos[1];
	}
	
	this.visible = (!((newX < 0) || (newY < 0)));
			
	if(this.visible)
	{
		this.domObj.style.visibility = 'visible';
		this.move(newX,newY,true);
	}
	else
		this.domObj.style.visibility = 'hidden';
};


function encodeMyHtml(string) {
  encodedHtml = escape(string);
  encodedHtml = encodedHtml.replace("/","%2F");
  encodedHtml = encodedHtml.replace(/\?/g,"%3F");
  encodedHtml = encodedHtml.replace(/=/g,"%3D");
  encodedHtml = encodedHtml.replace(/&/g,"%26");
  encodedHtml = encodedHtml.replace(/@/g,"%40");
  return encodedHtml;
};
  
function urlDecode(sz){
	return unescape(sz).replace(/\+/g," ");
};


/******************************************************************************
 * This file has been modified by Piergiorgio Navone 
 *
 * $Id: excanvas.js,v 1.1 2006/05/31 11:09:08 pspencer Exp $
 *****************************************************************************/

// Copyright 2006 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// TODO: Patterns
// TODO: Radial gradient
// TODO: Clipping paths
// TODO: Coordsize
// TODO: Painting mode
// TODO: Optimize
// TODO: canvas width/height sets content size in moz, border size in ie
// TODO: Painting outside the canvas should not be allowed

// only add this code if we do not already have a canvas implementation
if (!window.CanvasRenderingContext2D) {

(function () {

  var G_vmlCanvasManager_ = {
    init: function (opt_doc) {
      var doc = opt_doc || document;
      if (/MSIE/.test(navigator.userAgent) && !window.opera) {
        var self = this;
        doc.attachEvent("onreadystatechange", function () {
          self.init_(doc);
        });
      }
    },

    init_: function (doc, e) {
      if (doc.readyState == "complete") {
        // create xmlns
        if (!doc.namespaces["g_vml_"]) {
          doc.namespaces.add("g_vml_", "urn:schemas-microsoft-com:vml");
        }

        // setup default css
        var ss = doc.createStyleSheet();
        ss.cssText = "canvas{display:inline-block;overflow:hidden;" +
            "text-align:left;}" +
            "canvas *{behavior:url(#default#VML)}";

        // find all canvas elements
        var els = doc.getElementsByTagName("canvas");
        for (var i = 0; i < els.length; i++) {
          if (!els[i].getContext) {
            this.initElement(els[i]);
          }
        }
      }
    },

    fixElement_: function (el) {
      // in IE before version 5.5 we would need to add HTML: to the tag name
      // but we do not care about IE before version 6
      var outerHTML = el.outerHTML;
      var newEl = document.createElement(outerHTML);
      // if the tag is still open IE has created the children as siblings and
      // it has also created a tag with the name "/FOO"
      if (outerHTML.slice(-2) != "/>") {
        var tagName = "/" + el.tagName;
        var ns;
        // remove content
        while ((ns = el.nextSibling) && ns.tagName != tagName) {
          ns.removeNode();
        }
        // remove the incorrect closing tag
        if (ns) {
          ns.removeNode();
        }
      }
      el.parentNode.replaceChild(newEl, el);
      return newEl;
    },

    /**
     * Public initializes a canvas element so that it can be used as canvas
     * element from now on. This is called automatically before the page is
     * loaded but if you are creating elements using createElement yuo need to
     * make sure this is called on the element.
     * @param el {HTMLElement} The canvas element to initialize.
     */
    initElement: function (el) {
      el = this.fixElement_(el);
      el.getContext = function () {
        if (this.context_) {
          this.context_.m_ = createMatrixIdentity();
          return this.context_;
        }
        return this.context_ = new CanvasRenderingContext2D_(this);
      };

      var self = this; //bind
      el.attachEvent("onpropertychange", function (e) {
        // we need to watch changes to width and height
        switch (e.propertyName) {
          case "width":
          case "height":
            // coord size changed?
            break;
        }
      });

      // if style.height is set

      var attrs = el.attributes;
      if (attrs.width && attrs.width.specified) {
        // TODO: use runtimeStyle and coordsize
        // el.getContext().setWidth_(attrs.width.nodeValue);
        el.style.width = attrs.width.nodeValue + "px";
      }
      if (attrs.height && attrs.height.specified) {
        // TODO: use runtimeStyle and coordsize
        // el.getContext().setHeight_(attrs.height.nodeValue);
        el.style.height = attrs.height.nodeValue + "px";
      }
      //el.getContext().setCoordsize_()
      
      return el;
    }
  };

  G_vmlCanvasManager_.init();

  // precompute "00" to "FF"
  var dec2hex = [];
  for (var i = 0; i < 16; i++) {
    for (var j = 0; j < 16; j++) {
      dec2hex[i * 16 + j] = i.toString(16) + j.toString(16);
    }
  }

  function createMatrixIdentity() {
    return [
      [1, 0, 0],
      [0, 1, 0],
      [0, 0, 1]
    ];
  }

  function matrixMultiply(m1, m2) {
    var result = createMatrixIdentity();

    for (var x = 0; x < 3; x++) {
      for (var y = 0; y < 3; y++) {
        var sum = 0;

        for (var z = 0; z < 3; z++) {
          sum += m1[x][z] * m2[z][y];
        }

        result[x][y] = sum;
      }
    }
    return result;
  }

  function copyState(o1, o2) {
    o2.fillStyle     = o1.fillStyle;
    o2.lineCap       = o1.lineCap;
    o2.lineJoin      = o1.lineJoin;
    o2.lineWidth     = o1.lineWidth;
    o2.miterLimit    = o1.miterLimit;
    o2.shadowBlur    = o1.shadowBlur;
    o2.shadowColor   = o1.shadowColor;
    o2.shadowOffsetX = o1.shadowOffsetX;
    o2.shadowOffsetY = o1.shadowOffsetY;
    o2.strokeStyle   = o1.strokeStyle;
  }

  function processStyle(styleString) {
    var str, alpha = 1;

    styleString = String(styleString);
    if (styleString.substring(0, 3) == "rgb") {
      var start = styleString.indexOf("(", 3);
      var end = styleString.indexOf(")", start + 1);
      var guts = styleString.substring(start + 1, end).split(",");

      str = "#";
      for (var i = 0; i < 3; i++) {
        str += dec2hex[parseInt(guts[i])];
      }

      if ((guts.length == 4) && (styleString.substr(3, 1) == "a")) {
        alpha = guts[3];
      }
    } else {
      str = styleString;
    }

    return [str, alpha];
  }

  function processLineCap(lineCap) {
    switch (lineCap) {
      case "butt":
        return "flat";
      case "round":
        return "round";
      case "square":
      default:
        return "square";
    }
  }

  /**
   * This class implements CanvasRenderingContext2D interface as described by
   * the WHATWG.
   * @param surfaceElement {HTMLElement} The element that the 2D context should
   * be associated with
   */
   function CanvasRenderingContext2D_(surfaceElement) {
    this.m_ = createMatrixIdentity();
    this.element_ = surfaceElement;

    this.mStack_ = [];
    this.aStack_ = [];
    this.currentPath_ = [];

    // Canvas context properties
    this.strokeStyle = "#000";
    this.fillStyle = "#ccc";

    this.lineWidth = 1;
    this.lineJoin = "miter";
    this.lineCap = "butt";
    this.miterLimit = 10;
    this.globalAlpha = 1;
  };

  var contextPrototype = CanvasRenderingContext2D_.prototype;
  contextPrototype.clearRect = function() {
    this.element_.innerHTML = "";
    this.currentPath_ = [];
  };

  contextPrototype.beginPath = function() {
    // TODO: Branch current matrix so that save/restore has no effect
    //       as per safari docs.

    this.currentPath_ = [];
  };

  contextPrototype.moveTo = function(aX, aY) {
    this.currentPath_.push({type: "moveTo", x: aX, y: aY});
  };

  contextPrototype.lineTo = function(aX, aY) {
    this.currentPath_.push({type: "lineTo", x: aX, y: aY});
  };

  contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
                                            aCP2x, aCP2y,
                                            aX, aY) {
    this.currentPath_.push({type: "bezierCurveTo",
                           cp1x: aCP1x,
                           cp1y: aCP1y,
                           cp2x: aCP2x,
                           cp2y: aCP2y,
                           x: aX,
                           y: aY});
  };

  contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
    // VML's qb produces different output to Firefox's
    // FF's behaviour seems to have changed in 1.5.0.1, check this
    this.bezierCurveTo(aCPx, aCPy, aCPx, aCPy, aX, aY);
  };

  contextPrototype.arc = function(aX, aY, aRadius,
                                  aStartAngle, aEndAngle, aClockwise) {
    if (!aClockwise) {
      var t = aStartAngle;
      aStartAngle = aEndAngle;
      aEndAngle = t;
    }

    var xStart = aX + (Math.cos(aStartAngle) * aRadius);
    var yStart = aY + (Math.sin(aStartAngle) * aRadius);

    var xEnd = aX + (Math.cos(aEndAngle) * aRadius);
    var yEnd = aY + (Math.sin(aEndAngle) * aRadius);

    this.currentPath_.push({type: "arc",
                           x: aX,
                           y: aY,
                           radius: aRadius,
                           xStart: xStart,
                           yStart: yStart,
                           xEnd: xEnd,
                           yEnd: yEnd});

  };

  contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
    this.moveTo(aX, aY);
    this.lineTo(aX + aWidth, aY);
    this.lineTo(aX + aWidth, aY + aHeight);
    this.lineTo(aX, aY + aHeight);
    this.closePath();
  };

  contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
    // Will destroy any existing path (same as FF behaviour)
    this.beginPath();
    this.moveTo(aX, aY);
    this.lineTo(aX + aWidth, aY);
    this.lineTo(aX + aWidth, aY + aHeight);
    this.lineTo(aX, aY + aHeight);
    this.closePath();
    this.stroke();
  };

  contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
    // Will destroy any existing path (same as FF behaviour)
    this.beginPath();
    this.moveTo(aX, aY);
    this.lineTo(aX + aWidth, aY);
    this.lineTo(aX + aWidth, aY + aHeight);
    this.lineTo(aX, aY + aHeight);
    this.closePath();
    this.fill();
  };

  contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
    var gradient = new CanvasGradient_("gradient");
    return gradient;
  };

  contextPrototype.createRadialGradient = function(aX0, aY0,
                                                   aR0, aX1,
                                                   aY1, aR1) {
    var gradient = new CanvasGradient_("gradientradial");
    gradient.radius1_ = aR0;
    gradient.radius2_ = aR1;
    gradient.focus_.x = aX0;
    gradient.focus_.y = aY0;
    return gradient;
  };

  contextPrototype.drawImage = function (image, var_args) {
    var dx, dy, dw, dh, sx, sy, sw, sh;
    var w = image.width;
    var h = image.height;

    if (arguments.length == 3) {
      dx = arguments[1];
      dy = arguments[2];
      sx = sy = 0;
      sw = dw = w;
      sh = dh = h;
    } else if (arguments.length == 5) {
      dx = arguments[1];
      dy = arguments[2];
      dw = arguments[3];
      dh = arguments[4];
      sx = sy = 0;
      sw = w;
      sh = h;
    } else if (arguments.length == 9) {
      sx = arguments[1];
      sy = arguments[2];
      sw = arguments[3];
      sh = arguments[4];
      dx = arguments[5];
      dy = arguments[6];
      dw = arguments[7];
      dh = arguments[8];
    } else {
      throw "Invalid number of arguments";
    }

    var d = this.getCoords_(dx, dy);

    var w2 = (sw / 2);
    var h2 = (sh / 2);

    var vmlStr = [];

    // For some reason that I've now forgotten, using divs didn't work
    vmlStr.push(' <g_vml_:group',
                ' coordsize="100,100"',
                ' coordorigin="0, 0"' ,
                ' style="width:100px;height:100px;position:absolute;');

    // If filters are necessary (rotation exists), create them
    // filters are bog-slow, so only create them if abbsolutely necessary
    // The following check doesn't account for skews (which don't exist
    // in the canvas spec (yet) anyway.

    if (this.m_[0][0] != 1 || this.m_[0][1]) {
      var filter = [];

      // Note the 12/21 reversal
      filter.push("M11='", this.m_[0][0], "',",
                  "M12='", this.m_[1][0], "',",
                  "M21='", this.m_[0][1], "',",
                  "M22='", this.m_[1][1], "',",
                  "Dx='", d.x, "',",
                  "Dy='", d.y, "'");

      // Bounding box calculation (need to minimize displayed area so that
      // filters don't waste time on unused pixels.
      var max = d;
      var c2 = this.getCoords_(dx+dw, dy);
      var c3 = this.getCoords_(dx, dy+dh);
      var c4 = this.getCoords_(dx+dw, dy+dh);

      max.x = Math.max(max.x, c2.x, c3.x, c4.x);
      max.y = Math.max(max.y, c2.y, c3.y, c4.y);

      vmlStr.push(" padding:0 ", Math.floor(max.x), "px ", Math.floor(max.y),
                  "px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",
                  filter.join(""), ", sizingmethod='clip');")
    } else {
      vmlStr.push(" top:", d.y, "px;left:", d.x, "px;")
    }

    vmlStr.push(' ">' ,
                '<g_vml_:image src="', image.src, '"',
                ' style="width:', dw, ';',
                ' height:', dh, ';"',
                ' cropleft="', sx / w, '"',
                ' croptop="', sy / h, '"',
                ' cropright="', (w - sx - sw) / w, '"',
                ' cropbottom="', (h - sy - sh) / h, '"',
                ' />',
                '</g_vml_:group>');

    this.element_.insertAdjacentHTML("BeforeEnd",
                                    vmlStr.join(""));
  };

  contextPrototype.stroke = function(aFill) {
    var lineStr = [];
    var lineOpen = false;
    var a = processStyle(aFill ? this.fillStyle : this.strokeStyle);
    var color = a[0];
    var opacity = a[1] * this.globalAlpha;

    lineStr.push('<g_vml_:shape',
                 ' fillcolor="', color, '"',
                 ' filled="', Boolean(aFill), '"',
                 ' style="position:absolute;width:10;height:10;"',
                 ' coordorigin="0 0" coordsize="10 10"',
                 ' stroked="', !aFill, '"',
                 ' strokeweight="', this.lineWidth, '"',
                 ' strokecolor="', color, '"',
                 ' path="');

    var newSeq = false;
    var min = {x: null, y: null};
    var max = {x: null, y: null};

    for (var i = 0; i < this.currentPath_.length; i++) {
      var p = this.currentPath_[i];

      if (p.type == "moveTo") {
        lineStr.push(" m ");
        var c = this.getCoords_(p.x, p.y);
        lineStr.push(Math.floor(c.x), ",", Math.floor(c.y));
      } else if (p.type == "lineTo") {
        lineStr.push(" l ");
        var c = this.getCoords_(p.x, p.y);
        lineStr.push(Math.floor(c.x), ",", Math.floor(c.y));
      } else if (p.type == "close") {
        lineStr.push(" x ");
      } else if (p.type == "bezierCurveTo") {
        lineStr.push(" c ");
        var c = this.getCoords_(p.x, p.y);
        var c1 = this.getCoords_(p.cp1x, p.cp1y);
        var c2 = this.getCoords_(p.cp2x, p.cp2y);
        lineStr.push(Math.floor(c1.x), ",", Math.floor(c1.y), ",",
                     Math.floor(c2.x), ",", Math.floor(c2.y), ",",
                     Math.floor(c.x), ",", Math.floor(c.y));
      } else if (p.type == "arc") {
        lineStr.push(" ar ");
        var c  = this.getCoords_(p.x, p.y);
        var cStart = this.getCoords_(p.xStart, p.yStart);
        var cEnd = this.getCoords_(p.xEnd, p.yEnd);

        // TODO: FIX (matricies (scale+rotation) now buggered this up)
        //       VML arc also doesn't seem able to do rotated non-circular
        //       arcs without parent grouping.
        var absXScale = this.m_[0][0];
        var absYScale = this.m_[1][1];

        lineStr.push(Math.floor(c.x - absXScale * p.radius), ",",
                     Math.floor(c.y - absYScale * p.radius), " ",
                     Math.floor(c.x + absXScale * p.radius), ",",
                     Math.floor(c.y + absYScale * p.radius), " ",
                     Math.floor(cStart.x), ",", Math.floor(cStart.y), " ",
                     Math.floor(cEnd.x), ",", Math.floor(cEnd.y));
      }


      // TODO: Following is broken for curves due to
      //       move to proper paths.

      // Figure out dimensions so we can do gradient fills
      // properly
      if(c) {
        if (min.x == null || c.x < min.x) {
          min.x = c.x;
        }
        if (max.x == null || c.x > max.x) {
          max.x = c.x;
        }
        if (min.y == null || c.y < min.y) {
          min.y = c.y;
        }
        if (max.y == null || c.y > max.y) {
          max.y = c.y;
        }
      }
    }
    lineStr.push(' ">');

    if (typeof this.fillStyle == "object") {
      var focus = {x: "50%", y: "50%"};
      var width = (max.x - min.x);
      var height = (max.y - min.y);
      var dimension = (width > height) ? width : height;

      focus.x = Math.floor((this.fillStyle.focus_.x / width) * 100 + 50) + "%";
      focus.y = Math.floor((this.fillStyle.focus_.y / height) * 100 + 50) + "%";

      var colors = [];

      // inside radius (%)
      if (this.fillStyle.type_ == "gradientradial") {
        var inside = (this.fillStyle.radius1_ / dimension * 100);

        // percentage that outside radius exceeds inside radius
        var expansion = (this.fillStyle.radius2_ / dimension * 100) - inside;
      } else {
        var inside = 0;
        var expansion = 100;
      }

      var insidecolor = {offset: null, color: null};
      var outsidecolor = {offset: null, color: null};

      // We need to sort 'colors' by percentage, from 0 > 100 otherwise ie
      // won't interpret it correctly
      this.fillStyle.colors_.sort(function (cs1, cs2) {
        return cs1.offset - cs2.offset;
      });

      for (var i = 0; i < this.fillStyle.colors_.length; i++) {
        var fs = this.fillStyle.colors_[i];

        colors.push( (fs.offset * expansion) + inside, "% ", fs.color, ",");

        if (fs.offset > insidecolor.offset || insidecolor.offset == null) {
          insidecolor.offset = fs.offset;
          insidecolor.color = fs.color;
        }

        if (fs.offset < outsidecolor.offset || outsidecolor.offset == null) {
          outsidecolor.offset = fs.offset;
          outsidecolor.color = fs.color;
        }
      }
      colors.pop();

      lineStr.push('<g_vml_:fill',
                   ' color="', outsidecolor.color, '"',
                   ' color2="', insidecolor.color, '"',
                   ' type="', this.fillStyle.type_, '"',
                   ' focusposition="', focus.x, ', ', focus.y, '"',
                   ' colors="', colors.join(""), '"',
                   ' opacity="', opacity, '" />');
    } else if (aFill) {
      lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity, '" />');
    } else {
      lineStr.push(
        '<g_vml_:stroke',
        ' opacity="', opacity,'"',
        ' joinstyle="', this.lineJoin, '"',
        ' miterlimit="', this.miterLimit, '"',
        ' endcap="', processLineCap(this.lineCap) ,'"',
        ' weight="', this.lineWidth, 'px"',
        ' color="', color,'" />'
      );
    }

    lineStr.push("</g_vml_:shape>");

    this.element_.insertAdjacentHTML("beforeEnd", lineStr.join(""));

    //this.currentPath_ = [];
  };

  contextPrototype.fill = function() {
    this.stroke(true);
  }

  contextPrototype.closePath = function() {
    this.currentPath_.push({type: "close"});
  };

  /**
   * @private
   */
  contextPrototype.getCoords_ = function(aX, aY) {
    return {
      x: (aX * this.m_[0][0] + aY * this.m_[1][0] + this.m_[2][0]),
      y: (aX * this.m_[0][1] + aY * this.m_[1][1] + this.m_[2][1])
    }
  };

  contextPrototype.save = function() {
    var o = {};
    copyState(this, o);
    this.aStack_.push(o);
    this.mStack_.push(this.m_);
    this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
  };

  contextPrototype.restore = function() {
    copyState(this.aStack_.pop(), this);
    this.m_ = this.mStack_.pop();
  };

  contextPrototype.translate = function(aX, aY) {
    var m1 = [
      [1,  0,  0],
      [0,  1,  0],
      [aX, aY, 1]
    ];

    this.m_ = matrixMultiply(m1, this.m_);
  };

  contextPrototype.rotate = function(aRot) {
    var c = Math.cos(aRot);
    var s = Math.sin(aRot);

    var m1 = [
      [c,  s, 0],
      [-s, c, 0],
      [0,  0, 1]
    ];

    this.m_ = matrixMultiply(m1, this.m_);
  };

  contextPrototype.scale = function(aX, aY) {
    var m1 = [
      [aX, 0,  0],
      [0,  aY, 0],
      [0,  0,  1]
    ];

    this.m_ = matrixMultiply(m1, this.m_);
  };

  /******** STUBS ********/
  contextPrototype.clip = function() {
    // TODO: Implement
  };

  contextPrototype.arcTo = function() {
    // TODO: Implement
  };

  contextPrototype.createPattern = function() {
    return new CanvasPattern_;
  };

  // Gradient / Pattern Stubs
  function CanvasGradient_(aType) {
    this.type_ = aType;
    this.radius1_ = 0;
    this.radius2_ = 0;
    this.colors_ = [];
    this.focus_ = {x: 0, y: 0};
  }

  CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
    aColor = processStyle(aColor);
    this.colors_.push({offset: 1-aOffset, color: aColor});
  };

  function CanvasPattern_() {}

  // set up externs
  G_vmlCanvasManager = G_vmlCanvasManager_;
  CanvasRenderingContext2D = CanvasRenderingContext2D_;
  CanvasGradient = CanvasGradient_;
  CanvasPattern = CanvasPattern_;

})();

} // if