Object.prototype.mapObj=null;
var browser=new Browser();

function MultiTile(DivTag, imageHost){

    var mt=this;
    var baseDiv=DivTag;
	var other_par;
    var action='pan';


    var tiles; //Array che cfontiene i tiles
    var tile_w=200; var tile_h=200; //dimensioni in pixel del singolo tile

    var x_til_base; var y_til_base;  //angolo in alto a sinistra per il tiling      
    var x_min; var y_min; var x_max; var y_max; //coordinate geografiche
    var x_min_or; var y_min_or; var x_max_or; var y_max_or; //coordinate geografiche originali

    var old_mv_x=0; var old_mv_y=0; //coordinate utilizzate per lo spostamento relativo della linea disegnata

    var div_w;  var div_h; //dimensioni del contenitore
    var pix_left; var pix_top; //posizione (assoluta) del contenitore
    var pix_dim; //Dimensione in nit� geografiche del pixel

    var coord=document.createElement('div'); //Definizione delle coordinate
    var scaleLabel=document.createElement('div'); //Elemento che visualizza la scala
    var iconDiv=document.createElement('div');
    var tilesDiv=document.createElement('div');
    
    var rect; var selectDiv; //Rettangolo di selezione
    var lastAgg;  //tempo per l'ultimo aggiornamento del movimento
    var sel_tile; //tile selezionato e da aggiornare

    var icon_dimension=31;
    var icon_array=new Array();

    if(imageHost==null) imageHost='/icone/';

    //Variabili AJAX
    var ajax_host; var ajax_user; var ajax_password;
    var ajax_table_name; var ajax_map_srid; var ajax_theme_srid;
    var ajax_insert; 
    var ajax_geom;
    var ajax_query; var ajax_query_table; var ajax_query_filter; var ajax_query_srid;
    var query_area; //Area contenente i risultati delle query
    var grafica;    var grafica_temp;  var editig;
    var cur_x; var cur_y;
    var lin=new Line();
    var has_dragged=false;
	
    //http Object per chiamate ajax
    var http = getHTTPObject();
    var ms_host; var mapfile; var layers; var other_args; var filter_args;

    this.getBaseURL=function(){
        return ms_host+'?mode=map&map='+mapfile+'&layers='+layers+'&'+filter_args+'&'+other_args;
    };

    var page_arrays = [[841,1189],[594,841],[420,594],[297,420],[210,297]];
    this.getPrintURL=function(div_print,paget,scalet,dpit,por){

        var mapfp=mapfile.substring(0,mapfile.lastIndexOf('.'))+'_print.map';
        var call=ms_host+'?mode=map&map='+mapfp+'&layers='+layers;
        if(filter_args)
           call+='&'+filter_args;
        if(other_args)
           call+='&'+other_args;
        call+='&mapext='+x_min+'+'+y_min+'+'+x_max+'+'+y_max;  

        var dpi=parseInt(dpit);
        if(dpi==NaN)
            dpi=150;

        var xp;var yp;
        var scale=parseInt(scalet);
        var page=parseInt(paget);

       
        if(isNaN(scale)){
            if(por){xp=page_arrays[page][0];yp=page_arrays[page][1];}
            else{xp=page_arrays[page][1];yp=page_arrays[page][0];}
            xp=xp*(dpi/25.4); yp=yp*(dpi/25.4); 
        }
        else{
            xp=((x_max-x_min)/scale)*1000*(dpi/25.4);
            yp=((y_max-y_min)/scale)*1000*(dpi/25.4);
        }

        if(Math.max(xp,yp)>10000){
            alert('You have exceeded the map dimension limit. Please increase the scale or reduce the dpi resolution.');
        }
        else{
            div_print.removeChild(div_print.firstChild);

            var link = document.createElement('a');
            link.href = call+'&mapsize='+xp+'+'+yp;
            link.target='_NEW';
            link.appendChild(document.createTextNode('Open Image'));
            div_print.appendChild(link);      
        }
        
        return call;
    };

	
    this.setMapserverHost=function(ms){ms_host=ms;};
    this.setMapFile=function(mp){mapfile=mp;};
    this.setLayers=function(ly){layers=ly};
    this.setArgs=function(arg){other_args=arg};    
    this.setFilter=function(arg){filter_args=arg};
    this.setQueryArea=function(qa){query_area=qa;}
	   
    this.setAjax=function(host,user,password){
        ajax_host=host;
        ajax_user=user;
        ajax_password=password;
    };
	
    this.setAjaxInsert=function(table_name, map_srid, theme_srid, geom){
        ajax_table_name=table_name;
        ajax_map_srid=map_srid;
        ajax_theme_srid=theme_srid;
        ajax_insert=true;
        ajax_geom=geom;
        icon_array[6].style.display='block';
    };

    //Definisce le dimensioni del tile
    this.setTileDimensions=function(ww, hh){
        tile_w=ww; 
        tile_h=hh; 
    }
    
    var custom_ajax;
    var custom_ajax_par;
    //set a custom ajax call
    this.setAjaxCustom=function(ca, cp){
        custom_ajax=ca;
        custom_ajax_par=cp;
        ajax_query=true;
        icon_array[5].style.display='block';
    }

    this.setAjaxQuery=function(table_name, coord_srid){
        var results = table_name.split(";");           
        ajax_query_table=results[0];
        ajax_query_srid=coord_srid;
        ajax_query_filter=results[1];
        ajax_query=true;
        icon_array[5].style.display='block';
    };
 
  
    //Funzioni di inizializzazione
    this.init=function(){

        //alert(baseDiv.offsetWidth+" "+getTop(baseDiv)+" "+getLeft(baseDiv)+" "+baseDiv.offsetHeight+" "+baseDiv.style.width+" "+baseDiv.style.height);
        //Parsing vecchio
        //div_w=parseInt(baseDiv.style.width);
        //div_h=parseInt(baseDiv.style.height);

        div_w=baseDiv.offsetWidth;
        div_h=baseDiv.offsetHeight;
        
        if(div_w==0)
            div_w=parseInt(baseDiv.style.width);
        if(div_h==0)
            div_h=parseInt(baseDiv.style.height);

        tiles=new Array();
        pix_left=getLeft(baseDiv);
        pix_top=getTop(baseDiv);

        baseDiv.oncontextmenu=function(){return false;};
        baseDiv.style.border='1px solid #222255';
        baseDiv.style.width=div_w+'px';
        baseDiv.style.height=div_h+'px';
        baseDiv.style.overflow='hidden';
        baseDiv.style.position='relative';
        baseDiv.style.overflow='hidden';
        baseDiv.style.backgroundColor='#CCCCFF';

        tilesDiv.oncontextmenu=function(){return false;};
        add_event(document,'keypress',function(event){handleKey(event);});
        add_event(tilesDiv,'mousedown',function(event){ChiamaEvento(event);});
        add_event(tilesDiv,'mousemove',function(event){MuoviEvento(event);});

        add_event(tilesDiv,'click',function(event){handleWisely(event);});
        add_event(tilesDiv,'dblclick',function(event){handleWisely(event);});
     
        if(tilesDiv.setAttribute){tilesDiv.setAttribute('style','z-index:0;');}else{tilesDiv.style.zIndex='0';};
        tilesDiv.style.position='absolute';
        tilesDiv.style.backgroundColor='#CCFFFF';
        tilesDiv.left='0';
        tilesDiv.top='0';
        baseDiv.appendChild(tilesDiv);

        iconDiv.style.position='absolute';
        iconDiv.style.left='0';iconDiv.style.top='0';
        if(iconDiv.setAttribute){iconDiv.setAttribute('style','z-index:150;');}else{iconDiv.style.zIndex='150';};
        
        icon_array[0]=mt.addMapTool('Full Extent',mt.fullExtent,imageHost+'ZoomAll.gif');
        icon_array[1]=mt.addMapTool('Zoom',mt.setActionZoombox,imageHost+'ZoomWindow.gif');
        icon_array[2]=mt.addMapTool('Pan',mt.setActionPan,imageHost+'Pan.gif');
        icon_array[3]=mt.addMapTool('Zoom In',mt.setActionZoomIn,imageHost+'ZoomIn.gif');
        icon_array[4]=mt.addMapTool('Zoom Out',mt.setActionZoomOut,imageHost+'ZoomOut.gif');
        icon_array[5]=mt.addMapTool('Query',mt.setActionQuery,imageHost+'Info.gif');
        icon_array[6]=mt.addMapTool('Insert',mt.setActionInsert,imageHost+'DrawShp.gif');
        
        var l=0; //div_w-(icon_dimension)-4;
        setPos(icon_array[0],l,1);
        setPos(icon_array[1],l,icon_dimension+1);
        setPos(icon_array[2],l,icon_dimension*2+1);
        setPos(icon_array[3],l,icon_dimension*3+1);
        setPos(icon_array[4],l,icon_dimension*4+1);
        setPos(icon_array[5],l,icon_dimension*5+1);
        setPos(icon_array[6],l,icon_dimension*6+1);
        //setPos(icon_array[7],l,icon_dimension*7+1);


        icon_array[5].style.display='none';
        icon_array[6].style.display='none';
        //icon_array[7].style.display='none';
        //alert('aaa');

        baseDiv.appendChild(iconDiv);

        selectDiv=document.createElement('div');
    selectDiv.id='mapdiv_aesito';
        selectDiv.mapObj=mt;
        selectDiv.style.position='absolute';selectDiv.style.display='none';selectDiv.style.border='1px dashed #FF6666';
        selectDiv.style.margin='0px';selectDiv.style.padding='0px';selectDiv.style.lineHeight='0';
        baseDiv.appendChild(selectDiv);

        coord.style.position='absolute';
        coord.style.right=10+'px';
        coord.style.top=div_h-13+'px';
        coord.style.fontSize='10px';    
        coord.style.backgroundColor='#FFFFCC';
        baseDiv.appendChild(coord);

        scaleLabel.style.position='absolute';
        scaleLabel.id='scaleLabel';
        scaleLabel.style.right=div_w-50+'px';
        scaleLabel.style.top=div_h-13+'px';
        scaleLabel.style.fontSize='10px';    
        scaleLabel.style.backgroundColor='#FFFFCC';
        baseDiv.appendChild(scaleLabel);

        var layer_g=document.createElement('div');
        layer_g.style.width=div_w+'px';
        layer_g.style.height=div_h+'px';
        layer_g.id='layer_g';
        DivTag.appendChild(layer_g);
       
        var layer_gt=document.createElement('div');
        layer_gt.style.width=div_w+'px';
        layer_gt.style.height=div_h+'px';
        layer_gt.id='layer_gt';
        DivTag.appendChild(layer_gt);

        grafica=new jsGraphics('layer_g');
        grafica_temp=new jsGraphics('layer_gt');
        grafica.setColor("#FF0000"); // red
        editing=false;
        //if(grafica.setAttribute){grafica.setAttribute('style','z-index:-100;');}else{grafica.style.zIndex='-100';};
        

        var grafDiv=document.getElementById('layer_g');
        add_event(grafDiv,'mousedown',function(event){ChiamaEvento(event);});
        add_event(grafDiv,'mousemove',function(event){MuoviEvento(event);});
        add_event(grafDiv,'click',function(event){handleWisely(event);});
        add_event(grafDiv,'dblclick',function(event){handleWisely(event);});
                
    }

   

    function add_event(obj,event_id,func){
        if(obj.addEventListener){
            obj.addEventListener(event_id,func,false)
        }
        else if(obj.attachEvent){
            event_id='on'+event_id;obj.attachEvent(event_id,func)
        }
        else{obj[event_id]=func;}
    };


    this.addMapTool=function(p_title,p_function,p_icon,p_left,p_top){

        var tool=document.createElement('img');
        tool.oncontextmenu=function(){ return false; };

        add_event(tool,'click',p_function);
        tool.src=p_icon;
        tool.title=p_title;
        if(tool.setAttribute){tool.setAttribute('style','z-index:200;');}
        else{tool.style.zIndex='200';};

        tool.style.border='2px solid #c2c2c2';
        tool.style.margin='0px';
        tool.style.padding='0';
        tool.style.position='absolute';
        tool.style.cursor='pointer';
        tool.style.backgroundColor='#FFFFFF';
        //tool.style.MozOpacity=0.8; tool.filters.alpha.opacity=80;
        tool.style.display='none';
        tool.style.width=(icon_dimension-3)+'px'; 
        tool.style.height=(icon_dimension-3)+'px';
        icon_array.push(tool);

        iconDiv.appendChild(tool);
        if(p_left !=null){
            setPos(tool,p_left,p_top)
        };

        return tool;
    };

    this.setInitDimension=function(Xmin,Ymin,Xmax,Ymax){
        //alert('a');
        mt.setExtent(Xmin, Xmax, Ymin, Ymax);
        x_max_or= x_max;y_max_or= y_max;x_min_or= x_min;y_min_or= y_min;
    };

    this.getInitDimension=function(){
        return 'BOX3D('+x_min+' '+y_min+','+x_max+' '+y_max+')';
    };


    this.setExtent=function(Xmin,Xmax,Ymin, Ymax){        
        x_min=parseFloat(Xmin); x_max=parseFloat(Xmax);
        y_min=parseFloat(Ymin); y_max=parseFloat(Ymax);
        //alert(x_min+' '+x_max+'-'+y_min+' '+y_max);
      
        var pix_dim_x=(x_max-x_min)/div_w;
        var pix_dim_y=(y_max-y_min)/div_h;

        pix_dim=Math.max(pix_dim_x, pix_dim_y);        
        var difx=(pix_dim*div_w)-(x_max-x_min);
        var dify=(pix_dim*div_h)-(y_max-y_min);

        x_max=x_min+pix_dim*div_w;
        y_max=y_min+pix_dim*div_h;

        //alert(x_max+'='+x_min+'+'+pix_dim+'*'+div_w);
        
        //Centra al centro
        if(difx>0){
            x_min=x_min-(difx/2);x_max=x_max-(difx/2);
        }
        if(dify>0){
            y_min=y_min-(dify/2);y_max=y_max-(dify/2);
        }
        //alert(x_min+' '+x_max+'-'+y_min+' '+y_max);
    };
      
    this.zoomPerc=function(p_perc){
        var wx=x_max-x_min; var wx_new=wx*p_perc;
        var kx=(wx_new-wx)/2; 
        var wy=y_max-y_min;
        var wy_new=wy*p_perc;
        var ky=(wy_new-wy)/2;
        mt.setExtent(x_min+kx,x_max-kx,y_min+ky,y_max-ky);
    };

    this.fullExtentNoRedraw=function(){
        mt.setExtent(x_min_or,x_max_or,y_min_or,y_max_or);
        mt.selectIcon(0);
    };

    this.fullExtent=function(){
        if(editing)
            alert('Attenzione, non e\' possibile modificare la scala mente si editano i dati');
        else{
            mt.fullExtentNoRedraw();mt.redraw();
        }
    };

    this.setActionZoombox=function(){action='zoom';baseDiv.style.cursor="crosshair"; mt.selectIcon(1);};
    this.setActionPan=function(){action='pan';baseDiv.style.cursor="move";  mt.selectIcon(2);};
    this.setActionZoomIn=function(){
        if(editing) alert('Attenzione, non e\' possibile modificare la scala mentre si editano i dati');
        else{mt.zoomPerc(1.40);mt.redraw();mt.selectIcon(3);}};

    this.setActionZoomOut=function(){
        if(editing) alert('Attenzione, non e\' possibile modificare la scala mentre si editano i dati');
        else{mt.zoomPerc(0.30);mt.redraw();mt.selectIcon(4);}};

    this.setActionQuery=function(){action='query';baseDiv.style.cursor="pointer";  mt.selectIcon(5);};
    this.setActionInsert=function(){action='insert';baseDiv.style.cursor="pointer";  mt.selectIcon(6);};
    this.setActionNone=function(){
        action='none'; 
        //a28.style.display='none'; 
        baseDiv.style.cursor="";
        mt.selectIcon(-1);
    };
	
    
    this.selectIcon=function(sel){
        for(var n=0; n<icon_array.length; n++){
            icon_array[n].style.border='2px solid #c2c2c2';}
        if(sel>-1){
            icon_array[sel].style.border='2px groove #00c2c2';}
    };

    this.getGeomX=function(x){
        return x_min+((x-1)*pix_dim);
    };
    this.getGeomY=function(y){
        return y_max-((y-1)*pix_dim);
    };

    //from geom to Map
    this.getMapX=function(xg){
        return 1+((xg-x_min)/pix_dim);        
    };
    this.getMapY=function(yg){
        return -1-((yg-y_max)/pix_dim);        
    };

    this.getScale=function(x){
        return (pix_dim/0.00035);
    };



    this.redraw=function(){        
         
        if(tiles.length==0){
            tiles=new Array();
        }
        else{ this.removeAllTiles();}

        this.creaTiles();
    };


    this.getTile=function(xx,yy){
        var xda=Math.ceil(((x_til_base+xx)/tile_w));
        var yda=Math.ceil(((y_til_base+yy)/tile_h));

        //alert('trova '+xda+' '+yda);

        for(n=0; n<tiles.length; n++){
            if(tiles[n].exists(xda,yda)){
                return tiles[n];
                break;
            }
        }
    }


    this.moveTiles=function(xx,yy,tmp){
        
        for(n=0; n<tiles.length; n++){
            tiles[n].move(xx,yy,tmp);
        }

        if(!tmp){
            if(xx!=0 || yy!=0){

                x_til_base=x_til_base+xx;
                y_til_base=y_til_base+yy;

                //alert(' '+x_til_base+' '+y_til_base);            
                var xda=-Math.ceil((x_til_base/tile_w));
                var yda=-Math.ceil((y_til_base/tile_h));

                var xa=xda+Math.ceil(div_w/tile_w)+1;
                var ya=yda+Math.ceil(div_h/tile_h)+1;

                //Riscala la mappa
                x_min=x_min-xx*pix_dim; x_max=x_max-xx*pix_dim;
                y_min=y_min+yy*pix_dim; y_max=y_max+yy*pix_dim;

                //alert('tiles da'+xda+' a'+xa+'; da '+yda+' a'+ya );            
                for(c=xda; c<xa; c++){            
                    for(r=yda; r<ya; r++){

                        var toAdd=true;
                        for(n=0; n<tiles.length; n++){
                            if(tiles[n].exists(c,r)){
                                toAdd=false;
                                break;
                            }
                        }
                        if(toAdd){
                             this.addTile(c,r);
                        }
                    }
                }   
            }
        }
    };

    this.removeAllTiles=function(){
        for(n=0; n<tiles.length; n++){
            tilesDiv.removeChild(tiles[n].getImg());
        }
        //alert('svuotato');
        tiles=new Array();
    };

    this.creaTiles=function(){
        var num_col=Math.ceil(div_w/tile_w);
        var num_row=Math.ceil(div_h/tile_h);

        var num=0;
        x_til_base=0; y_til_base=0;        
        for(c=0; c<num_col; c++){            
            for(r=0; r<num_row; r++){
                 this.addTile(c,r);
            }
        }   
    };

    //I tile sono in una matrice l'angolo in alto a sinistra del tile (0,0) sono x_til_base,y_til_base
    this.addTile=function(tx,ty){

         xx=x_til_base+(tile_w*tx);
         yy=y_til_base+(tile_h*ty);                

         xmin_g=x_min+(xx*pix_dim);
         xmax_g=xmin_g+(tile_w*pix_dim);
                 
         ymin_g=y_min+((div_h-yy-tile_h)*pix_dim);
         ymax_g=ymin_g+(tile_h*pix_dim);

         var t=new Tile(tile_w, tile_h,xx,yy);
         t.setPos(tx,ty);
         t.setDimension(xmin_g,xmax_g,ymin_g,ymax_g);
		 t.setOtherPar(other_par);

         t.setMapObj(mt);
         tilesDiv.appendChild(t.createImg(mt.getBaseURL()));

         tiles[tiles.length]=t;
    };



	this.updateGPS=function(gis_host,srid_map,val){
		var chiamata=gis_host+'?gisAjax=si&mode=gps&gps_val='+val+'&srid='+srid_map+'&pix_res='+pix_dim;

                if(SupportsAjax()){
                    SimpleAJAXCall(chiamata,handleUpdateGPS);
                }else{alert('AJAX Not Supported!');}
		//http.open("POST", chiamata, true);  
                //http.onreadystatechange = handleUpdateGPS;  
                //http.send(null);	
	};
	
	function handleUpdateGPS(responseTextX) { 
        //if (http.readyState == 4) {  		    
            var results = responseTextX.split("|");
            
			if(results[0]=="true"){
                mt.redraw();
				var x=results[1];
				var y=results[2];
				mt.centerMap(x,y);	
				
                var a10='rnd'+(Math.random()*1000);				
                mt.setArgs('random_value='+a10)

				mt.redraw();			
            }
            else{
                alert("Errore"+responseTextX);
            }          
        //}  
        }
	
	
	var net_gis_host;
	var net_theme_name;
	var net_theme_node;
	var net_start;
	var action;
	
	this.startNetwork=function(gis_host,theme_name,theme_node){
		net_gis_host=gis_host;
		net_theme_name=theme_name;
		net_theme_node=theme_node;
		net_start=null;
		action='net';
		alert('Clicca per determinare il punto di partenza');
	};
	
	this.addPointNetwork=function(p){
		if(net_start==null){
			net_start=p;
			alert('Clicca per determinare il punto di arrivo ');
			p.drawPoint(grafica);
		}
		else{
			
			var chiamata=net_gis_host+'?gisAjax=si&mode=network&layer_node='+net_theme_node+'&layer='+net_theme_name+'&from='+net_start.getWkt()+'&to='+p.getWkt();		
                        query_area.src=chiamata;
	        
			var chiamata2=net_gis_host+'?gisAjax=si&mode=networkmap&layer_node='+net_theme_node+'&layer='+net_theme_name+'&from='+net_start.getWkt()+'&to='+p.getWkt();					      
			
                        if(SupportsAjax()){
                            SimpleAJAXCall(chiamata,handleUpdateNetwork);
                        }else{alert('AJAX Not Supported!');}
			
                        //http.open("POST", chiamata2, true);  
                        //http.onreadystatechange = handleUpdateNetwork;  
                        //http.send(null);	
			
			grafica.clear();			
			
		}		
	};
	
	
	
	this.updateNetwork=function(gis_host,theme_name,from,to){
		var chiamata=gis_host+'?gisAjax=si&mode=network&layer='+theme_name+'&from='+from+'&to='+to;		
                query_area.src=chiamata;
        
		var chiamata2=gis_host+'?gisAjax=si&mode=networkmap&layer='+theme_name+'&from='+from+'&to='+to;					      
		
                if(SupportsAjax()){
                    SimpleAJAXCall(chiamata,handleUpdateNetwork);
                }else{alert('AJAX Not Supported!');}

		//http.open("POST", chiamata2, true);  
                //http.onreadystatechange = handleUpdateNetwork;  
                //http.send(null);	
	};
	
	function handleUpdateNetwork(responseTextX) { 
            //if (http.readyState == 4) {  		    
                var results = responseTextX.split("|");
                if(results[0]=="true"){
				
                    var layer=results[1];
				
                    var a10='rnd'+(Math.random()*1000);				
                    mt.setArgs('random_value='+a10+'&net_'+layer+'='+results[2]);
                    mt.redraw();
				
                }
                else{
                    alert("Errore"+responseTextX);
                }          
           //}  
        }
	
	this.updateGeocode=function(gis_host,theme_name,gmap_key,srid_layer,srid_map,val){
		var chiamata=gis_host+'?gisAjax=si&mode=geocode&gmap_key='+gmap_key+'&layer='+theme_name+'&geocode_val='+val+'&srid_layer='+srid_layer+'&srid='+srid_map+'&pix_res='+pix_dim;
		if(SupportsAjax()){
                    SimpleAJAXCall(chiamata,handleUpdateGeocode);
                }else{alert('AJAX Not Supported!');}

                //http.open("POST", chiamata, true);  
                //http.onreadystatechange = handleUpdateGeocode;  
                //http.send(null);	
	};
	
	function handleUpdateGeocode(responseTextX) { 
        //if (http.readyState == 4) {  		    
            var results = responseTextX.split("|");
            if(results[0]=="true"){
                mt.redraw();				
                var x=results[1];
                var y=results[2];
                var a10='rnd'+(Math.random()*1000);				
                mt.setArgs('random_value='+a10)
                mt.centerMap(x,y);	
                mt.redraw();			
            }
            else{
                alert("Errore"+responseTextX);
            }          
        //}  
    }
	
	
    this.centerMap=function(xx_string,yy_string){
        
        //alert(xx+' '+yy+'-'+y_min+' '+y_max);

        var xx=parseFloat(xx_string);
        var yy=parseFloat(yy_string);

        //alert(xx+' '+yy+'-'+pix_dim+' '+div_w);

        x_min=xx-(pix_dim*div_w)/2;
        x_max=xx+(pix_dim*div_w)/2;
        y_min=yy-(pix_dim*div_h)/2;
        y_max=yy+(pix_dim*div_h)/2;		

        //alert(x_min+' '+x_max+'-'+y_min+' '+y_max);
      

    };

    this.clickEsc=function(){
        if(action=='insert'){
            grafica.clear();
            grafica_temp.clear();
            lin=new Line();
            editing=false;
        }
    }
    this.clickRet=function(){
        if(action=='insert'){
            if(editing)
                mt.insertLine();
        }
    }

    this.cliccaMouse=function(xx,yy){
        pix_left=getLeft(baseDiv);
        pix_top=getTop(baseDiv);

        xx=xx-pix_left;
        yy=yy-pix_top;

        var xr=mt.getGeomX(xx);
        var yr=mt.getGeomY(yy);
        
        if(action=='insert' && (ajax_geom=='line' || ajax_geom=='polygon' )){
            editing=true;
            if(!has_dragged){
                if(lin.isUpdating() && ajax_geom=='polygon'){
                    //alert('updating clicca.');
                    grafica.clear();
                    lin.drawPolygon(grafica); 
                }
                else{
                    var p=new Point(xx,yy,xr,yr);           
                    lin.addPoint(p);           
                    if(ajax_geom=='line')
                        lin.drawLastLine(grafica);            
                    else{
                        grafica.clear();
                        lin.drawPolygon(grafica);            
                    }
                }
            }
            has_dragged=false;
        }    
    };


    this.dblCliccaMouse=function(xx,yy,shift){
        pix_left=getLeft(baseDiv);
        pix_top=getTop(baseDiv);

        xx=xx-pix_left;
        yy=yy-pix_top;
        var xr=mt.getGeomX(xx);
        var yr=mt.getGeomY(yy);
        var p=new Point(xx,yy,xr,yr);   
				
        if(action=='net'){
           this.addPointNetwork(p);
        }
        else if(action=='insert'){
            if(ajax_geom=='point' && !shift){
            
                var pointString=p.getWkt();       
                var conferma=confirm("Confermi l'inserimento nella banca dati del punto?");
                if (conferma==true){                
                    var chiamata=ajax_host+'?gisAjax=si&mode=insert&layer='+ajax_table_name+'&srid='+ajax_map_srid+'&layer_srid='+ajax_theme_srid+'&wkt='+pointString+'&pix_res='+pix_dim;
                    if(SupportsAjax()){
                        SimpleAJAXCall(chiamata,handleInsertPoint);
                    }else{alert('AJAX Not Supported!');}
                }
                
            }
            else{               
                if(lin.getNumPoint()==0 || (ajax_geom=='point' && shift)){ //Doppio click: seleziona la feature sottostante

                    //se il servletAjax contiene gi� delle variabili mette la e commerciale
                    var chiamata=ajax_host;
                    if(ajax_host.indexOf('?')==-1) chiamata+="?";
                    else chiamata+="&";
                    chiamata+='gisAjax=si&mode=query&get_wkt=si&layer='+ajax_table_name+'&srid='+ajax_map_srid+'&buffer='+4*pix_dim+'&wkt='+p.getWkt()+'&query_filter='+ajax_query_filter;                

                    ///Ajax new 
                    if(SupportsAjax()){
                        SimpleAJAXCall(chiamata,handleGetGeom);
                    }
                    else{alert('AJAX Not Supported!');}


                    //alert('!!! Per digitalizzare occorre inserire almeno due punti.');
                }
                else{    

                    if(lin.isUpdating()){
                        if(ajax_geom=='line' || ajax_geom=='polygon'){
                            if(lin.addVertex(p)){
                                if(ajax_geom=='line')         
                                    lin.drawLastLine(grafica); 
                                else{
                                    grafica.clear();
                                    lin.drawPolygon(grafica);
                                }
                             }
                        }
                    }
                    else{
                        lin.addPoint(p);  

                        if(ajax_geom=='line')         
                            lin.drawLastLine(grafica); 
                        else{
                            grafica.clear();
                            lin.drawPolygon(grafica);
                        }

                        mt.insertLine();
                    }
                }
            }
        }    
        else if(action=='query'){

            if(ajax_query_table==undefined && custom_ajax==undefined ){
                alert('Occorre selezionare un tema su cui effettuare la query');
            }
            else{

                mt.sel_tile=mt.getTile(p.x,p.y);
                var buffer=8*pix_dim; //Il buffer è pari a 4 pixel su mappa
                var wkt=p.getWkt();

                
                if(custom_ajax){

                    chiamata=custom_ajax+'&gisAjax=si&mode=query&layer='+ajax_query_table+'&srid='+ajax_query_srid+'&buffer='+buffer+'&wkt='+wkt+'&query_filter='+ajax_query_filter;                
                    query_area.src=chiamata;

                }
                else{

                    //se il servletAjax contiene gi� delle variabili mette la e commerciale
                    var chiamata=ajax_host;
                    if(ajax_host.indexOf('?')==-1)
                        chiamata+="?";
                    else
                        chiamata+="&";

                    chiamata+='gisAjax=si&mode=query&layer='+ajax_query_table+'&srid='+ajax_query_srid+'&buffer='+buffer+'&wkt='+wkt+'&query_filter='+ajax_query_filter;                

                    ///Ajax new
                    if(SupportsAjax()){
                        SimpleAJAXCall(chiamata,handleQueryPoint);
                    }
                    else{alert('AJAX Not Supported!');}
                }
            }
        }
    };


    this.insertLine=function(){
        var conferma=confirm("Confermi l'inserimento nella banca dati?");
        if (conferma==true){                        
            var lineString;
            if(ajax_geom=='line')         
                lineString=lin.getWkt();
            else if(ajax_geom=='point')         
                lineString=lin.getWktPoint();
            else
                lineString=lin.getWktPolygon();

            var chiamata=ajax_host+'?gisAjax=si&mode=insert&layer='+ajax_table_name+'&srid='+ajax_map_srid+'&layer_srid='+ajax_theme_srid+'&wkt='+lineString+'&pix_res='+pix_dim;
            if(lin.isUpdating()){
                chiamata+='&update_id='+lin.getID();
            }
            //document.getElementById('debug').value=chiamata;
            //alert(chiamata+'  !!!! '+document.getElementById('debug').innerHtml);
            //alert("upd:"+lin.isUpdating()+" id:"+lin.getID()+" "+lineString);


            if(SupportsAjax()){
                SimpleAJAXCall(chiamata,handleInsertPoint);
            }else{alert('AJAX Not Supported!');}
        }
        grafica.clear();
        grafica_temp.clear();
        editing=false;

        lin=new Line();
        mt.redraw();
    }


    function handleGetGeom(responseText) { 

        var results = responseText.split("||");
        var wkt=results[1];
        var id_f=results[2];
        var regExes = {
            'typeStr': /^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/,
            'spaces': /\s+/,
            'parenComma': /\)\s*,\s*\(/,
            'doubleParenComma': /\)\s*\)\s*,\s*\(\s*\(/,  // can't use {2} here
            'trimParens': /^\s*\(?(.*?)\)?\s*$/
        };

           
        var matches = regExes.typeStr.exec(wkt);
        if(matches) {
            type = matches[1].toLowerCase();
            str = matches[2];            
            if(type=='multilinestring' || type=='multipolygon'){
                var lines;
                if(type=='multipolygon'){
                    lines= str.trim().split(regExes.doubleParenComma);
                }
                else{
                    lines= str.trim().split(regExes.parenComma);
                }
                
                if(lines.length>0) {
                    lin=new Line();
                    var start=0;
                    if(type=='multipolygon'){
                        lines[0]=lines[0].replace(regExes.trimParens, '$1');
                        start=1;
                    }
                    
                    var points = lines[0].replace(regExes.trimParens, '$1').trim().split(',');                                                                

                    for(var n=start; n<points.length; n++){
                        var coords = points[n].trim().split(regExes.spaces);
                        var x=coords[0]; var y= coords[1];
                        var p= new Point(mt.getMapX(x), mt.getMapY(y) ,x ,y)
                        lin.addPoint(p);
                        //alert(mt.getMapX(x)+" "+mt.getMapY(y)+" "+x+" "+y);
                    }
                }
                lin.setUpdating(true);
                if(type=='multipolygon'){
                    lin.drawPolygon(grafica);
                }
                else{
                    lin.drawLine(grafica);
                }

                lin.setID(id_f);
                editing=true;
            }
            else{
                
                lines= str.trim().split(regExes.parenComma);
                var coords =lines[0].trim().split(regExes.spaces);
                var x=coords[0]; var y= coords[1];
                var p= new Point(mt.getMapX(x), mt.getMapY(y) ,x ,y);
                lin.addPoint(p);
                lin.setUpdating(true);  
                lin.drawLine(grafica);
                lin.setID(id_f);              
                editing=true;
            }
        }
        
    }
     

    function handleInsertPoint(responseTextX) { 
        //if (http.readyState == 4) {  
            var results = responseTextX.split("||");
            if(results[0]=="true"){
                a10='rnd'+(Math.random()*1000);
		
                var id_feature=results[1];

                var chiamata='';

                //alert(custom_ajax);

                if(custom_ajax){
                    chiamata=custom_ajax+'&gisAjax=si&mode=edit_db&layer='+ajax_table_name+'&id_feature='+id_feature;
                }
                else{
                    chiamata=ajax_host+'?gisAjax=si&mode=edit_db&layer='+ajax_table_name+'&id_feature='+id_feature;
                }
                query_area.src=chiamata;

                mt.setArgs('sel_'+ajax_table_name+'='+id_feature+'&random_value='+a10);
                mt.redraw();
                alert('La feature e\' stata inserita correttamente');


            }
            else{
                alert('Errore nell\'inserimento del punto: '+responseTextX);
            }          
        //}  
    }

    function handleQueryPoint(responseTextX) { 
        //if (http.readyState == 4) {  
            var results = responseTextX.split("||");
            //alert('Query: '+responseTextX);
            if(results[0]=="true"){                
                var id_fs=results[1];                

                if(id_fs!='noRecord'){
                    var id_feature=id_fs.split("$")[0];
                    var chiamata=ajax_host+'?gisAjax=si&mode=edit_db&layer='+ajax_query_table+'&id_feature='+id_feature;
                    query_area.src=chiamata;
                    //alert('chiamata: '+chiamata);
                    a10='rnd'+(Math.random()*1000);
		
                    mt.setArgs('sel_'+ajax_query_table+'='+id_feature+'&random_value='+a10)
                    mt.redraw();
                                                 
                }
                else{
                    alert('No Feature Selected.');
                    query_area.src='';                    
                    mt.setArgs('');
                    mt.redraw();
                }
            }
            else{
                alert('Si \xE8 verificato un errore durante la selezione ('+responseTextX+')');
            }         
        //}  
    }

    this.muoviMouse=function(xx,yy){
        if(lastAgg==undefined)
            lastAgg=new Date().getTime();

        var now =new Date().getTime();
        if(now-lastAgg>250){

            xx=xx-pix_left;
            yy=yy-pix_top;
            var xr=mt.getGeomX(xx);
            var yr=mt.getGeomY(yy);
            //pix_left=getLeft(baseDiv);
            //pix_top=getTop(baseDiv);
            //xx=xx-pix_left;
            //yy=yy-pix_top;

            

            lastAgg=now;
            //scaleLabel.innerHTML=('1:'+this.getScale().toFixed(0));
            coord.innerHTML=(xr.toFixed(2)+' '+yr.toFixed(2));
        }
    };

    this.dragStart=function(xx,yy,event){
        //coord.innerHTML=('Drag Start '+xx+' '+yy);

        pix_left=getLeft(baseDiv);
        pix_top=getTop(baseDiv);

        xx=xx-pix_left;
        yy=yy-pix_top;


        rect=new Rectangle(new Point(xx,yy,mt.getGeomX(xx),mt.getGeomY(yy)));

        if(browser.isNS){
            document.addEventListener("mousemove",mt.dragGo,true);
            document.addEventListener("mouseup",mt.dragStop,true);
            event.preventDefault();
        }
        else{
            document.attachEvent("onmousemove",mt.dragGo);
            document.attachEvent("onmouseup",mt.dragStop);
            window.event.cancelBubble=true;
            window.event.returnValue=false;
        };

    };

    this.dragGo=function(event){

            pix_left=getLeft(baseDiv);
            pix_top=getTop(baseDiv);

            var x,y;
            if(browser.isNS){
                x=event.clientX+window.scrollX;
                y=event.clientY+window.scrollY;
            }
            else{
                x=window.event.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
                y=window.event.clientY+document.documentElement.scrollTop+document.body.scrollTop;
            };
            x=x-pix_left;
            y=y-pix_top;

            rect.setFine(new Point(x,y,mt.getGeomX(x),mt.getGeomY(y)));

            if(action=='zoom'){    
                //coord.innerHTML=('nmdr'+x+' '+y);
                if(!editing)
                    rect.moveDiv(selectDiv);

            }
            else if(action=='pan'){
                //coord.innerHTML=(' '+rect.getDifX()+' '+rect.getDifY());
                mt.moveTiles(rect.getDifX(),rect.getDifY(),true);

                if(editing){
                    
                    //scaleLabel.innerHTML=(''+old_mv_x+' '+old_mv_y);

                    lin.move(rect.getDifX()-old_mv_x,rect.getDifY()-old_mv_y);
                    old_mv_x=rect.getDifX();
                    old_mv_y=rect.getDifY();

                    grafica.clear();
                        
                }

            }

            //In chiusura
            if(browser.isNS){event.preventDefault();}
            else{window.event.cancelBubble=true;window.event.returnValue=false;}

         //scaleLabel.innerHTML=('dragGo '+action+' '+old_mv_x+' '+old_mv_y);


    };

    this.dragStop=function(event){

        pix_left=getLeft(baseDiv);
        pix_top=getTop(baseDiv);

        if(browser.isNS){
            document.removeEventListener("mousemove",mt.dragGo,true);
            document.removeEventListener("mouseup",mt.dragStop,true);
        }
        else{
            document.detachEvent("onmousemove",mt.dragGo);
            document.detachEvent("onmouseup",mt.dragStop);
        };

        var x,y;
        if(browser.isNS){
            x=event.clientX+window.scrollX;
            y=event.clientY+window.scrollY;
        }
        else{
            x=window.event.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
            y=window.event.clientY+document.documentElement.scrollTop+document.body.scrollTop;
        };
        x=x-pix_left;
        y=y-pix_top;
        rect.setFine(new Point(x,y,mt.getGeomX(x),mt.getGeomY(y)));
   
        if(action=='zoom'){			
            if(editing)
                    alert('Attenzione, non e\' possibile modificare la scala mente si editano i dati');
            else if(rect.getDifX()!=0 && rect.getDifY()!=0){                
                selectDiv.style.display='none';
                mt.setExtent(mt.getGeomX(rect.minx),mt.getGeomX(rect.maxx),mt.getGeomY(rect.maxy),mt.getGeomY(rect.miny));
                mt.redraw();
            }
        }
        else if(action=='insert'){  
            //scaleLabel.innerHTML=('indesrt!');
            if(! (rect.getDifX()==0 && rect.getDifY()==0) ){
                var pf=rect.getEndPoint();                    
                var mov=lin.moveVertex((rect));                    
                if(mov){
                    grafica.clear();
                    if(ajax_geom=='line')                            
                        lin.draw(grafica);
                    else
                        lin.drawPolygon(grafica);                    
                } 
                else{
                    //scaleLabel.innerHTML=('not moved');
                }
                has_dragged=true;
            }
            else{
                ;
            }
        }
        else if(action=='pan'){

            if(editing){
                if(ajax_geom=='line')                            
                    lin.draw(grafica);
                else
                    lin.drawPolygon(grafica);
            }

            mt.moveTiles(rect.getDifX(),rect.getDifY(),false);
        }
        rect=null;
        old_mv_x=0;
        old_mv_y=0;

        //alert('dragged');
        //scaleLabel.innerHTML=('dragStop');

    };

    this.init();
}

function Tile(tile_w, tile_h, pos_x, pos_y){
    
    var img=document.createElement('img');
    var x_min; var y_min; var x_max; var y_max;
    var other_par='';

    img.style.position='absolute';
    var pos_x_or=pos_x;
    var pos_y_or=pos_y;

    img.style.left=pos_x+'px';
    img.style.top=pos_y+'px';
    img.style.border='0 none'; img.style.margin='0'; img.style.padding='0';
    img.style.position='absolute';

    //L'immagine è trasparente
    img.style.display='none';
    img.onload=function(){
        img.style.display='';
    };
    
    this.setMapObj=function(mo){
        img.mapObj=mo;
    };
	

	this.setOtherPar=function(op){
		this.other_par=op; 		
	};

    this.setDimension=function(Xmin,Xmax,Ymin,Ymax){
        this.x_min=Xmin; this.x_max=Xmax;
        this.y_min=Ymin; this.y_max=Ymax;
    };

    this.setPos=function(Tx,Ty){
        this.tx=Tx; this.ty=Ty;
    };

    this.exists=function(Tx,Ty){
        return ((this.tx==Tx) && (this.ty==Ty))
    }

    this.getMapUrl=function(base_url){
        var my_url;
        
        var size='mapsize='+tile_w+'+'+tile_h;
        var ext='mapext='+this.x_min+'+'+this.y_min+'+'+this.x_max+'+'+this.y_max;
        my_url=base_url+'&'+ext+'&'+size+other_par;
        return my_url;
    };

    this.reloadImg=function(base_url){
        //alert('reload pippo');
        img.src=this.getMapUrl(base_url);        
        //img.src='pippo.gif';
        //img.style.display='none';
    };

    this.createImg=function(base_url){
        img.src=this.getMapUrl(base_url);
        return img;
    };

    this.move=function(xx,yy,tmp){
        img.style.left=(pos_x_or+xx)+'px';
        img.style.top=(pos_y_or+yy)+'px';
        if(!tmp){
            pos_x_or=(pos_x_or+xx);
            pos_y_or=(pos_y_or+yy);
        }
    };

    this.getImg=function(base_url){        
        return img;
    };

};


function getLeft(eElement){
    if(!eElement && this){
        eElement=this;
    };
    var DL_bIE=document.all ? true : false;
    var nLeftPos=eElement.offsetLeft;
    var eParElement=eElement.offsetParent;
    while(eParElement !=null){
        if(DL_bIE){
            if((eParElement.tagName !="TABLE")&&(eParElement.tagName !="BODY")){
                nLeftPos+=eParElement.clientLeft;
            }
        }
        else{
            if(eParElement.tagName=="TABLE"){
                var nParBorder=parseInt(eParElement.border);
                if(isNaN(nParBorder)){
                    var nParFrame=eParElement.getAttribute('frame');
                    if(nParFrame !=null){
                        nLeftPos+=1;
                    }
                }
                else if(nParBorder > 0){
                    nLeftPos+=nParBorder;
                }
            };
            if(eParElement.tagName=="DIV"){
                var bord=parseInt(eParElement.style.border);
                if(bord > 0){
                    nLeftPos+=bord;
                }
            }
        };

        nLeftPos+=eParElement.offsetLeft;
        eParElement=eParElement.offsetParent;
    };
    return nLeftPos;
};

function getTop(eElement){
    if(!eElement && this){eElement=this;};
    var DL_bIE=document.all ? true : false;
    var nTopPos=eElement.offsetTop;
    var eParElement=eElement.offsetParent;
    while(eParElement !=null){
        if(DL_bIE){
            if((eParElement.tagName !="TABLE")&&(eParElement.tagName !="BODY")){
                nTopPos+=eParElement.clientTop;
            }
        }
        else{
            if(eParElement.tagName=="TABLE"){
                var nParBorder=parseInt(eParElement.border);
                if(isNaN(nParBorder)){
                    var nParFrame=eParElement.getAttribute('frame');
                    if(nParFrame !=null){nTopPos+=1;}
                }
                else if(nParBorder > 0){
                    nTopPos+=nParBorder;
                }
            };
            if(eParElement.tagName=="DIV"){
                var bord=parseInt(eParElement.style.border);
                if(bord > 0){nTopPos+=bord;}
            }
        };
        nTopPos+=eParElement.offsetTop;
        eParElement=eParElement.offsetParent;
    };
    return nTopPos;
};


function setPos(p_obj,p_x,p_y){
    p_obj.style.left=p_x+'px';
    p_obj.style.top=p_y+'px';
    p_obj.style.display='';
}

function Browser(){
    var ua,s,i;
    this.isIE=false;
    this.isNS=false;
    this.isOP=false;
    this.name=navigator.appName;this.version=null;ua=navigator.userAgent;

    if((navigator.userAgent).indexOf("Opera")!=-1){this.isOP=true;}
    else if(navigator.appName=="Netscape"){this.isNS=true;}
    else  if((navigator.appName).indexOf("Microsoft")!=-1){
        this.isIE=true;
    };
    return;
};

function getHTTPObject() { var xmlhttp; /*@cc_on @if (@_jscript_version >= 5) try {  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");    } catch (e) {  try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (E) { xmlhttp = false;  } }  @else  xmlhttp = false; @end @*/  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { try { xmlhttp = new XMLHttpRequest(); } catch (e) {  xmlhttp = false;    }  }  return xmlhttp; }


String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

