var $ = $telerik.$;

// default position
var CR_LOCATION = new GLatLng(49.930008, 15.369873);
var CR_ZOOM = 7;
var BASICSEARCH = 0;

// Region positions
var REGION_LOCATION_PRAGUE = new GLatLng(50.074769, 14.43054);
var REGION_ZOOM_PRAGUE = 10;

var REGION_LOCATION_PRAGUEENV = new GLatLng(50.053612, 14.447021);
var REGION_ZOOM_PRAGUEENV = 9;


var REGION_LOCATION_NWBOHEMIA = new GLatLng(50.805935, 13.123169);
var REGION_ZOOM_NWBOHEMIA = 8;

var REGION_LOCATION_WBOHEMIA = new GLatLng(50.106488, 12.505188);
var REGION_ZOOM_WBOHEMIA = 9;

var REGION_LOCATION_NBOHEMIA = new GLatLng(50.847573, 14.76837);
var REGION_ZOOM_NBOHEMIA = 9;

var REGION_LOCATION_SBOHEMIA = new GLatLng(49.185294, 14.666748);
var REGION_ZOOM_SBOHEMIA = 9;

var REGION_LOCATION_EBOHEMIA = new GLatLng(50.120578, 16.083984);
var REGION_ZOOM_SBOHEMIA = 9;


var REGION_LOCATION_KRKONOSE = new GLatLng(50.661649, 15.726929);
var REGION_ZOOM_KRKONOSE = 10;

var REGION_LOCATION_CZPARADISE = new GLatLng(50.518666, 15.1474);
var REGION_ZOOM_CZPARADISE = 10;

var REGION_LOCATION_PILSEN = new GLatLng(49.744006, 13.463745);
var REGION_ZOOM_PILSEN = 9;

var REGION_LOCATION_SUMAVA = new GLatLng(49.030665, 13.287964);
var REGION_ZOOM_SUMAVA = 8;


var REGION_LOCATION_VYSOCINA = new GLatLng(49.380585, 15.625305);
var REGION_ZOOM_VYSOCINA = 9;


var REGION_LOCATION_NMORAVIA = new GLatLng(49.866317, 17.940674);
var REGION_ZOOM_NMORAVIA = 8;

var REGION_LOCATION_MMORAVIA = new GLatLng(49.530557, 17.361145);
var REGION_ZOOM_MMORAVIA = 9;

var REGION_LOCATION_SMORAVIA = new GLatLng(49.274973, 17.012329);
var REGION_ZOOM_SMORAVIA = 8;


function mapviewLoaded() {

    // map div ID
    var mapContainerId = "map-view";

    if (!GBrowserIsCompatible()) return; // bad browser :-(

    CampMap.init(document.getElementById(mapContainerId));
    CampMap.setPosition(CR_LOCATION, CR_ZOOM);
    MiniMap.init(CampMap.getMap());
    CampMap.zoomToDetail();

    Sys.Application.remove_load(mapviewLoaded);
}

Sys.Application.add_load(mapviewLoaded);

function zoomToRegion(key) {
    var location = window["REGION_LOCATION_" + key];
    var zoom = window["REGION_ZOOM_" + key];

    CampMap.setPosition(location, zoom);
}

// on page ready
//$(function() {

//    // map div ID
//    var mapContainerId = "map-view";

//    if (!GBrowserIsCompatible()) return; // bad browser :-(

//    CampMap.init(document.getElementById(mapContainerId));
//    CampMap.setPosition(CR_LOCATION, CR_ZOOM);
//    MiniMap.init(CampMap.getMap());
//    CampMap.zoomToDetail();
//});
var regionZoom = false;

// main map
var CampMap = (function () {

    var map = null,
      mgr = null;

    // --- private ---
    function initMarkerManager() {
        mgr = new MarkerManager(map);

        //in detail windows not register search
        var latField = document.getElementById("latField");
        if (latField === null) {
            GEvent.addListener(map, "zoomend", function () {
                //alert("ZoomEnd");
                if (regionZoom) {
                    if ($telerik.$.cookie("regionName") != null) {
                        clearRegionCookies();
                        showHideResetLink();
                        saveSearchParams();
                       
                        invokeSearch(new searchOptions());
                        regionZoom = false;
                    }
                }
                regionZoom = true;
            });
            GEvent.addListener(map, "dragend", function () {
                //alert("DragEnd");
                //CampMap.Camps.load();
                clearRegionCookies();
                showHideResetLink();
                saveSearchParams();
                
                BASICSEARCH = 0;
                
                invokeSearch(new searchOptions());
            });
            GEvent.addListener(map, "moveend", function () {
                //alert("MoveEnd");
                //CampMap.Camps.load();
                saveSearchParams();
                if (BASICSEARCH == 1) {                    
                    return;
                }
                invokeSearch(new searchOptions());
            });

            //invokeSearch(new searchOptions());
        }

        //CampMap.Camps.load();
    }

    // --- public ---

    return {
        iconPath: "/App_Themes/Default/_clip/",

        "init": function (container) {
            map = new GMap2(container);
            map.setUIToDefault();
            //disable scrolling with wheel
            map.disableScrollWheelZoom();
            var latField = document.getElementById("latField");



            // layers
            var copyOSM = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a>");
            copyOSM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, " "));

            //var tilesMapnik = new GTileLayer(copyOSM, 1, 17, { tileUrlTemplate: 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png' });
            //var tilesOsmarender = new GTileLayer(copyOSM, 1, 17, { tileUrlTemplate: 'http://tah.openstreetmap.org/Tiles/tile/{Z}/{X}/{Y}.png' });
            var tilesCyclemap = new GTileLayer(copyOSM, 1, 17, { tileUrlTemplate: 'http://a.andy.sandbox.cloudmade.com/tiles/cycle/{Z}/{X}/{Y}.png' });

            //var mapMapnik = new GMapType([tilesMapnik], G_NORMAL_MAP.getProjection(), "Mapnik");
            //var mapOsmarender = new GMapType([tilesOsmarender], G_NORMAL_MAP.getProjection(), "Osmarend");
            var opencycleMap = new GMapType([tilesCyclemap], G_NORMAL_MAP.getProjection(), "CycleMap");

            //map.addMapType(mapMapnik);
            //map.addMapType(mapOsmarender);
            map.addMapType(opencycleMap);

            setTimeout(initMarkerManager, 1); // give some time to map before init MarkerManager


        },

        "zoomToDetail": function () {
            // default zoom after geolocation
            var GEOLOC_ZOOM = 16;

            var latField = document.getElementById("latField");
            var longField = document.getElementById("longField");


            if (latField !== null) {

                var startPos = new google.maps.LatLng(latField.value, longField.value);

                if (startPos !== null) {

                    map.addOverlay(new google.maps.Marker(startPos));
                    map.setCenter(startPos, GEOLOC_ZOOM);

                }
            }
        },

        "setPosition": function (position, zoom) {
            map.setCenter(position, zoom);
        },

        "getMap": function () {
            return map;
        },

        "getManager": function () {
            if (mgr == null)
                initMarkerManager();
            return mgr;
        }

    };

})();


// Camps manager
CampMap.Camps = (function () {

    // url of camps WS
    var URL = "SampleOutput.txt";

    // --- private ---

    function responseCampsData(data) {

        var camps = [];
        var mgr = CampMap.getManager();

        mgr.clearMarkers();

        //$.each(data.d, function(){
        $.each(data, function () {
            var camp = processCampVO(this);
            camps.push(prepareMarker(camp));
        });

        mgr.addMarkers(camps, 6);
        mgr.refresh();

        function importanceOrder(marker, b) {
            return marker.importance;
        }

        // ---

        function prepareMarker(camp) {
            //define member icon
            var iconMember = new GIcon();
            iconMember.image = CampMap.iconPath + "member_icon.gif";
            iconMember.iconSize = new GSize(20, 20);
            iconMember.iconAnchor = new GPoint(8, 8);
            iconMember.infoWindowAnchor = new GPoint(8, 0);

            //define member icon
            var iconNonMember = new GIcon();
            iconNonMember.image = CampMap.iconPath + "nonmember_icon.gif";
            iconNonMember.iconSize = new GSize(12, 12);
            iconNonMember.iconAnchor = new GPoint(6, 6);
            iconNonMember.infoWindowAnchor = new GPoint(6, 0);

            var mOpts = { title: camp.name, clickable: true, zIndexProcess: importanceOrder };

            if (camp.rank < 4)
                mOpts.icon = iconMember;
            else
                mOpts.icon = iconNonMember;

            var location = new GLatLng(camp.lat, camp.lng);
            var marker = new GMarker(location, mOpts);
            if (camp.rank < 4)
                marker.importance = 1000;
            else
                marker.importance = 200;

            //var marker = new GMarker(location);

            var sflang = getQuerystring('sflang');
            var detailCampingUrl = String.format(
    "{0}/{1}/{2}/{3}/{4}/{5}-{6}",
    appPath, globalLang, detailUrlPrefix, camp.key, detailCampingTabLocalized, camp.id, "camping");

            var campInfoHtml = "<div class='promo-camps'>" +
            "<div class='promo-camp'>" +
			"<div class='promo-camp-header' style='background: white; height:45px;'>" +
			"<div ><div class='camp-name'>" +
					"<h3><a href='" + detailCampingUrl + "'><span class='stars-" + camp.stars + "'></span>" + camp.name + "</a></h3>" +
					"<span class='camp-adress'>" + camp.address + "</span>" +
				"</div></div></div>" +
			    "<div class='promo-camp-content' style='background: #fadd85;'>" +
				"<div class='image'><a href='" + detailCampingUrl + "'><img src='" + "/photos/campphoto.aspx?id=" + camp.photoId + "&sizetype=RESULT_DEFAULT_IMAGE_SIZE' alt='foto' /></a></div>" +
				"<div class='text'><p>" + camp.text + "</p></div><div class='clear'></div></div></div></div>";

            var campInfoHtml1 = "<table id='campinfo' style='width:250px;height:110px;'>" +
            "<tr><td colspan='2'><h3><a href='" + detailCampingUrl + "'><span class='stars-" + camp.stars + "'></span>" + camp.name + "</a></h3>" +
					"<span class='camp-adress'>" + camp.address + "</span></td></tr>" +
            "<tr><td class='image'><a href='" + detailCampingUrl + "'><img src='" + "/photos/campphoto.aspx?id=" + camp.photoId + "&sizetype=RESULT_DEFAULT_IMAGE_SIZE' alt='foto' width='100' /></a>" +
            "</td><td class='text'><p>" + camp.text + "</p></td></tr></table>";

            // !!! add html code of info window !!!
            marker.bindInfoWindowHtml(campInfoHtml1, { maxWidth: 300, maxHeight: 125 });

            return marker;
        }

        function getQuerystring(key, default_) {
            if (default_ == null) default_ = "";
            key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
            var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
            var qs = regex.exec(window.location.href);
            if (qs == null)
                return default_;
            else
                return qs[1];
        }

        function processCampVO(campVO) {
            var camp = {
                id: campVO.Id,
                name: campVO.Name,
                SName: campVO.SName,
                key: campVO.Key,
                text: campVO.ShortDescription,
                address: campVO.Address,
                photoId: campVO.DefaultImageId,
                imgSize: campVO.DefaultImageSize,
                stars: campVO.Stars,
                rank: campVO.RankId,
                lat: +campVO.GPSLatitude,
                lng: +campVO.GPSLongitude


            };

            //            if (campVO.Photos.length > 0)
            //            {
            //                camp.photo = campVO.Photos[0];
            //            }

            return camp;
        }

    }

    function requestError(err) {
        //alert("data error: " + err);
    }

    // --- public ---
    return {
        place: function (data) {
            responseCampsData(data);
        },

        iconPath: "/App_Themes/Default/_clip/",
        zoomToView: function (data) {
            var bounds;
            $.each(data, function () {
                if (bounds == undefined)
                    bounds = new GLatLngBounds();
                var currentLatLon = new GLatLng(this.GPSLatitude, this.GPSLongitude);
                bounds.extend(currentLatLon);
            });

            if (bounds == undefined || data.lenght == 0)
                return;

            var center = bounds.getCenter();
            var map = CampMap.getMap();
            var zoom = map.getBoundsZoomLevel(bounds);
            if (zoom > 16) zoom = 16

            //unregister move map events
            //unregisterMapEvents();

            map.setZoom(zoom);
            map.setCenter(center);
            //register move map events back
            //registerMapEvents();
        },

        load: function () { }
    };

})();


// Extend GLatLng object
(function () {

    function degToDMS(deg) {
        var gpsdeg = parseInt(deg);
        var remainder = deg - (gpsdeg * 1.0);
        var gpsmin = remainder * 60.0;
        var gpssec = (gpsmin - parseInt(gpsmin * 1.0)) * 60.0;

        return gpsdeg + "°" + parseInt(gpsmin) + "'" + roundTo(gpssec, 5) + "''";
    }

    function roundTo(num, n) {
        var d = Math.pow(10, n);
        return Math.round(num * d) / d;
    }

    function ConvertDMSToDD(days, minutes, seconds, direction) {
        var dd = days + minutes / 60 + seconds / (60 * 60);

        if (direction == "S" || direction == "W") {
            dd = dd * -1;
        } // Don't do anything for N or E
        return dd;
    }

    /**
    * Convert LatLng to DMS format  
    */
    GLatLng.prototype.toDMS = function () {
        var dms = "";

        var lat = this.lat();
        dms += degToDMS(Math.abs(lat));
        dms += (lat > 0) ? "N" : "S";
        dms += ", ";

        var lng = this.lng();
        dms += degToDMS(Math.abs(lng));
        dms += (lng > 0) ? "E" : "W";
        return dms;
    }
    /**
    * Create new LatLng object from DMS format (factory method)
    */
    GLatLng.fromDMS = function (dms) {
        var parts = dms.split(/[^\.\d\w]+/);
        if (parts.length != 8) return null;
        var lat = ConvertDMSToDD(+parts[0], +parts[1], +parts[2], parts[3]);
        var lng = ConvertDMSToDD(+parts[4], +parts[5], +parts[6], parts[7]);
        if (isNaN(lat) || isNaN(lng)) return null;
        return new this(lat, lng);
    }

})();

var MiniMap = (function () {

    var marker = null;
    var CR_START = { "lat": 51.05553104168793, "lng": 12.100496292114258 },
        CR_END = { "lat": 48.551671433084245, "lng": 18.859705924987793 };
    var OFFSET = { "x": 16, "y": 2 }, SIZE = { "x": 142, "y": 84 };
    var MARKER_OFFSET = { "x": 6, "y": 5 }, MAX_POSITION = { "x": 174, "y": 93 }
    var MiniMap = {
        init: function (gmap) {
            var container = $("#minimap").
                css({ "position": "relative" });
            marker = $("<img src='/app_themes/default/_images/mini-map-marker.gif'>").
                css({ "position": "absolute" }).
                appendTo(container);


            GEvent.addListener(gmap, "moveend", function () {
                var center = this.getCenter();
                MiniMap.redraw(center);
            });

            MiniMap.redraw(gmap.getCenter());
        },

        redraw: function (center) {
            var rlat = (center.lat() - CR_START.lat) / (CR_END.lat - CR_START.lat),
                rlog = (center.lng() - CR_START.lng) / (CR_END.lng - CR_START.lng);
            var top = limit((rlat * SIZE.y + OFFSET.y), 0, MAX_POSITION.y),
                left = limit((rlog * SIZE.x + OFFSET.x), 0, MAX_POSITION.x);
            marker.css({
                "top": (top - MARKER_OFFSET.y) + "px",
                "left": (left - MARKER_OFFSET.x) + "px"
            });
        }
    };
    return MiniMap;
    function limit(val, min, max) {
        return Math.max(Math.min(val, max), min);
    }
})();
