﻿// Defines Sign objects

var signArray;
var index;
var areas;
var lines;

Sign = function()
{
}

Sign.prototype = {

    getType: function() {
        return this._type;
    },
    getAlign: function() {
        return this._align;
    },
    getImage: function() {
        return this._image;
    },
    getMarker: function() {
        return this._marker;
    },

    setType: function(type) {
        this._type = type;
    },
    setAlign: function(align) {
        this._align = align;
    },
    setImage: function(image) {
        this._image = image;
    },
    setMarker: function(marker) {
        this._marker = marker;
    }    

}

Sign.registerClass('Sign', null, Sys.IDisposable)

// Signs container
Signs = function()
{
    signsManager = new GMarkerManager(map);
    signArray = new Array();
}

Signs.prototype = 
{
    // Returns a Sign with a specified marker location.
    // If the Sign is not in signArray, returns null
    findSignByPosition: function(location) {
        if (signArray.length == 0)
            return null;
        for (index = 0; index<signArray.length; index++)
        {
            if (signArray[index].getMarker().getPoint() == location)
                return signArray[index];
        }
        return null;
    },
    
    // Adds a new Sign into signArray. If a Sign already exists with the same
    // id, updates the existing Sign instead
    addSign: function(type, align, image, lat, lng) {
        // Create a marker icon
        var icon = new GIcon();
        icon.image=image;
        icon.infoWindowAnchor = new GPoint(23, 23);
        if (type=="tietyo")
        {
            icon.iconSize = new GSize(53, 46);
            icon.iconAnchor = new GPoint(26, 23);
            icon.shadow = "Images/varjo_kolmio.png";
            icon.shadowSize = new GSize(79, 46);            
        }
        else if (type=="teksti")
        {            
            //alert(image.split("_")[1]);
            icon.iconSize = new GSize(image.split('_')[1], image.split('_')[2]);
            if (align=="left")
                icon.iconAnchor = new GPoint(0, icon.iconSize.height / 2);
            if (align=="center")
                icon.iconAnchor = new GPoint(icon.iconSize.width / 2, icon.iconSize.height / 2);
            if (align=="right")
                icon.iconAnchor = new GPoint(icon.iconSize.width, icon.iconSize.height / 2);
        }
        else
        {
            icon.iconSize = new GSize(25, 54);
            icon.iconAnchor = new GPoint(13, 54);
            icon.shadow = "Images/varjo_rajoitusmerkki.png";
            icon.shadowSize = new GSize(67, 54);
        }
        
        var marker = new GMarker(new GLatLng(lat, lng), {icon: icon, clickable: false, draggable: false});
        signsManager.addMarker(marker, 13);

        // Create a new Sign and insert it into the end of the array
        var i = signArray.length;
        signArray[i] = new Sign();

        // Enter Sign information
        signArray[i].setType(type);
        signArray[i].setAlign(align);
        signArray[i].setImage(image);
        signArray[i].setMarker(marker);
    },
    
    // Deletes a Sign from the array
    deleteSign: function(Sign) {
        for (index = 0; index<signArray.length; index++)
            if (signArray[index] == Sign)
            {
                map.removeOverlay(Sign.getMarker());
                signArray.splice(index, 1);
                break;
            }
    },

    // Return all Signs as Sign[]     
    getSigns: function() {
        return signArray;
    },

    // Returns an XML text representation of the Signs
    getXml: function() {    
        var xml = "";
        xml += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
        xml += "<signs>\r\n";
        for (var i=0; i<signArray.length; i++)
        {
            xml += "\t<sign type=\"" + signArray[i].getType() +
                "\" align=\"" + signArray[i].getAlign() +
                "\" image=\"" + signArray[i].getImage() +
                "\" lat=\"" + signArray[i].getMarker().getPoint().lat() +
                "\" lng=\"" + signArray[i].getMarker().getPoint().lng() +
                "\"/>\r\n";
        }
        xml += "</signs>";
        return xml;
    },
    
    // Reads Signs from an XML file
    loadFromFile: function() {
        //Services.ReadSigns(onSucceedReadSigns);
        
        xmlFile = "Roadworks.xml";
        GDownloadUrl(xmlFile + "?a=" + Math.random(), function(data, responseCode) {
            if(responseCode == 200) {
                var xml = GXml.parse(data);

                // Draw areas
                areas = xml.documentElement.getElementsByTagName("area");            
                for (var i = 0; i < areas.length; i++)
                    drawArea(areas[i]);

                // Draw lines
                lines = xml.documentElement.getElementsByTagName("line");
                for (var i = 0; i < lines.length; i++)
                    drawLine(lines[i]);
            }    
        });
        xmlFile = "Signs.xml";
        GDownloadUrl(xmlFile + "?a=" + Math.random(), function(data, responseCode) {
            if(responseCode == 200) {
                var xml = GXml.parse(data);
                // Draw signs
                var _signs = xml.documentElement.getElementsByTagName("sign");
                for (var i = 0; i < _signs.length; i++)
                    signs.addSign(_signs[i].getAttribute("type"), _signs[i].getAttribute("align"), _signs[i].getAttribute("image"), _signs[i].getAttribute("lat"), _signs[i].getAttribute("lng"));
                signsManager.refresh();
            }    
        });
        
    }   
}

function drawArea(area)
{
    var pointArray = new Array();    
    for (var i = 0; i < area.childNodes.length; i++)
        if (area.childNodes[i].tagName == "point")
        {
            var lat = area.childNodes[i].getAttribute("lat");
            var lng = area.childNodes[i].getAttribute("lng");
            pointArray[pointArray.length] = new GLatLng(lat, lng);
        }
    pointArray[pointArray.length] = pointArray[0];
    map.addOverlay(new GPolygon(pointArray, area.getAttribute("color"), area.getAttribute("weight"), area.getAttribute("opacity"), area.getAttribute("fillcolor"), area.getAttribute("fillopacity")));
}

function drawLine(line)
{
    var pointArray = new Array();    
    for (var i = 0; i < line.childNodes.length; i++)
        if (line.childNodes[i].tagName == "point")
        {
            var lat = line.childNodes[i].getAttribute("lat");
            var lng = line.childNodes[i].getAttribute("lng");
            pointArray[pointArray.length] = new GLatLng(lat, lng);
        }
    map.addOverlay(new GPolyline(pointArray, line.getAttribute("color"), line.getAttribute("weight"), line.getAttribute("opacity")));
}

// Creates new set of Signs based on the results from reading an XML file
function onSucceedReadSigns(result)
{
    for (var i=0; i< result.length; i++)
        signs.addSign(result[i].type, result[i].image, result[i].lat, result[i].lng);
}

Signs.registerClass('Signs', null, Sys.IDisposable)

