﻿var filter_items = new Array();
var myMQMmap = null;
var extent = new ExtentMarkers();
var expanded = false;

function ExtentMarkers() {
    this.bFirstTime = true;
    this.xMin = 0;
    this.xMax = 0;
    this.yMin = 0;
    this.yMax = 0;
}

ExtentMarkers.prototype.calcCenter = function () {
    var xCenter = this.xMin + ((this.xMax - this.xMin) / 2);
    var yCenter = this.yMin + ((this.yMax - this.yMin) / 2);
    return extent.getMQLatLng(yCenter, xCenter);
}

ExtentMarkers.prototype.calcBound = function () {
    return new MQA.RectLL(extent.getMQLatLng(this.yMin, this.xMin), extent.getMQLatLng(this.yMax, this.xMax));
}

ExtentMarkers.prototype.getMQLatLng = function (yCenter, xCenter) {
    var latlng = new MQA.LatLng;
    latlng.setLatLng(yCenter, xCenter);
    return latlng;
}

function initialize(idContainer) {
    if (myJSONObject) {
        // Create an object for options
        var options = {
            elt: document.getElementById(idContainer),      // ID of element on the page where you want the map added
            zoom: 10,                                       // initial zoom level of the map
            latLng: { lat: 33.5086439, lng: -112.021973 },   // center of map in latitude/longitude
            mtype: 'map',                                   // map type (map)
            bestFitMargin: 0,                               // margin offset from the map viewport when applying a bestfit on shapes
            zoomOnDoubleClick: bMoveableMap                 // zoom in when double-clicking on map
        };

        // Check if map has already been drawn, and if so store the map type
        if (myMQMmap) { var mapType = myMQMmap.getCurrentMapType(); }

        // Construct an instance of MQA.TileMap with the options object
        myMQMmap = new MQA.TileMap(options);

        // Fit map into container
        if (bMoveableMap)
            myMQMmap.setSize();
        else
            myMQMmap.setSize(new MQA.Size(208, 202));

        if (bMoveableMap) {
            // Add map controls
            MQA.withModule('smallzoom', 'viewoptions', 'insetmapcontrol', 'mousewheel', 'htmlpoi', function () {

                // Add MQ smallzoom control
                myMQMmap.addControl(
            new MQA.SmallZoom(),
            new MQA.MapCornerPlacement(MQA.MapCorner.TOP_LEFT, new MQA.Size(5, 5))
            );

                // Add MQ viewoptions control (Map/Satellite)
                myMQMmap.addControl(
            new MQA.ViewOptions()
            );

                // MQ insetmapcontrol control options
                var InsetMapOptions = {
                    size: { width: 150, height: 125 },
                    zoom: 3,
                    mapType: 'map',
                    minimized: true
                };

                // Add MQ insetmapcontrol control options
                myMQMmap.addControl(
            new MQA.InsetMapControl(InsetMapOptions),
            new MQA.MapCornerPlacement(MQA.MapCorner.BOTTOM_RIGHT)
            );

                // MQ enable mousewheel
                myMQMmap.enableMouseWheelZoom();

            });
        } else {
            myMQMmap.setDraggable(false);
        }

        if (expanded)
            setStyle(document.getElementById(map_holder), 'dynamic_map_large');
        else
            setStyle(document.getElementById(map_holder), 'dynamic_map_small');

        var len = myJSONObject.Table.length;
        if (myJSONTypes)
            var typesLen = myJSONTypes.Types.length;
        for (var i = 0; i < len; i++) {

            var filter_flag = false;

            if (myJSONTypes) {
                var servicesArray = myJSONObject.Table[i].ServicesArray;
                var servicesLen = servicesArray.length;

                for (var j = 0; j < typesLen; j++) {

                    var found = false;
                    for (var k = 0; k < servicesLen; k++) {
                        if (servicesArray[k] == myJSONTypes.Types[j].name) {
                            found = true;
                        }
                    }

                    if (found) {
                        //Do nothing
                    } else if (filter_items[myJSONTypes.Types[j].name] == true) {
                        filter_flag = true;
                    }
                }
            }

            if (!filter_flag) {
                addMarker(extent, myJSONObject.Table[i].AddressLine1, myJSONObject.Table[i].City, myJSONObject.Table[i].StateProvince, myJSONObject.Table[i].PostalCode, myJSONObject.Table[i].PhoneNumber, myJSONObject.Table[i].MicrositeUrl, myJSONObject.Table[i].MicrositeMobileUrl, myJSONObject.Table[i].StoreName, myJSONObject.Table[i].ClinicTypeId, myJSONObject.Table[i].IsOpen, parseFloat(myJSONObject.Table[i].Latitude), parseFloat(myJSONObject.Table[i].Longitude));
            }
        }

        if (mapType) {
            myMQMmap.setMapType(mapType);
        }
    }
}

function addMarker(extent, address, city, state, zip, phone, microsite_url, mobile_microsite_url, store_name, is_spa, is_open, lat, lng) {

    var icon = new MQA.Icon("/common/refresh/img/CustomMQMap/pin.png", 17, 37);
    var shadow = new MQA.Icon("/common/refresh/img/CustomMQMap/pin_shadow.png", 25, 19);

    if (lat && lng) {
        if (extent.bFirstTime) {
            extent.xMin = extent.xMax = lng;
            extent.yMin = extent.yMax = lat;
            extent.bFirstTime = false;
            myMQMmap.setCenter(extent.getMQLatLng(lat, lng), 13);
        }
        else {
            if (extent.xMin > lng)
                extent.xMin = lng;
            if (extent.yMin > lat)
                extent.yMin = lat;
            if (extent.xMax < lng)
                extent.xMax = lng;
            if (extent.yMax < lat)
                extent.yMax = lat;

            myMQMmap.setCenter(extent.calcCenter());
            myMQMmap.zoomToRect(extent.calcBound());
        }

        var url = build_microsite_link(microsite_url, mobile_microsite_url);

        var custom = new MQA.Poi({ lat: lat, lng: lng });
        custom.setIcon(icon);
        custom.setIconOffset(new MQA.Point(-9, -36));
        custom.setShadow(shadow);
        custom.setShadowOffset(new MQA.Point(6, -19));

        if (bMoveableMap)
            custom.setInfoContentHTML(build_info_window_html(store_name, address, city, state, zip, phone, url, is_spa, is_open));

        myMQMmap.addShape(custom);
    }
}

function expandMap() {
    var size = null;
    if (document.getElementById('txtExpand').textContent == 'Expand Map') {
        document.getElementById(map_holder).className = 'dynamic_map_large';
        document.getElementById('txtExpand').textContent = 'Shrink Map';
        document.getElementById('customMap').style.width = '941px';
        size = new MQA.Size(941, 303);
        expanded = true;
    } else {
        document.getElementById(map_holder).className = 'dynamic_map_small';
        document.getElementById('txtExpand').textContent = 'Expand Map';
        document.getElementById('customMap').style.width = '290px';
        size = new MQA.Size(290, 303);
        expanded = false;
    }
        myMQMmap.setSize(size);
}

function build_info_window_html(store_name, address, city, state, zip, phone, url, is_spa, is_open) {

    var html_string =

        "<div class=\"container\">" +
        "<div class=\"title_bar\">";

    if (is_spa == 2)
        html_string += "<div class=\"spa_image\"><img src=\"/common/refresh/img/CustomGMap/InfoWindow/spa_icon.png\" alt=\"\" /></div>";

    html_string += "<div class=\"store_name\">" + store_name + "</div>" +
        "<div id=\"info_window_close_mine\" class=\"mqabasicwnd-close\"></div>" +
        "</div>" +
        "<div class=\"content\">" +
        "<div class=\"store_address\">" + address + "<br/>" + city + ", " + state + " " + zip + "<br />" + phone + "<br />";

    if (url != '' && is_open)
        html_string += "<div class=\"clinic_link\"><a href=\"" + url + "\" class=\"clinic_link\">View More Details</a> \>\></div>";

    html_string += "</div></div></div>";

    return html_string;
}

function build_microsite_link(clinic_microsite_url, clinic_mobile_microsite_url) {
    if (bMobile)
        return clinic_mobile_microsite_url;
    else
        return clinic_microsite_url;
}

function setStyle(ctl, className) {
    ctl.className = className;
}
