var arVersion = navigator.appVersion.split("MSIE");
var version = parseFloat(arVersion[1]);

function USize() {
    this.width = 0;
    this.height = 0;
    
    switch(arguments.length) {
        case 1 : this.width = arguments[0];
                  this.height = arguments[0];
                  break;
        case 2: this.width = arguments[0];
                 this.height = arguments[1];
                 break;
        default: break;    
    }    
}

function UPoint() {
    this.x = 0;
    this.y = 0;
    
    switch(arguments.length) {
        case 1 : this.x = arguments[0];
                  this.y = arguments[0];
                  break;
        case 2: this.x = arguments[0];
                 this.y = arguments[1];
                 break;
        default: break;    
    }    
}

function UPosxPosyBounds() {
    
    var nw = new UPoint();
    var se = new UPoint();
    var points = 0;
    
    this.getNorthEast = function () {
        return nw;
    }
    
    this.getSouthWest = function() {
        return se;
    }
    
    this.extend = function(point) {
        
        if(!points) {
            nw.x = point.x;
            nw.y = point.y;
            se.x = point.x;
            se.y = point.y;
            ++points;
            return;
        }
        
        if(point.x < nw.x) nw.x = point.x;
        if(point.y < nw.y) nw.y = point.y;
        
        if(point.x > se.x) se.x = point.x;
        if(point.y > se.y) se.y = point.y;
    
        ++points;        
    }
    
    this.getCenter = function() {
        if(points>1)
            return new UPoint( ((parseInt(se.x)+parseInt(nw.x))/2), ((parseInt(se.y)+parseInt(nw.y))/2) );
        else 
            return new UPoint( parseInt(se.x), parseInt(se.y) );
    }
    
    this.getWidth = function() {
        var width = Math.abs( parseInt(se.x) - parseInt(nw.x) );
        if( points >1 && width > 350 ) return width; else return 350;
    }
    
    this.getHeight = function() {        
        var height = Math.abs(parseInt(se.y) - parseInt(nw.y) );
        if( points >1 && height > 350 ) return height; else return 350;
    }
    
}

function USmallMapControl() {
    var top = 5, left = 5;

    this.control    = document.createElement("div");

    this.zoom_in    = document.createElement("div");
    var zoom_in_img  = document.createElement("img");
    zoom_in_img.src = "/immagini/piu.png";
    this.zoom_in.style.position="absolute";
    this.zoom_in.style.top    = top+"px";
    this.zoom_in.style.left   = left+"px";
    this.zoom_in.style.cursor = "pointer";

    this.zoom_out    = document.createElement("div");
    var zoom_out_img  = document.createElement("img");
    zoom_out_img.src = "/immagini/meno.png";
    this.zoom_out.style.position="absolute";
    
    this.zoom_out.style.left   = "5px";
    this.zoom_in.style.top    = "20px";
    this.zoom_out.style.cursor = "pointer";    

    if(ie4){
        zoom_in_img.style.filter    = "progid:DXImageTransform.Microsoft.Alpha(opacity=0)";
        this.zoom_in.style.filter  = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+zoom_in_img.src+"')";

        zoom_out_img.style.filter   ="progid:DXImageTransform.Microsoft.Alpha(opacity=0)";
        this.zoom_out.style.filter ="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+zoom_out_img.src+"')";
        
       //this.zoom_out.style.top    = (top+this.zoom_out.height+4)+"px";
    }

    
    this.zoom_in.appendChild(zoom_in_img);
    this.zoom_out.appendChild(zoom_out_img);

    this.control.appendChild(this.zoom_in);
    this.control.appendChild(this.zoom_out);
        
    zoom_out_img.onload=function(){ this.parentNode.style.top    = top+"px"; }
    zoom_in_img.onload =function(){ this.parentNode.style.top    = (top+this.height+5)+"px"; }
    
}

function UMarker() {  // Gli eventuali parametri sono (posizione, icona)
    var parent = this;
    var id     = "";
    var position = new UPoint();
    var zero     = new UPoint();
    var ratio    = new UPoint();
    var zoom     = 187309;    
    var icon   = null; 
    
    if(arguments.length==2) 
        icon = arguments[1];
    else
        icon = new UIcon();
        
    if( arguments.length >= 1 ) {        
        position = arguments[0];  // Posizione espressa in metri
    }
    
    this.avatar = document.createElement("div");
    var _avatar = document.createElement("img");        
    _avatar.src = icon.image;
    this.avatar.id            = "avatar";        
    this.avatar.style.position= "absolute";        
    this.avatar.style.top     = position.y+"px";
    this.avatar.style.left    = position.x+"px";        
    this.avatar.style.width   = icon.iconSize.width+"px";
    this.avatar.style.height  = icon.iconSize.height+"px";
    this.avatar.style.cursor  = "pointer";    
    this.avatar.style.zIndex  = 50;
    
    this.shadow = document.createElement("div");
    var _shadow = document.createElement("img");        
    _shadow.src = icon.shadow;
    
    this.shadow.id            = "shadow";
    this.shadow.style.position= "absolute";
    this.shadow.style.top     = position.y+"px";
    this.shadow.style.left    = position.x+"px";        
    this.shadow.style.width   = icon.shadowSize.width+"px";
    this.shadow.style.height  = icon.shadowSize.height+"px";
    this.shadow.style.cursor  = "pointer";    
    this.shadow.style.zIndex  = 5;
    
    if(ie4) {
        _avatar.style.filter     ="progid:DXImageTransform.Microsoft.Alpha(opacity=0)";
        this.avatar.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+_avatar.src+"')";
        
        _shadow.style.filter     ="progid:DXImageTransform.Microsoft.Alpha(opacity=0)";
        this.shadow.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+_shadow.src+"')";
    }
    
    /*_avatar.onload =function(){ this.parentNode.style.top    = (top+this.height+5)+"px"; }
    _shadow.onload =function(){ this.parentNode.style.top    = (top+this.height+5)+"px"; }*/
    
    _avatar.onload =function(){ icon.iconSize.width = this.width+"px"; icon.iconSize.height = this.height+"px";}
    _shadow.onload =function(){ icon.shadowSize.width = this.width+"px"; icon.shadowSize.height = this.height+"px"; }
    
    this.avatar.appendChild(_avatar);
    this.shadow.appendChild(_shadow);
    
     
        
    this.setOnClick = function(manager) {
        this.avatar.onclick = manager;
        this.shadow.onclick = manager;
    }
       
    
    this.setRatio = function(value) {
        ratio = value;        
    }
    
    this.setZero = function(value) { // Coordinate dello Zero espresse in metri
        zero.x = value.x;  
        zero.y = value.y;        
    }
    
    this.setPosition = function() {    	
    	
        var _position = new UPoint();        
        _position.x = position.x;
        _position.y = position.y;
        
        if(arguments.length==1) {
            _position.x = arguments[0].x - zero.x;
            _position.y = arguments[0].y - zero.y;
        } else {
            _position.x -= zero.x;
            _position.y  = zero.y-_position.y;
        }
       	/*
        awidth  = this.avatar.style.width.substr(0, this.avatar.style.width.indexOf("px", 0));
        aheight = this.avatar.style.height.substr(0, this.avatar.style.height.indexOf("px", 0));
        
        // Il marker e' 20x35
        this.avatar.style.left = ((Math.floor( parseInt(_position.x) * ratio.x) )-(parseInt(awidth)/2))+"px";
        this.avatar.style.top  = ((Math.floor( parseInt(_position.y) * ratio.y) )-parseInt(aheight))+"px";
        
        this.shadow.style.left = ((Math.floor( parseInt(_position.x) * ratio.x) )-(parseInt(awidth)/2))+"px";
        this.shadow.style.top  = ((Math.floor( parseInt(_position.y) * ratio.y) )-parseInt(aheight))+"px";       
        */
        //awidth  = this.avatar.getElementsByTagName('img')[0].style.width.substr (0, this.avatar.getElementsByTagName('img')[0].style.width.indexOf("px", 0));
        //aheight = this.avatar.getElementsByTagName('img')[0].style.height.substr(0, this.avatar.getElementsByTagName('img')[0].style.height.indexOf("px", 0));
        
        awidth  = icon.iconSize.width;
        aheight = icon.iconSize.height;
       // alert(icon.iconSize.width+" "+icon.iconSize.height);
        
        // Il marker e' 20x35
        this.avatar.style.left = ((Math.floor( parseInt(_position.x) * ratio.x) )-(parseInt(awidth)/2))+"px";
        this.shadow.style.left = ((Math.floor( parseInt(_position.x) * ratio.x) )-(parseInt(awidth)/2))+"px";
        
	this.avatar.style.top  = ((Math.floor( parseInt(_position.y) * ratio.y) )-(parseInt(aheight)/2))+"px";
	this.shadow.style.top  = ((Math.floor( parseInt(_position.y) * ratio.y) )-(parseInt(aheight)/2))+"px";       

    }
    
    this.getPosition = function() { return position; }
    
    this.setTitle=function(title) {        
        this.avatar.title=title;
        this.shadow.title=title;
    }
    
    this.deselect = function() {
        if(this.avatar) {
            _avatar.src = icon.image;        
            if(ie4){
                this.avatar.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+_avatar.src+"')";            
            }
            this.avatar.style.zIndex=5;
        }
    }
    
    this.select = function() {
        if(this.avatar) {
            _avatar.src=icon.selected;
            if(ie4){
                this.avatar.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+_avatar.src+"')";            
            }
            this.avatar.style.zIndex=100;
        }
    }
}

function UMap(id) {
    var parent  = this;
    var markers = null;
    var map     = null;
    var control = null;
    
    var markers  = new Array();
    var center       = new UPoint();
    var prev_center  = new UPoint();
    var nw      = new UPoint();
    var se      = new UPoint();
    var url     = null;
    
    var map     = document.getElementById(id);
    var width   = map.style.width;
    var height  = map.style.height;
    
    var path_id = null;
    
    map.style.border="1px solid gray";
    map.style.position = "relative";
        
    width  = width.substr(0, width.indexOf("px", 0));
    height = height.substr(0, height.indexOf("px", 0));
    
    this.ondblclick = function() {}
    
    var ratio = new UPoint();
    var zoom  = 100000;
    
    var map_drager     = document.createElement("div");
    var plane          = document.createElement("div");
    var plane_map      = document.createElement("img");        
    var map_img        = document.createElement("div");
    var map_overlay    = document.createElement("div");
    
    var planeOffsetLeft = 0;
    var planeOffsetTop  = 0;
    
    plane.id      = "plane";
    plane.style.position="absolute";
    
    if(ie4) {
       map_overlay.style.setAttribute("cssText", "float:left;display:inline;");
    }
       
    plane_map.id  = "plane_img";
    plane_map.src     = url;
    plane_map.style.zindex=1;
        
    plane.appendChild(plane_map);
    
    map_drager.id = "map_drager";
    map_img.id    = "map_img";
    map_overlay.id= "map_overlay";
   
    map_img.style.overflow="hidden";
    map_img.style.position="relative";    
    
    map_drager.style.position="absolute";
    map_drager.style.zindex="100";
    map_drager.style.color="#FFF";
    map_drager.style.cursor="move";
    
    map_drager.style.width  = width+"px";
    map_drager.style.height = height+"px";
    
    map_img.style.width  = width+"px";
    map_img.style.height = height+"px";
    
    map_drager.appendChild(plane);
    map_overlay.appendChild(map_drager);
    map_img.appendChild(map_overlay);
    
    map = document.getElementById(id);
    map.appendChild(map_img);
    
    width  = parseInt(map.style.width.substr(0, map.style.width.indexOf("px", 0)));
    height = parseInt(map.style.height.substr(0, map.style.height.indexOf("px", 0)));
    
    // four numbers are minx, maxx, miny, maxy   
    Drag.init(map_drager, plane, -width, width, -height, height);
    
    plane.ondblclick = function(event) {    
     
        var x,y;
        
        var e = (event) ? event : window.event;
        
        if(!ie4) {
            x = e.layerX;
            y = e.layerY;
        } else {
            x = e.offsetX;
            y = e.offsetY;
        }
        center.x = parseInt(nw.x) + parseInt((x*(Math.abs(nw.x-se.x)))/(width*1.5));
        center.y = parseInt(nw.y) - parseInt((y*(Math.abs(nw.y-se.y)))/(height*1.5));       
                
        parent.ondblclick();
        
    }
    
    plane.onmouseup = function(){
        var left = plane.style["left"];
        var top  = plane.style["top"];                
        left = parseInt(left.substr(0, left.indexOf("px",0)));
        top  = parseInt(top.substr(0, top.indexOf("px",0)));       
        onDrag(left, top);
    }
    
    function onDrag(x, y) {
        
        x = parseInt(x) + (parseInt(width) *0.25);
        y = parseInt(y) + (parseInt(height)*0.25);
       
        center.x = Math.floor(parseInt(center.x) - parseInt((parseInt(x)/ratio.x)));
        center.y = Math.floor(parseInt(center.y) + parseInt((parseInt(y)/ratio.y)));
                
        if( x > (width*0.25) || x < (-width*0.25) || y > (height*0.25) || y < (-height*0.25)) callMap();
    }
    
    this.addControl = function(MapControl) {
        if(MapControl!='undefined' && control==null) {
            control = MapControl;
            map_overlay.appendChild(MapControl.control);
            control.zoom_in.onclick =this.zoomIn;
            control.zoom_out.onclick=this.zoomOut;
        }
    }
    
    this.addOverlay = function(marker) {        
        
        marker.setZero(nw);
        marker.setRatio(ratio);
        marker.setPosition();        
        markers.push(marker);        
        plane.appendChild(marker.avatar);
        plane.appendChild(marker.shadow);
    }
    
    this.clearOverlays = function() {
        for(var i=0 ; i < markers.length ; i++){            
            plane.removeChild(markers[i].avatar);
            plane.removeChild(markers[i].shadow);
        }
        markers.length=0;
    }
    
    this.getBoundsZoomLevel=function(bounds) {
        var ratio = parseFloat(bounds.getWidth()) / parseFloat(bounds.getHeight());
        
        if(ratio >= 1)        
            return Math.floor((parseFloat(bounds.getWidth()) / (((parseFloat(width)*1.5)*0.0254) / 72) ) * 3);
        else
            return Math.floor((parseFloat(bounds.getHeight()) / (((parseFloat(height)*1.5)*0.0254) / 72) ) * 3);
    }
    
    this.getCenter = function() { return center; }
    
    this.setCenter = function() { // prende in input un Punto ed il fattore di zoom
        if(arguments.length >= 1) {
           center.x = arguments[0].x;
           center.y = arguments[0].y;
        }

        if(arguments.length == 2) {
            zoom = arguments[1];            
        }
        
        callMap();
    }
    
    this.setZoom = function(value) {
        zoom = value;        
        callMap();
    }
    
    this.zoomIn = function() {
        zoom =Math.floor(zoom/1.5);
        if(zoom<500){ zoom = 500;}        
        callMap();
    }
    
    this.zoomOut = function() {
        zoom = Math.floor(zoom*1.5);
        callMap();
    }
    
    this.setPathID = function(id) {
        path_id = id;        
        callMap();
    }
    
    function callMap() {       
        var post  = "pIn=<AL><CENTER X='"+center.x+"' Y='"+center.y+"'/><SIZE W='"+(width*1.5)+"' H='"+(height*1.5)+"'/><SC VAL='"+zoom+"'/>";
            post += (path_id != null) ? "<PATH ID='"+path_id+"'/>" : "";
            post +="</AL>";
        
        if(ie4) {
            var _iframe              = document.createElement('iframe');
                _iframe.width        = 0;
                _iframe.height       = 0;
                _iframe.style.border = 'none';
                _iframe.id           = "internal_frame";
                _iframe.name         = "internal_frame";
                _iframe.src          = "/getUbiestMappa.php?"+post;      
                              
                document.body.appendChild(_iframe);
               
                _iframe.onreadystatechange = function() {
                    if(this.readyState=='complete') {                    
                         onCallMap(this.contentWindow.document);                     
                         //document.body.removeChild(this);
                    }
                }
                
        } else {          
        	
            var xmlhttp = newXMLHttpRequest();            
            if (xmlhttp!=null) {            
                xmlhttp.open("POST","/getUbiestMappa.php",true);
                xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                xmlhttp.setRequestHeader("Content-length",post.length);
                //xmlhttp.setRequestHeader("connection","close");
                //xmlhttp.setRequestHeader("Connection", "Keep-Alive");
                xmlhttp.send(post);
                xmlhttp.onreadystatechange = handleResponse(xmlhttp, ( arguments.length == 1 ) ? arguments[0] : onCallMap, ResponseType.xml);
                
            } else {
                alert("Il tuo browser non supporta XMLHttpRequest")
            }
        }       
    }
        
    function onCallMap(XMLResult) {
        
        var _map    = XMLResult.getElementsByTagName('map')[0];
        var _center = XMLResult.getElementsByTagName('center')[0];
        var _nw     = XMLResult.getElementsByTagName('nw')[0];
        var _se     = XMLResult.getElementsByTagName('se')[0];
        var _square = XMLResult.getElementsByTagName('square')[0];
        
        center.x = _center.getAttribute("x");
        center.y = _center.getAttribute("y");
        
        nw.x = _nw.getAttribute("x");
        nw.y = _nw.getAttribute("y");
        
        se.x = _se.getAttribute("x");
        se.y = _se.getAttribute("y");
                
        document.getElementById("plane_img").src = _map.getAttribute("url");
       
        ratio.x =  (width*1.5)  / parseInt(_square.getAttribute("w"));
        ratio.y =  (height*1.5) / parseInt(_square.getAttribute("h"));
        
        for(var i=0 ; i < markers.length ; i++){
            markers[i].setZero(nw);
            markers[i].setRatio(ratio);
            markers[i].setPosition();
        }
                
        plane.style.top    = "-"+(height*0.25)+"px";
        plane.style.left   = "-"+(width*0.25)+"px";
        
        planeOffsetLeft = plane.offsetLeft;
        planeOffsetTop  = plane.offsetTop;
    }
}


function UGeocoder() {

    this.getPosxPosy = function(address, manager) {
        
        var comune = escape(document.getElementById("dove").value);
        var post = "indirizzo="+escape(address)+"&comune="+comune;
        if(!ie4) {
            var xmlhttp = newXMLHttpRequest();
                
            if (xmlhttp!=null) {        
                xmlhttp.open("POST","geocodeAddress.php",true);
                xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                xmlhttp.send(post);        
                xmlhttp.onreadystatechange = handleResponse(xmlhttp, responseHandler, ResponseType.xml, manager);
            } else {
                alert("Il tuo browser non supporta XMLHttpRequest")
            }
        } else {
            var _iframe              = document.createElement('iframe');
                    _iframe.width        = 0;
                    _iframe.height       = 0;
                    _iframe.style.border = 'none';
                    _iframe.id           = "internal_frame";
                    _iframe.name         = "internal_frame";
                    _iframe.src          = "/geocodeAddress.php?"+post;      
                                  
                    document.body.appendChild(_iframe);
                   
                    _iframe.onreadystatechange = function() {
                    
                        if(this.readyState=='complete') {                        
                            //responseHandler(this.contentWindow.document, manager);
                            //alert( this.contentWindow.document.getElementsByTagName('coordinate')[0].getAttribute("x") );
                            var _coordinate = this.contentWindow.document.getElementsByTagName('coordinate')[0];
                            var position    = new UPoint();

                            position.x = _coordinate.getAttribute("x");
                            position.y = _coordinate.getAttribute("y");

                            manager(position);
                            document.body.removeChild(this);
                        }
                    }
        }
    }
    
    function responseHandler(XMLResult, manager) {
        var _coordinate = XMLResult.getElementsByTagName('coordinate')[0];
        var position    = new UPoint();
        
        position.x = _coordinate.getAttribute("x");
        position.y = _coordinate.getAttribute("y");
        
        manager(position);
    }
    
}

function UIcon() {
    this.image    = "/immagini/marker_pu.png";
    this.shadow   = "/immagini/shadow_pu.png";
    this.selected = "/immagini/marker_selected.png";
    this.iconSize = new USize(20, 34);
    this.shadowSize = new USize(37, 34);
    this.iconAnchor = new UPoint(9, 34);
    this.infoWindowAnchor = new UPoint(9, 2);    
    this.infoShadowAnchor = new UPoint(18, 25);
}

var UEvent = {
    addListener : function(object, event, manager) {
        switch(event) {
            case "click" : object.setOnClick(manager);
                            break;
            default : break;
        }
    }
};