var map = null;
var centerLat;
var centerLon;
var centerPoint;
var layerPoints;
var navCell;
var svCell;
var dirCell;
var iconCell;
var mapCenter;
var mapZoom;
var pntColor;
var homeTitle;
var homeDesc;

function init_map(defaults) {
    navCell = document.getElementById("Map_Nav");
    svCell = document.getElementById("SV_Window");
    dirCell = document.getElementById("Map_Directions");
    iconCell = document.getElementById("Map_Icons");

    centerLat = defaults.lat;
    centerLon = defaults.lon;

    centerPoint = new VELatLong(centerLat, centerLon);

    map = new VEMap("VE_Map");
    map.LoadMap(centerPoint, 14, null, null, null, false);

    layerPoints = new VEShapeLayer();
    map.AddShapeLayer(layerPoints);

    homeTitle = defaults.name;
    homeDesc = defaults.address + "<br />" +
               defaults.city + ", " + defaults.state + " " + defaults.zip + "<br />" +
               defaults.phone + "<br />" +
               "Directions: <a target=\"_blank\" href=\"http://www.mapquest.com/directions/main.adp?1sb=revise&2a=" +
					  		defaults.address + "&2c=" + defaults.city + "&2s=" + defaults.state + "&2z=" + defaults.zip + "&2y=US&cid=lfddlink\">To Here</a> - " +
					  		"<a target=\"_blank\" href=\"http://www.mapquest.com/directions/main.adp?2sb=revise&1a=" +
					  	    defaults.address + "&1c=" + defaults.city + "&1s=" + defaults.state + "&1z=" + defaults.zip + "&1y=US&cid=lfddlink\">From Here</a>";

    AddHome();
}

function findData(what, cat, color) {
    pntColor = color;

    layerPoints.DeleteAllShapes();
    removeDirections(true);
    PageMethods.FindData([what, cat, centerLat, centerLon], FindSuccess, function (msg) { alert(msg); });
}

function FindSuccess(results, userContext, methodName) {
    var img = "/global/images/map_" + pntColor + ".png";

    if (results.length <= 0) { alert("No Results Found!"); }
    else {
        for (var i = 0; i < results.length; i++) {
            var res = results[i].split("|");
            var title = res[0];
            var phone = res[1];
            var address = (res[2].length > 0) ? res[2] + "<br />" + res[3] : res[3];
            var lat = res[4];
            var lon = res[5];
            var url = res[6];
            var pnt = new VEShape(VEShapeType.Pushpin, new VELatLong(lat, lon));
            var desc = "";

            // Info Window Contents
            desc = address + "<br />\n" +
                   phone + "<br /><br />\n" +
                   "<strong>Mapping Tools</strong><br />" +
                   "<a class=\"map_info_tools\" href=\"#\" onclick=\"getDirections(" + lat + "," + lon + ", false);return false;\">Driving Directions</a> | " +
                   "<a class=\"map_info_tools\" href=\"#\" onclick=\"getDirections(" + lat + "," + lon + ", true);return false;\">Walking Directions</a><br />" +
                   "<a class=\"map_info_tools\" href=\"#\" onclick=\"streetView(\'" + title.replace("\'", "\\'") + "\'," + lat + "," + lon + ");return false;\">Street View</a> | " +
                   "<a class=\"map_info_tools\" ref=\"#\" onclick=\"OpenMobile();return false;\">Send to Mobile</a>";

            desc += "<div id=\"Text_Box\">" +
                    "Send to Mobile:<br />" +
                    "<input type=\"text\" size=\"1\" id=\"npa\" onkeyup=\"tab(this, \'nxx\');\" maxlength=\"3\" />-" +
                    "<input type=\"text\" size=\"1\" id=\"nxx\" onkeyup=\"tab(this, \'nnnn\');\" maxlength=\"3\" />-" +
                    "<input type=\"text\" size=\"2\" id=\"nnnn\" onkeyup=\"tab(this, \'send_text\');\" maxlength=\"4\" /> " +
                    "<input type=\"button\" class=\"btn\" id=\"send_text\" value=\"Send\" onclick=\"SendText(\'" + title.replace("\'", "\\'") + "\\n" + phone + "\\n" + address.replace("<br />", "\\n") + "\');return false;\" /><br />" +
                    "<div id=\"Disclaimer_Box\"><a href=\"#\" onclick=\"RunDisclaimer();return false;\">disclaimer</a></div>" +
                    "</div>";

            pnt.SetTitle((url.length > 0) ? "<a href=\"" + url + "\" class=\"map_info_title\" target=\"_blank\">" + title + "</a>" : "<span class=\"map_info_title\">" + title + "</span>");
            pnt.SetCustomIcon(img);
            pnt.SetDescription(desc);

            layerPoints.AddShape(pnt);
        }

        AddHome();
        RealignMap();
    }

    //Save Map Info
    mapCenter = map.GetCenter();
    mapZoom = map.GetZoomLevel();
}

function AddHome() {
    var pntHome = new VEShape(VEShapeType.Pushpin, centerPoint);
    pntHome.SetCustomIcon("/global/images/map_apt.png");
    pntHome.SetTitle(homeTitle);
    pntHome.SetDescription(homeDesc);

    layerPoints.AddShape(pntHome);
}

function RealignMap() {
    var scale = 10; // %
    var coords = layerPoints.GetBoundingRectangle();
    var a = 0.0;
    var b = 0.0;

    a = coords.TopLeftLatLong.Latitude - coords.BottomRightLatLong.Latitude;
    b = coords.BottomRightLatLong.Longitude - coords.TopLeftLatLong.Longitude;

    a = a * scale / 100;
    b = b * scale / 100;

    coords.TopLeftLatLong.Latitude += a;
    coords.TopLeftLatLong.Longitude -= b;
    coords.BottomRightLatLong.Latitude -= a;
    coords.BottomRightLatLong.Longitude += b;

    map.SetMapView(coords);
}

function getDirections(lat, lon, walking) {
    var pnt = new VELatLong(lat, lon);
    var options = new VERouteOptions();
    var box = createElement("div", { 'class': "nav_icons" });
    var walk, walk_link;
    var drive, drive_link;
    var print, print_link;
    var close, close_link;

    removeChildren(dirCell);

    if (walking) {
        drive_link = createElement("a", { href: "#", onclick: "getDirections(" + lat + "," + lon + ",false);return false;" });
        walk = createElement("img", { title: "Walking Directions", src: "/global/images/map_walk_gray.png", alt: "walk" });
        drive = createElement("img", { title: "Driving Directions", src: "/global/images/map_car.png", alt: "car" });
        drive_link.appendChild(drive);
        box.appendChild(walk);
        box.appendChild(drive_link);

        options.RouteMode = VERouteMode.Walking;
    }
    else {
        walk_link = createElement("a", { href: "#", onclick: "getDirections(" + lat + "," + lon + ",true);return false;" });
        walk = createElement("img", { title: "Walking Directions", src: "/global/images/map_walk.png", alt: "walk" });
        drive = createElement("img", { title: "Driving Directions", src: "/global/images/map_car_gray.png", alt: "car" });
        walk_link.appendChild(walk);
        box.appendChild(walk_link);
        box.appendChild(drive);
    }

    print_link = createElement("a", { href: "#", onclick: "print();return false;" });
    print = createElement("img", { title: "Print Directions", src: "/global/images/map_print.png", alt: "print" });
    print_link.appendChild(print);
    box.appendChild(print_link);
    close_link = createElement("a", { href: "#", onclick: "removeDirections(false);return false;" });
    close = createElement("img", { title: "Close Directions", src: "/global/images/map_close.png", alt: "close" });
    close_link.appendChild(close);
    box.appendChild(close_link);

    options.RouteCallback = displayRoute;
    map.GetDirections([centerPoint, pnt], options);

    layerPoints.Hide();
    dirCell.appendChild(box);
}

function displayRoute(route) {
    var leg = route.RouteLegs[0];
    var turns = "<p>Total distance: " + route.Distance.toFixed(1) + " mi</p>\n";
    var numTurns = 0;
    var turn = null;
    var icons = "";

    turns += "<ol>\n";
    for (var j = 0; j < leg.Itinerary.Items.length; j++) {
        turn = leg.Itinerary.Items[j];
        numTurns++;
        turns += "<li>" + turn.Text + " (" + turn.Distance.toFixed(1) + "mi)</li>\n";

        //Add Hints
        if (leg.Itinerary.Items[j].Hints) {
            turns += "<ul>\n";
            for (var k = 0; k < leg.Itinerary.Items[j].Hints.length; k++) {
                turns += "<li>" + leg.Itinerary.Items[j].Hints[k].Text + "</li>\n";
            }
            turns += "</ul>\n";
        }
    }

    turns += "</ol>\n";

    dirCell.innerHTML += turns;
    dirCell.style.display = "block";
    navCell.style.display = "none";
}

function removeDirections(partial) {
    try {
        map.DeleteRoute();
        layerPoints.Show();

        if (!partial) { map.SetCenterAndZoom(mapCenter, mapZoom); }

        dirCell.style.display = "none";
        navCell.style.display = "block";
    }
    catch (err) {
        alert(err.message);
    }
}

function streetView(title, lat, lon) {
    var url = "http://maps.google.com/?layer=c&cbp=13,201.12,,0,5&output=svembed&cbll=" + lat + "," + lon;
    var sv_frame = createElement("iframe", { frameBorder: 0, scrolling: 'no', width: '100%', height: 300, src: url });
    var old_frame = svCell.getElementsByTagName("iframe");
    var title_holder = svCell.getElementsByTagName("p");

    //Add Title p if needed
    if (title_holder.length < 2) { svCell.insertBefore(document.createElement("p"), title_holder[0]); }
    else if (title_holder[0].firstChild != null) { title_holder[0].removeChild(title_holder[0].firstChild); }

    title_holder[0].appendChild(document.createTextNode(title));
    if (old_frame.length > 0) { svCell.removeChild(old_frame[0]); }

    svCell.appendChild(sv_frame);
    svCell.style.display = "block";
}

function close_SV() {
    var old_frame = svCell.getElementsByTagName("iframe");
    var title_holder = svCell.getElementsByTagName("p");

    if (title_holder[0].firstChild != null) { title_holder[0].removeChild(title_holder[0].firstChild); }
    if (old_frame.length > 0) { svCell.removeChild(old_frame[0]); }
    svCell.style.display = "none";
}

function SendText(msg) {
    var npa = document.getElementById("npa").value;
    var nxx = document.getElementById("nxx").value;
    var nnnn = document.getElementById("nnnn").value;

    if (npa.length != 3 || isNaN(npa) ||
        nxx.length != 3 || isNaN(nxx) ||
        nnnn.length != 4 || isNaN(nnnn)) {

        alert("Invalid Phone Number!");
    }
    else {
        PageMethods.SendText([npa + nxx + nnnn, msg], function () { alert("Text Message Sent!"); }, function () { alert("Error Sending Text!"); });
    }
}

function OpenMobile() {
    var cell = document.getElementById("Text_Box");

    if (cell.style.display != "block") { cell.style.display = "block"; }
    else { cell.style.display = "none"; }
}

function RunDisclaimer() {
    var cell = document.getElementById("Disclaimer_Box");

    cell.innerHTML = "SMS and other charges may apply<br /> depending on your carrier and phone plan";
}
