window.gmaps = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ];

$.gmap = {};
$.gmap.o = [];
$.gmap.op = {};
$.gmap.defaults = {
    lat: 0,
    lon: 0,
    zoom: 9,
    tab: 0,
    hoverClassName: 'ui-state-hover',
    tabTitle: 'null'
};

$.fn.gmap = function( op ) {

    var s = this.serial = $.gmap.o.length;
    var o = $.extend( {}, $.gmap.defaults, op );
    $.gmap.o[ s ] = $.gmap.op = o;

    return this.each(function(){

        var map = new GMap2( $(this).get( 0 ) );
        var prefecture = new GLatLng( o.lat, o.lon ),
            $items =  $(this).parent().find('ul.bunjoList > li');
        // Google Maps Default Map Controls
        map.addControl( new GSmallMapControl() );
        map.addControl( new GMapTypeControl() );
        map.setCenter( prefecture, o.zoom );

        var host = "http://www.pananavi.jp/images/",
            loc = document.location.href;

        var tabTitle = o.tabTitle;
        var bukkenIcon = new GIcon( G_DEFAULT_ICON );
        bukkenIcon.shadow = false;
        bukkenIcon.image = host + "icon_mansion.png";
        bukkenIcon.printImage = host + "icon_mansion.gif";
        bukkenIcon.iconSize = new GSize( 32, 48 );
        bukkenIcon.imageMap = [ 2, 2, 18, 2, 18, 46, 2, 46 ];

        // Info Panel
        var $infoPanel = $( '<div id="gmap-bukken-' + o.tab  + '" class="gmap-bukken" style="display:none;"><div class="gmap-bukken-header"></div><div class="gmap-bukken-wrapper"></div><div class="gmap-bukken-footer"></div></div>' );
        $( '<span class="gmap-bukken-close"><strong><em><a id="close-info-panel' + o.tab + '"></a></em></strong></span>' )
             .click(function(){
                  $infoPanel[ $.browser.msie ? 'hide' : 'fadeOut' ]().removeClass('active');
             })
             .appendTo( $infoPanel );

        var markers = [],
            activeMarker = false,
            centerMarker = false;

        $items.each(
            function( i, item ) {
                var $item = $( item );
                var prop = {
                    lat: parseFloat( $item.attr('lat') ),
                    lon: parseFloat( $item.attr('lon') ),
                    tit: $( 'h3 span', $item ).text(),
                    adr: $item.attr('adr'),
                    tel: $item.attr('tel'),
                    fax: $item.attr('fax')
                };
                if ( !isNaN( prop.lat ) && !isNaN( prop.lon ) ) {
                    $item.addClass('has-geocode');
                    var point = new GLatLng(  prop.lat,  prop.lon );
                    var markerOptions = { icon: bukkenIcon };
                    var marker = new GMarker( point, markerOptions );
                    var targetBlog = $( 'a:eq(1)' , $( this )).attr('href');
                    marker.gmapInfo = $( '<h3><a href="' + targetBlog + '">' + prop.tit
                          + '</a></h3><p><a href="' + targetBlog + '">'
                          + prop.adr
                          + ( prop.tel ? ( '<br />' + prop.tel ) : '' )
                          + ( prop.fax ? ( '<br />' + prop.fax ) : '' )
                          + '</a></p>'
                        );
                    marker.gmapInfoLink = targetBlog;
                    marker.gTempleName = prop.tit;
                    map.addOverlay( marker );
                    markers.push( marker );
                    $item.hover(
                        function() {
                            $( this ).addClass( o.hoverClassName );
                        },
                        function() {
                            $( this ).removeClass( o.hoverClassName );
                        }
                    )
                    .click(
                        function() {
                            document.location.href = targetBlog;
                        }
                    ).find( 'a.map-me' ).click(function() {
                            if ( map.getZoom() != 10 ) {
                                map.setZoom( 10 );
                            }
                            var pos = { };
                            pos.curr = marker.getLatLng();
                            pos.center = map.getCenter();
                            if ( ( pos.curr.lat() != pos.center.lat() ) && ( pos.curr.lng() != pos.center.lng() ) ) {
                                var moveEnd = GEvent.addListener( map, "moveend", function() {
                                    var markerOffset = map.fromLatLngToDivPixel( marker.getPoint() );
                                    $( 'div.gmap-bukken-wrapper', $infoPanel ).html(
                                        marker.gmapInfo.clone().click(function(){
                                            document.location.href = marker.gmapInfoLink;
                                        })
                                    );
                                    $infoPanel.css({    
                                        top: ( markerOffset.y - 160 ) + 'px',
                                        left: ( markerOffset.x  - 147 )+ 'px'
                                    })
                                    .show();
                                    GEvent.removeListener(moveEnd);
                                });
                                map.panTo( pos.curr );
                            }
                            else {
                                var markerOffset = map.fromLatLngToDivPixel( marker.getPoint() );
                                $infoPanel.css({    
                                    top: ( markerOffset.y - 160 ) + 'px',
                                    left: ( markerOffset.x  - 147 )+ 'px'
                                })
                                .show();
                            }
                            if ( firstTracker ) {
                                firstTracker._trackPageview( '/gm/map/' + tabTitle + '/' + marker.gTempleName );
                            }
                            activeMarker = marker;
                            centerMarker = true;
                            return false;
                    });
                }
            }
        );

        $( markers ).each(
            function( i, marker ) {
                GEvent.addListener( marker, "click", function() {
                    var pos = { };
                    pos.curr = marker.getLatLng();
                    pos.center = map.getCenter();
                    var refreshInfoPanel = function() {
                        var markerOffset = map.fromLatLngToDivPixel( marker.getPoint() );
                        $( 'div.gmap-bukken-wrapper', $infoPanel ).html(
                            marker.gmapInfo.clone().click(function(){
                                document.location.href = marker.gmapInfoLink;
                            })
                        );
                        $infoPanel.css({
                            top: ( markerOffset.y - 160 ) + 'px',
                            left: ( markerOffset.x  - 147 )+ 'px'
                        })[ $.browser.msie ? 'show' : 'fadeIn' ]();
                        if ( firstTracker ) {
                            firstTracker._trackPageview( '/gm/map/' + tabTitle + '/' + marker.gTempleName );
                        }
                    };
                    if ( ( pos.curr.lat() != pos.center.lat() ) && ( pos.curr.lng() != pos.center.lng() ) ) {
                        var moveEnd = GEvent.addListener( map, "moveend", function() {
                            refreshInfoPanel();
                            GEvent.removeListener(moveEnd);
                        });
                        if ( $infoPanel.hasClass('active') ) {
                                if ( $.browser.msie ) {
                                    $infoPanel.hide();
                                    map.panTo( pos.curr );
                                }
                                else {
                                    $infoPanel.fadeOut(function(){
                                        map.panTo( pos.curr );
                                    });
                                }
                        }
                        else {
                            $infoPanel.addClass('active');
                            map.panTo( pos.curr );
                        }
                    }
                    else {
                        var markerOffset = map.fromLatLngToDivPixel( marker.getPoint() );
                        $infoPanel.css({
                            top: ( markerOffset.y - 160 ) + 'px',
                            left: ( markerOffset.x  - 147 )+ 'px'
                        })[ $.browser.msie ? 'show' : 'fadeIn' ]();
                    }
                    activeMarker = marker;
                    centerMarker = true;
                });
            }
        );

        GEvent.addListener( map, "dragend", function() {
            centerMarker = false;
        });

        $infoPanel.appendTo( map.getPane( G_MAP_FLOAT_SHADOW_PANE ) );

        var zoomCallBack = function() {
            if ( activeMarker ) {
                var moveEnd = GEvent.addListener( map, "moveend", function() {
                     var markerOffset = map.fromLatLngToDivPixel( activeMarker.getPoint() )
                     $infoPanel.css({
                         top: ( markerOffset.y - 160 ) + 'px',
                         left: ( markerOffset.x  - 147 )+ 'px'
                     });
                     GEvent.removeListener(moveEnd);
                 });
                 map.setCenter( activeMarker.getLatLng() );
            }
        }
        GEvent.addListener( map, "zoomend", zoomCallBack );

        window.gmaps[ o.tab ] = map;

    });

}

$.updateMap = {
    perform: function( o ) {
        var $curMap = o.map || false;
        if ( $curMap ) {
            $curMap.updateMap({
                tab: o.tab,
                mapSettings: {
                    zoom: o.zoom,
                    lat: o.lat,
                    lon: o.lon,
                    idx: o.tit
                },
                action: o.action
            });
        }
    },
    init: function( $nav ) {
        $nav.each(function( i ) {
            var $el = $(this);
            $el.bind( 'click', function() {
                if ( $el.parent().hasClass('ui-tabs-selected') ) {
                     $.updateMap.perform({
                         tab: i,
                         action: 'reset',
                         map: $( '#' + $el[ 0 ].href.split( '#' )[ 1 ] + ' div.map' ),
                         zoom: parseInt( $el.attr('zoom'), 10 ),
                         lat: parseFloat( $el.attr('lat') ),
                         lon: parseFloat( $el.attr('lon') ),
                         tit: $el.attr('title')
                    });
                }
                else {
                    if ( firstTracker ) {
                        firstTracker._trackPageview( '/gm/map/' + $(this).attr('title') );
                    }
                }
            });
        });
    }
};

$.updateMap.o = [];
$.updateMap.op = {};
$.updateMap.defaults = {
    tab: 0,
    mapSettings: {},
    action: 'load'
};

$.fn.updateMap = function( op ) {

    var s = this.serial = $.updateMap.o.length;
    var o = $.extend( {}, $.updateMap.defaults, op );
    $.updateMap.o[ s ] = $.updateMap.op = o;

    var $curMap = $( this ),
        mapSettings = o.mapSettings;

    if ( o.action == "load" ) {
        return $curMap.gmap({
            lat: mapSettings.lat,
            lon: mapSettings.lon,
            zoom: mapSettings.zoom,
            tab: o.tab,
            tabTitle: mapSettings.idx
        }).attr("isloaded","on");
    }
    else {
        var googleMap = window.gmaps[ o.tab ];
        if ( googleMap ) {
            var infoWindows = $('div.gmap-bukken');
            infoWindows.hide();
            if ( googleMap.getZoom() != mapSettings.zoom ) {
                googleMap.setZoom( mapSettings.zoom );
            }
            googleMap.panTo( new GLatLng( mapSettings.lat, mapSettings.lon ) );
            return $curMap;
        }
    }

};

$(document).ready(function() {

        // Google Map Update Plugin
        $.updateMap.init( $( '#homesublist a' ) );

        // jQuery UI Tabs + Callback with gmap plugins
        var tabSelection = function( event, ui ) {
           var $link = $( ui.tab ),
               linkHref = $link.attr('href'),
               op = {
                   map: $( '#' + $link[0].href.split( '#' )[ 1 ] + ' div.map' ),
                   tab: ui.index,
                   zoom: parseInt( $link.attr('zoom'), 10 ),
                   lat: parseFloat( $link.attr('lat') ),
                   lon: parseFloat( $link.attr('lon') ),
                   tit: $link.attr('title')
                };
            if ( !op.map.attr('isloaded') ) {
                op.action = 'load';
            }
            else {
                op.action = 'reset';
            }
            $.updateMap.perform( op );
        };

        var $tabs = $( 'div#tabs' ).tabs();
        $tabs.bind( 'tabsshow', tabSelection );
        if ( $tabs.size() > 0 ) {
            tabSelection( null, {
                index: $tabs.tabs('option', 'selected'),
                tab: $tabs.find('a:eq(' + $tabs.tabs('option', 'selected') + ')' )
            });
        }

});


