﻿var IJ = {
    Init: function() {
        this.Map.Init();
    },
    XHR: {
        Request: function() {
            if (typeof XMLHttpRequest != 'undefined') {
                request = new XMLHttpRequest();
            }
            else {
                if (window.ActiveXObject) {
                    try {
                        request = new ActiveXObject("Msxml2.XMLHTTP");
                    }
                    catch (err1) {
                        try {
                            request = new ActiveXObject("Microsoft.XMLHTTP");
                        }
                        catch (err2) {
                            request = false;
                        };
                    };
                };
            };
            return request;
        },
        MakeRequest: function(path, async, method, handler, data, breakCache, XML) {
            if (!request) {
                var request = IJ.XHR.Request();
            };
            // Options
            var _el = path, _async = async || true, _handler = handler || IJ.XHR.ParseData, _method = method || "GET", _breakCache = breakCache || true, url, _data;
            if (typeof _el == "object") {
                url = _el.getAttribute("href");
            }
            else {
                url = _el;
            };
            if (_method == "GET") {
                _data = null;
            }
            else {
                _data = data || url;
            };
            if (_breakCache) {
                url = this.BreakCache(url);
            };
            request.open(_method, url, _async);

            if (method == "POST") {
                request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            };
            request.onreadystatechange = function() {
                if (request.readyState == 4) {
                    if (request.status == 200) {
                        _handler(request.responseText, _el);
                    };
                };
            };
            request.send(_data);
        },
        BreakCache: function(url) {
            var myRandom = parseInt(Math.random() * 99999999);
            if (url.indexOf('?') == -1) {
                url += '?rand=' + myRandom;
            } else {
                url += '&rand=' + myRandom;
            };
            return url;
        },
        ParseData: function(data, el) {
            var _data = data;
            var _el = el;
        },
        SimpleRequest: function(element, async, method, handler, data, breakCache) {
            IJ.XHR.MakeRequest(element, async, method, handler, data, breakCache, false);
        }
    },
    Map: {
        DataUrl: 'projectData.txt',
        Data: null,
        MapObj: {},
        Markers: [],
        RegionProjects: [],
        CountryProjects: [],
        Options: {
            ImageUrl: 'App_Themes/IJ/images/map/',
            Zoom: 2,
            Center: {},
            MapTypeId: google.maps.MapTypeId.ROADMAP
        },
        Init: function() {
            this.Setup();
        },
        Setup: function() {
            this.Options.Center = new google.maps.LatLng(0, 0);
            IJ.Map.MapObj = new google.maps.Map(document.getElementById("mapContainer"), this.Options);
            google.maps.event.addListener(IJ.Map.MapObj, 'zoom_changed', function() { IJ.Map.PlotData() });
            this.GetData();
        },
        CreateIcon: function(color) {

            if (color != "blue") {
                var image = new google.maps.MarkerImage(IJ.Map.Options.ImageUrl + 'icnAllRed.png',
                new google.maps.Size(30, 30),
                new google.maps.Point(0, 0),
                new google.maps.Point(0, 32));
            }
            else {
                var image = new google.maps.MarkerImage(IJ.Map.Options.ImageUrl + 'icnAllBlue.png',
                new google.maps.Size(24, 24),
                new google.maps.Point(3, 3),
                new google.maps.Point(16, 16));
            };

            return image;
        },
        PlotData: function() {

            var data = IJ.Map.Data;

            if (IJ.Map.Markers.length != -1) {
                for (i in IJ.Map.Markers) {
                    IJ.Map.Markers[i].setMap(null);
                };
            };

            if (IJ.Map.MapObj.getZoom() <= 2) {

                for (var i = 0; i < data.Regions.length; i++) {

                    var latLon = new google.maps.LatLng(data.Regions[i].lat, data.Regions[i].lon);

                    var marker = new google.maps.Marker({
                        map: IJ.Map.MapObj,
                        position: latLon,
                        title: data.Regions[i].name,
                        icon: IJ.Map.CreateIcon('red')
                    });

                    var projectList = [];

                    for (var x = 0; x < data.Regions[i].Countries.length; x++) {

                        var list = [];
                        list.Country = data.Regions[i].Countries[x].name;
                        for (var y = 0; y < data.Regions[i].Countries[x].Projects.length; y++) {
                            var projectData = [];
                            projectData.name = data.Regions[i].Countries[x].Projects[y].name;
                            projectData.itemClass = data.Regions[i].Countries[x].Projects[y].itemClass;
                            list.push(projectData);
                        };
                        projectList.push(list);
                    };

                    IJ.Map.RegionProjects.push(projectList);
                    IJ.Map.AddEvents(marker, i);
                    IJ.Map.Markers.push(marker);
                };
                IJ.Map.MapObj.setCenter(new google.maps.LatLng(0, 0));
            }
            else {
                for (var i = 0; i < data.Regions.length; i++) {

                    for (var x = 0; x < data.Regions[i].Countries.length; x++) {
                        var projectList = [];
                        var latLon = new google.maps.LatLng(data.Regions[i].Countries[x].lat, data.Regions[i].Countries[x].lon);
                        var marker = new google.maps.Marker({
                            map: IJ.Map.MapObj,
                            position: latLon,
                            title: data.Regions[i].Countries[x].name,
                            icon: IJ.Map.CreateIcon('blue')
                        });
                        var list = [];
                        list.Country = data.Regions[i].Countries[x];

                        for (var y = 0; y < data.Regions[i].Countries[x].Projects.length; y++) {
                            var projectData = [];
                            projectData.name = data.Regions[i].Countries[x].Projects[y].name;
                            projectData.itemClass = data.Regions[i].Countries[x].Projects[y].itemClass;
                            list.push(projectData);
                        };

                        projectList.push(list);
                        var z = IJ.Map.CountryProjects.length;
                        IJ.Map.AddEvents(marker, i, z, 'country');
                        IJ.Map.CountryProjects.push(projectList);

                        IJ.Map.Markers.push(marker);
                    };
                };
            };
        },
        ParseData: function(data, el) {
            IJ.Map.Data = eval("(" + data + ")");
            IJ.Map.PlotData();
        },
        AddEvents: function(marker, i, z, type) {
            if (type != 'country') {

                google.maps.event.addListener(marker, 'click', function(data) {
                    var dataShortcut = IJ.Map.RegionProjects[i];
                    var content = "<div><ul>";

                    for (a in IJ.Map.RegionProjects[i]) {
                        content += "<li class='title'>" + dataShortcut[a].Country + "</li>";

                        for (var y = 0; y < dataShortcut[a].length; y++) {

                            content += "<li class=" + dataShortcut[a][y].itemClass + ">" + dataShortcut[a][y].name + "</li>";

                        };
                    };
                    content += "</ul></div>";

                    var infowindow = new google.maps.InfoWindow({
                        content: content,
                        maxHeight: 200
                    });

                    infowindow.open(IJ.Map.MapObj, marker);
                });
            }
            else {
                google.maps.event.addListener(marker, 'click', function(data) {
                    var dataShortcut = IJ.Map.CountryProjects[z];
                    var content = "<div style='min-height:80px; padding:0; overflow-y:hidden;'><ul>";
                    content += "<li class='title'>" + dataShortcut[0].Country.name + "</li>";
                    for (var x = 0; x < dataShortcut[0].length; x++) {
                        content += "<li class=" + dataShortcut[0][x].itemClass + ">" + dataShortcut[0][x].name + "</li>";
                    };

                    content += "</ul></div>";

                    var infowindow = new google.maps.InfoWindow({
                        content: content,
                        height:200
                    });

                    infowindow.open(IJ.Map.MapObj, marker);
                });
            };
        },
        CreateInfo: function() {

            var infowindow = new google.maps.InfoWindow({
                content: contentString
            });

        },
        GetData: function() {
            IJ.XHR.SimpleRequest(this.DataUrl, true, 'GET', IJ.Map.ParseData);
        }
    }
};