var WQ = function() {
    function setLastUpdate() {
        now = new Date();
        //strTime = document.createTextNode("Updated: " + now.getDate() + "." + (now.getMonth() + 1) + "." + now.getFullYear() + " " + now.getHours() + ":" + (now.getMinutes() < 10 ? "0" + now.getMinutes() : now.getMinutes()));
        strTime = document.createTextNode("Updated: " + " " + now.getHours() + ":" + (now.getMinutes() < 10 ? "0" + now.getMinutes() : now.getMinutes()) + ":" + (now.getSeconds() < 10 ? "0" + now.getSeconds() : now.getSeconds()));
        if (tmp = document.getElementById("lastupdate").firstChild) {
            tmp.parentNode.replaceChild(strTime, tmp);
        } else {
            document.getElementById("lastupdate").appendChild(strTime);
        }
    }
    function createShipList() {
        if (!WQ.ships.length) {
            return false;
        }
        domList = document.getElementById("markers");
        document.getElementById("noships").style.display = "none";
        if (tmp = document.getElementById("shiplist")) {
            tmp.parentNode.removeChild(tmp);
        }
        myUl = document.createElement("ul");
        myUl.setAttribute("id", "shiplist");
        for (var i = 0; i < WQ.ships.length; i++) {
            myAText = document.createTextNode(WQ.ships[i].name);
            myA = document.createElement("a");
            myA.appendChild(myAText);
            myA.setAttribute("href", "#" + WQ.ships[i].mmsi);
            myA.onclick = function() {
                return WQ.showMarker(this.hash.substr(1));
            }
            myLi = document.createElement("li");
            myLi.appendChild(myA);
            myUl.appendChild(myLi);
            //domList.innerHTML += '<li><a href="#" onclick="return WQ.showMarker(\'' + WQ.ships[i].mmsi + '\')">' + WQ.ships[i].name + '</a></li>';
        }
        //domList.innerHTML += "</ul>";
        domList.appendChild(myUl);
    }
    function createMarker(point, ship) {
        var marker = new GMarker(point, {title: ship.name, icon: ship.icon});
        marker.id = ship.mmsi;
        GEvent.addListener(marker, "click", function(){
            var myEventListener;
            //marker.openInfoWindowHtml(ship.html);
            //marker.showMapBlowup();
            WQ.showMarker(marker.id);
        });
        return marker;
    }
    function mapOverviewInit() {
        window.setTimeout("ovMap.getOverviewMap().setMapType(G_HYBRID_MAP);", 1);
        return true;
    }
    function Ship(shipData) {
        this.lat = parseFloat(shipData.getElementsByTagName("Decimal_Latitude")[0].firstChild.nodeValue);

        this.lng = parseFloat(shipData.getElementsByTagName("Decimal_Longitude")[0].firstChild.nodeValue);

        this.name = shipData.getElementsByTagName("Ship_name")[0].firstChild.nodeValue;
        
        this.mmsi = shipData.getElementsByTagName("MMSI")[0].firstChild.nodeValue;
        
        tmp = shipData.getElementsByTagName("SOG") || false;
        if (tmp.length) {
            this.sog = tmp[0].firstChild.nodeValue;
        }
        
        tmp = shipData.getElementsByTagName("COG") || false;
        if (tmp.length) {
            this.cog = parseFloat(tmp[0].firstChild.nodeValue);
        }
        
        this.html = this.getInfoHtml();

        if (this.cog > 22 && this.cog <= 67) {
            this.icon = this.getIcon("ne");
        } else if (this.cog > 67 && this.cog <= 112) {
            this.icon = this.getIcon("e");
        } else if (this.cog > 112 && this.cog <= 157) {
            this.icon = this.getIcon("se");
        } else if (this.cog > 157 && this.cog <= 202) {
            this.icon = this.getIcon("s");
        } else if (this.cog > 202 && this.cog <= 247) {
            this.icon = this.getIcon("sw");
        } else if (this.cog > 247 && this.cog <= 292) {
            this.icon = this.getIcon("w");
        } else if (this.cog > 292 && this.cog <= 337) {
            this.icon = this.getIcon("nw");
        } else {
            this.icon = this.getIcon("n");
        }
    }
    Ship.prototype.getInfoHtml = function() {
        var strInfo = "";
        strInfo += "<strong>" + this.name + "</strong><br/>";
        strInfo += "speed: " + this.sog + "kn<br/>";
        strInfo += "course: " + this.cog + "°<br/>";
        return strInfo;
    }
    Ship.prototype.getIcon = function(direction) {
        var icon = new GIcon();
        icon.image = "ship-" + direction + ".png";
        icon.iconSize = new GSize(13, 13);
        icon.iconAnchor = new GPoint(6, 6);
        icon.infoWindowAnchor = new GPoint(6, 6);
        return icon;
    }
    
    var that = this;
    var started = (new Date()).getTime();
    var viewTime = 20 * 60 * 1000;
    
    return {
        ship: Ship,
        mapInit: function() {
            window.setTimeout("WQ.mapInit()", viewTime);
            if ((new Date()).getTime() > started + viewTime) {
                var node = document.getElementById("markers");
                while (node.hasChildNodes()) {
                    node.removeChild(node.firstChild);
                }
                var node = document.getElementById("map");
                while (node.hasChildNodes()) {
                    node.removeChild(node.firstChild);
                }
                var holder = document.createElement("div");
                holder.style.margin = "100px auto";
                holder.style.width = "150px";
                holder.style.backgroundColor = "white";
                holder.style.padding = "10px 0";
                holder.style.textAlign = "center";
                var hint = document.createElement("img");
                hint.src = "sartori-berger.gif";
                holder.appendChild(hint);
                var hint = document.createElement("br");
                holder.appendChild(hint);
                var hint = document.createElement("br");
                holder.appendChild(hint);
                var hint = document.createTextNode("Thank you for your interest.");
                holder.appendChild(hint);
                var hint = document.createElement("br");
                holder.appendChild(hint);
                var hint = document.createElement("br");
                holder.appendChild(hint);
                var hint = document.createTextNode("For further usage please restart website");
                holder.appendChild(hint);
                node.appendChild(holder);
                return false;
            }
            if (GBrowserIsCompatible()) {
                setLastUpdate();
                
                WQ.map = new GMap2(document.getElementById("map"));
                WQ.map.enableScrollWheelZoom();
                WQ.map.clearOverlays();
                WQ.markers = new Array();
                WQ.ships = new Array();
                WQ.map.addControl(new GLargeMapControl());
                WQ.map.addControl(new GMapTypeControl());
                WQ.map.addControl(new GScaleControl());
                ovMap = new GOverviewMapControl(new GSize(150, 120));
                WQ.map.addControl(ovMap, new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(0, 0)));
                /*
                GEvent.addListener(WQ.map, "maptypechanged", function() {
                    mapOverviewInit();
                });
                */
                //54.287675,9.648743 - z9 rendsburg
                //54.367959, 10.120468 - z13 kanal einfahrt kiel
                //54.369859, 10.138664, 13
                WQ.map.setCenter(new GLatLng(54.133478, 9.651489), 9);
                /**
                 * will be sth. like http://www.sartori-berger.de/ais-ftp/*.xml
                 */
                WQ.map.setMapType(G_SATELLITE_MAP);
                GDownloadUrl("Kanal.xml.php", function(data, responseCode) {
                    var xml = GXml.parse(data);
                    var markers = xml.documentElement.getElementsByTagName("Ais_Target");
                    for (var i = 0; i < markers.length; i++) {
                        var ship = new Ship(markers[i]);
                        var point = new GLatLng(ship.lat, ship.lng);
                        var tmp = createMarker(point, ship);
                        WQ.markers.push(tmp);
                        WQ.ships.push(ship);
                        WQ.map.addOverlay(tmp);
                    }
                    createShipList();
                });
            } else {
                alert("Leider ist dieser Browser zu Google Maps inkompatibel");
            }
        },
        showMarker: function(mmsi) {
            WQ.map.closeInfoWindow();
            var tmp_marker, tmp_ship;
            for (var i = 0; i < WQ.markers.length; i++) {
                if (WQ.markers[i].id == mmsi) {
                    tmp_marker = WQ.markers[i];
                    break;
                }
            }
            for (var j = 0; j < WQ.ships.length; j++) {
                if (WQ.ships[j].mmsi == mmsi) {
                    tmp_ship = WQ.ships[j];
                    break;
                }
            }
            if (tmp_marker && tmp_ship) {
                myEventListener = GEvent.addListener(WQ.map, "moveend", function () {
                    //marker.showMapBlowup();
                    tmp_marker.openInfoWindowHtml(tmp_ship.html);
                    GEvent.removeListener(myEventListener);
                });
                WQ.map.panTo(tmp_marker.getLatLng());
            }
            return false;
        }
    }
}();
