var map;
var bounds;
var markers = new Array;
var charIndex = 1;
var latestPoint = false;
var scrolling = false;
var markerDragEnabled = false;
var olcKeyStatus = 0;
var scheduleDayPointPlaced = false;

function loadMap(){
    var mapInstance = $('#map').get(0);
    if (mapInstance) {
        map = new google.maps.Map(mapInstance, {
            zoom: 15,
            scaleControl: true,
            mapTypeControl: true,
            navigationControl: true,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        });
        bounds = new google.maps.LatLngBounds();
    }
}

$(function(){
    loadMap();
})

function clearOverlays(){
    var key = '';
    for (key in markers) {
        markers[key].marker.setMap(null);

    }
    markers = new Array;
}

function positionToMap(Lat, Lng, title){
    if (typeof(map) == 'undefined' || typeof(map.getDiv) == 'undefined') {
        loadMap();
    }
    else {
        clearOverlays();
    }
    var point = new google.maps.LatLng(Lat, Lng);
    map.setCenter(point);
    bounds.extend(point);
    var marker = new google.maps.Marker({
        position: point,
        map: map
    });
    var infowindow = new google.maps.InfoWindow({
        content: title
    });
    google.maps.event.addListener(marker, 'click', function(){
        infowindow.open(map, marker);
    });
    latestPoint = point;
}

function olcNewPoint(map, options) {
    var settings = $.extend({
        index: -1,
        model: 'ScheduleLine',
        key: 0,
        lat: 0,
        lng: 0,
        title: '',
        body: '',
        titleLink: false,
        refObject: false,
        panNow: true
    }, options||{});
    var pointLatLng = new google.maps.LatLng(settings.lat, settings.lng);
    var markerKey;
    if(settings.index == -1) {
        markerKey = settings.title;
    } else {
        markerKey = settings.index;
    }

    if(typeof(markers[markerKey]) != 'undefined') {
        if(false != settings.panNow) {
            map.panTo(markers[markerKey].point);
            google.maps.event.trigger(markers[markerKey].marker, 'click');
        }
    } else {
        var titleText = '';
        var icon = {};
        if(false != settings.titleLink) {
            titleText = '<a href="' + settings.titleLink + '" target="_blank">' + settings.title + '</a>';
        } else {
            titleText = settings.title;
        }
        if(settings.panNow == false && settings.model == 'ScheduleDay') {
            icon = {
                image: wwwRoot + 'ccss/mapMarkers.png',
                x: 22,
                y: 0,
                domClass: 'olcSprite mDot'
            };
            scheduleDayPointPlaced = true;
        } else {
            icon = {
                image: wwwRoot + 'ccss/mapMarkers.png',
                x: ((charIndex + 2) % 21) * 22,
                domClass: (charIndex) + ''
            };
            icon.y = (charIndex + 2 - (icon.x / 22)) / 21 * 36;
            if(icon.domClass.length < 2) {
                icon.domClass = '0' + icon.domClass;
            }
            icon.domClass = 'olcSprite m' + icon.domClass;

            charIndex++;
            if (charIndex == 99) {
                charIndex = 1;
            }
        }
        var mapIcon = new google.maps.MarkerImage(
            icon.image,
            new google.maps.Size(20, 34),
            new google.maps.Point(icon.x, icon.y));
        markers[markerKey] = {};
        bounds.extend(pointLatLng);
        markers[markerKey].point = pointLatLng;
        markers[markerKey].marker = new google.maps.Marker({
            position: pointLatLng,
            map: map,
            icon: mapIcon
        });
        if(false != latestPoint) {
            markers[markerKey].polyline = new google.maps.Polyline({
                map: map,
                path: [latestPoint, pointLatLng]
            });
            markers[markerKey].polyline.bindTo('map', markers[markerKey].marker);
        }
        markers[markerKey].infowindow = new google.maps.InfoWindow({
            content: titleText + settings.body
        });
        google.maps.event.addListener(markers[markerKey].marker, 'click', function(){
            map.setZoom(15);
            map.panTo(this.getPosition());
            markers[markerKey].infowindow.open(map, markers[markerKey].marker);
        });
        markers[markerKey].model = settings.model;
        markers[markerKey].key = settings.key;
        markers[markerKey].titleText = titleText;
        markers[markerKey].body = settings.body;
        markers[markerKey].iconClass = icon.domClass;
        if (false != settings.panNow) {
            map.panTo(pointLatLng);
            google.maps.event.trigger(markers[markerKey].marker, 'click');
            map.fitBounds(bounds);
        }
        else {
            latestPoint = pointLatLng;
        }
        if (false != settings.refObject) {
            var token;
            if (typeof(settings.refObject) == 'object') {
                token = settings.titleLink.replace(/[\s>~:#&\/\.]/g, '') + 'icon';
            }
            else {
                token = settings.refObject.replace(/[\s>:#\.]/g, '') + 'icon';
            }
            if ($('a.' + token).length == 0) {
                $(settings.refObject).prepend('<a href="#" class="' + token + ' ' + icon.domClass + '"></a>');
                $('a.' + token).click(function(){
                    map.panTo(markers[markerKey].point);
                    google.maps.event.trigger(markers[markerKey].marker, 'click');
                    map.setCenter(markers[markerKey].point);
                    if(false == scrolling) {
                        scrolling = true;
                        $('html, body').animate({
                            scrollTop: $('#map').offset().top - 20
                        }, 500, function() {
                            scrolling = false;
                        });
                    }
                    return false;
                });
            }
        }
    }
}

function pointsToMap(points){
    if (typeof(points) != 'undefined') {
        var sort = 1;
        clearOverlays();
        bounds = new google.maps.LatLngBounds();
        charIndex = 1;
        latestPoint = false;
        $.each(points, function(key, obj){
            olcNewPoint(map, {
                index: sort,
                model: obj.model,
                key: obj.key,
                lat: obj.latitude,
                lng: obj.longitude,
                title: obj.title,
                body: obj.body,
                titleLink: false,
                refObject: obj.id,
                panNow: false
            });
            sort++;
        })
        map.setCenter(bounds.getCenter());
        map.fitBounds(bounds);
    }
}

function resetMap(){
    positionToMap(23.6994795, 120.9612952, '瀏覽的部份沒有地圖需要的座標資料');
}

function findLatLng(elementLat, elementLng, address){
    var randomId;
    if (typeof(elementLat.data('mapID')) == 'undefined' || elementLat.data('mapID') == null) {
        randomId = 'map' + time();
        var offset = elementLng.offset();
        offset.top += 20;
        elementLat.data('mapID', randomId);
        $('body').append('<div style="position:absolute; background-color: #FFF;top:' +
        offset.top +
        'px; left: ' +
        offset.left +
        'px; border: 1px solid black; padding: 5px; z-index: 2000;">' +
        '<div align="right"><a href="#" id="close' +
        randomId +
        '">[X]</a></div>' +
        '<form onsubmit="return false;">住址：<input type="text" id="text' +
        randomId +
        '" class="span-10" />' +
        '<input type="button" value="衝" id="button' +
        randomId +
        '"></form>' +
        '<div id="' +
        randomId +
        '" style="' +
        'width: 500px; height: 400px;' +
        '"></div></div>');
        var toolMap = new google.maps.Map($('#' + randomId).get(0), {
            zoom: 15,
            scaleControl: true,
            mapTypeControl: true,
            navigationControl: true,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        });
        var toolMarker;
        var geocoder = new google.maps.Geocoder();
        $('#close' + randomId).click(function(){
            elementLat.removeData('mapID');
            $(this).parent().parent().remove();
            return false;
        });
        if (typeof(address) != 'undefined') {
            $('#text' + randomId).val(address);
        }
        else 
            if (elementLat.val() != '') {
                $('#text' + randomId).val(elementLat.val() + ',' + elementLng.val());
            }
        $('#button' + randomId).click(function(){
            var address = $('#text' + randomId).val();
            if (address == '') {
                alert('請先輸入住址！');
            }
            else {
                var requestObject = {};
                requestObject.address = address;
                geocoder.geocode(requestObject, function(point){
                    if (typeof(point[0]) == 'undefined') {
                        alert('這個住址目前找不到合適的經緯度！');
                    }
                    else {
                        toolMap.setCenter(point[0].geometry.location);
                        toolMarker = new google.maps.Marker({
                            position: point[0].geometry.location,
                            map: toolMap
                        });
                        elementLat.val(point[0].geometry.location.lat());
                        elementLng.val(point[0].geometry.location.lng());
                        var info = '<b>座標：</b>' + point[0].geometry.location.lat() + "," +
                        point[0].geometry.location.lng() +
                        '<br>' +
                        '<b>查詢：</b>' +
                        address +
                        '<br /><b>標示：</b>' +
                        point[0].formatted_address +
                        '<br>';
                        var infowindow = new google.maps.InfoWindow({
                            content: info
                        });
                        google.maps.event.addListener(toolMarker, 'click', function(){
                            infowindow.open(toolMap, toolMarker);
                        });
                        google.maps.event.trigger(toolMarker, 'click');
                        google.maps.event.addListener(toolMap, 'click', function(latlng){
                            var obj = {};
                            obj.latLng = latlng.latLng;
                            geocoder.geocode(obj, function(response){
                                toolMarker.setMap(null);
                                infowindow.close();
                                toolMarker = new google.maps.Marker({
                                    position: response[0].geometry.location,
                                    map: toolMap
                                });
                                var info = '<b>座標：</b>' + response[0].geometry.location.lat() + "," +
                                response[0].geometry.location.lng() +
                                '<br>' +
                                '<b>查詢：</b>' +
                                address +
                                '<br /><b>標示：</b>' +
                                response[0].formatted_address +
                                '<br>';
                                infowindow = new google.maps.InfoWindow({
                                    content: info
                                });
                                google.maps.event.addListener(toolMarker, 'click', function(){
                                    infowindow.open(toolMap, toolMarker);
                                });
                                google.maps.event.trigger(toolMarker, 'click');
                                elementLat.val(response[0].geometry.location.lat());
                                elementLng.val(response[0].geometry.location.lng());
                            });
                        });
                    }
                });
            }
            return false;
        });
    }
    else {
        randomId = elementLat.data('mapID');
        if (typeof(address) != undefined) {
            $('#text' + randomId).val(address);
        }
    }
    if ($('#text' + randomId).val() != '') {
        $('#button' + randomId).trigger('click');
    }
}

function mapZoomIn(Lat, Lng){
    map.setCenter(new google.maps.LatLng(Lat, Lng));
}

function enableMarkerDrag() {
    markerDragEnabled = true;
    for(key in markers) {
        markers[key].marker.setDraggable(true);
        olcKeyStatus = markers[key].marker.olcKey = key;
        google.maps.event.addListener(markers[key].marker, 'dragend', function(mouse) {
            var previousKey = parseInt(this.olcKey) - 1;
            var nextKey = parseInt(this.olcKey) + 1;
            if(typeof(markers[previousKey]) != 'undefined') {
                markers[this.olcKey].polyline.setOptions({
                    path: [mouse.latLng, markers[previousKey].point],
                    strokeColor: '#CC3333'
                });
            }
            if(typeof(markers[nextKey]) != 'undefined') {
                markers[nextKey].polyline.setOptions({
                    path: [mouse.latLng, markers[nextKey].point],
                    strokeColor: '#CC3333'
                });
            } else {
                latestPoint = mouse.latLng;
            }
            markers[this.olcKey].point = mouse.latLng;
            $('#updateMarkerPositions').show();
        });
    }
}
