﻿dojo.require("hb.hb");
dojo.require("hb.hash");
dojo.require("hb.dijit.MapApp");
dojo.require("dijit.form.Button");
dojo.require("hb.dijit.MapInfoManager");
dojo.require("hb.dijit.Panel");
dojo.require("hb.dijit.Dialog");
dojo.require("hb.dijit.SendMessageDialog");
dojo.require("dojox.analytics.Urchin");


var widgets = [];
esri.config.defaults.io.proxyUrl = "proxy.ashx?cl=" + hb.client;

function init(){
    if (!app.mapDijit.loaded)
        app.connect(app.mapDijit, "onMapLoad", mapLoad);
    else 
        mapLoad();
    app.connect(app.widgets, "onWidgetCreate", widgetCreate);

    // add language switcher (helps adjust top bar height)
    var dc = dojo.create;
    var node = dc("span", { "class": "hbLang dijitInline" }, app.toolsNode);
    dc("a", { "class": "hbLangLV", innerHTML: "LV", href: "default.aspx?lang=lv" }, node);
    //dc("a", { "class": "hbLangRU", innerHTML: "RU", href: "default.aspx?lang=ru" }, node);
    dc("a", { "class": "hbLangEN", innerHTML: "EN", href: "default.aspx?lang=en" }, node);

    app.resize();
    dojo.fadeOut({node:"loading", onEnd:function(){ dojo.style("loading", "display", "none"); }}).play();
}

function mapLoad() {
    var dc = dojo.create;
    strings = dojo.i18n.getLocalization("hb", "mapslt_api");
    
    // logos
    node = dc("a", {href:"http://www.esri.com", target:"_blank"}, app.mapDijit.bottomRight);
    dc("img", {src:"img/esri.jpg", alt:"Powered by ESRI&reg;"}, node);
    dojo.place(dojo.doc.createTextNode(" "), app.mapDijit.bottomRight);
    
    // add map info manager
    var clearNode = app.mapDijit.addAction(strings.clearMap, "hbClearIcon", function(){
        dojo.style(mapInfoMngr.domNode, "top", (dojo.contentBox(clearNode).t+4)+"px");
        mapInfoMngr.toggle();
    });
    var mapInfoMngr = new hb.dijit.Panel({
        title: strings.clearMap, 
        content: "<div dojoType='hb.dijit.MapInfoManager'></div>", 
        "class": "hbMapInfoManagerPane", 
        opened: false
    }, dc("div", {}, clearNode, "after"));
    widgets.push(mapInfoMngr);
    
    // context menu
    addContextMenu(strings.getPointLink, function(ev){ getPointLink(ev.mapPoint); });

    if (dojo.isIE == 6)
        warnIE6();
    checkUriFragment();
    dojo.query(".hbLogo").onclick(function(){ location.href='http://www.ikarte.lv'; });
    
    app.resize();
}

function widgetCreate(id, widget){
    if (id === "routing"){
        // Add option to get link to route
        var node = dojo.create("div", {"class":"hbActionElement", innerHTML:strings.getRouteLink}, widget.results.resultsNode);
        widget.connect(node, "onclick", function(){ getRouteLink(widget); });
    }
}

function uninit(){
    for (var i in widgets)
        widgets[i].destroyRecursive();
}


// Dialogs ---

var problemDlg;
function reportProblem(){
    if (!problemDlg){
        problemDlg = new hb.dijit.SendMessageDialog({
            title:strings.reportBug,
            url: hb.servicesUrl + 'comment.ashx?cl=' + hb.client
        });
        problemDlg.startup();
        widgets.push(problemDlg);
    }
    problemDlg.show();
}

var ie6WarningDlg;
function warnIE6(){
    if (!ie6WarningDlg){
        var dlg = ie6WarningDlg = new hb.dijit.Dialog({ 
            title: strings.warning, 
            content:strings.ie6Warning 
        });
        dlg.startup();
        dlg.attr("buttons", hb.dijit.Dialog.OK);
        dojo.addClass(dlg.domNode, "hbWarningDialog");
        widgets.push(dlg);
    }
    ie6WarningDlg.show();
}

var linkDlg;
function getLink(params){
    var map = app.map;
    var center = hb.center(map.extent);
    var dlg = linkDlg;
    if (!dlg){
         dlg = new hb.dijit.Dialog({ title: strings.linkTitle });
         dlg.startup();
         linkDlg = dlg;
    }
    
    var endPos = location.href.indexOf("#");
    var url = endPos > 0 ? location.href.substr(0, endPos) : location.href;
    url = url + "#" + params + "&xy=" + Math.round(center.x, 0) + "," + Math.round(center.y, 0) + 
        "&z=" + hb.scale(map);
    dlg.attr("content", "<textarea cols='50' rows='6'>"+url+"</textarea>");
    dlg.show();
}

var coordsDlg;
function getCoordinates(lks){
    var geometryService = new esri.tasks.GeometryService(hb.servicesProxyUrl + "Geometry/GeometryServer?cl=" + hb.client);
    geometryService.project(
        [new esri.Graphic(lks)], 
        new esri.SpatialReference({ wkid: 4326 }),
        function(graphics){
            var dlg = coordsDlg;
            if (!dlg){
                var dlg = new hb.dijit.Dialog({ title: strings.coordinates });
                dlg.startup();
                coordsDlg = dlg;
            }
            
            var wgs = graphics[0].geometry;
            var content = dojo.string.substitute("${lks_x}, ${lks_y} (LKS)<br \>${wgs_y}, ${wgs_x} (WGS)", 
                { lks_x: Math.round(lks.x, 0), lks_y: Math.round(lks.y, 0),
                  wgs_x: Math.round(wgs.x*1000000)/1000000, wgs_y: Math.round(wgs.y*1000000)/1000000});
            dlg.attr("content", content);
            dlg.show();
        }
    );
}

var msgDlg;
function showMsg(msg){
    var dlg = msgDlg;
    if (!dlg){
         dlg = new hb.dijit.Dialog({buttons:hb.dijit.Dialog.OK});
         dlg.startup();
         msgDlg = dlg;
    }
    dlg.setContent(msg);
    dlg.show();
}


// Widgets ---

// support for safely calling function on widgets as 
// the widgets might need to be loaded first
function callWidget(widgetId, funct){
    var widget = app.widgets.getWidget(widgetId);
    if (widget){
        funct(widget);
    } else {
        var connect = dojo.connect(app.widgets, "onWidgetShow", function(id, widget){
            if (id === widgetId)
                funct(widget);
            dojo.disconnect(connect);
        });
    }
    app.selectWidget(widgetId);
}


// Context menu ---

function addContextMenu(label, callback){
    var item = new dijit.MenuItem({ label:label });
    dojo.publish("hb.dijit.MapContextMenu.addItem", [app.map, item]);
    app.connect(item, "onClick", function(){
        var event = item.getParent().lastEvent;
        if (event)
            callback(event);
    });
    return item;
}


// Links ---

var linkGraphics;
function checkUriFragment(){
    try {
        var map = app.map;
        var layers = app.mapDijit.layers;
        
        // Support for MapInfoManager
        linkGraphics = {
            id: "link",
            title: strings.linkTitle,
            gfx: new hb.GraphicsManager(map),
            clear: function(){ linkGraphics.gfx.clear(); }
        }
        app.connect(linkGraphics.gfx, "onClear", function(){ dojo.publish("hb.mapInfoCleared",[linkGraphics]); });
        app.connect(linkGraphics.gfx, "onShow", function(){ dojo.publish("hb.mapInfoShown",[linkGraphics]); });
        
        var query = hb.hash.get("q");
        if (query){
            callWidget("geocoding", function(widget){ widget.search(query); });
        }

        var search = hb.hash.get("o_text");
        if (search){
            callWidget("search", function(w){ w.search(hb.hash.get("o_territ"), hb.hash.get("o_type"), search); });
        }

        var dirs = hb.hash.get("d");
        if (dirs){
            callWidget("routing", function(w){ 
                w.routing.loadLocations(dirs, hb.hash.get("d_prsrv")); 
                var imp = hb.hash.get("d_imp");
                if (imp)
                    w.routing.attr("impedanceAttribute", imp);
                
                var autoZoom = w.routing.attr("autoZoom");
                w.routing.attr("autoZoom", false);
                var c = dojo.connect(w.routing, "onSolveStart", function(){
                    dojo.disconnect(c);
                    w.routing.attr("autoZoom", autoZoom);
                });
                if (!hb.hash.get("d_ns"))
                    w.routing.initiateSolve(); 
            });
        }
        
        var type = hb.hash.get("t");
        if (type && hb.layerDefs[type] && hb.layerDefs[type].group === "bg")
            layers.show(type);
            
        var center = hb.hash.get("xy");
        if (center){
            var coords = center.split(",");
            if (coords.length === 2){
                var scale = hb.hash.get("z");
                if (scale)
                    var level = hb.level({map:map, scale:scale});
                else
                    var level = map.getLevel();
                var pt = new esri.geometry.Point(parseFloat(coords[0]), parseFloat(coords[1]))
                map.centerAndZoom(pt, level);
            }
        }
        
        var obj = hb.hash.get("obj");
        if (obj){
            var parts = obj.split("|");
            if (parts.length === 1) parts = obj.split(";");
            if (parts.length === 4){
                var object = {
                    geometry: {type:"point", coords:[parseFloat(parts[0]), parseFloat(parts[1])]},
                    title: parts[2],
                    info: parts[3]
                };
                linkGraphics.gfx.showObject(object);
            }
        }
        
        //hb.hash.set({}, true);
        
        if (dojo.isIE) document.title = "maps.lt";
    } catch(e) {hb.err(e);}
}

function getPointLink(mapPoint){
    getLink("obj=" + Math.round(mapPoint.x, 0) + ";" + Math.round(mapPoint.y, 0) + ";" + hb.encode(strings.pointTitle) + ";");
}

function getRouteLink(routingWidget){
    getLink("d=" + routingWidget.routing.getLocations()+"&d_imp="+routingWidget.routing.impedanceAttribute);
}



dojo.addOnLoad(init);
dojo.addOnWindowUnload(uninit);
