
var map;
var mapData = { 0: {}, 1: {}, 2: {}, 3: {}, 4: {} };
var loopNumber = 0;
var isbns = new Array();

$(document).ready(function(){
	drawMap();
});

function getMapData(reload) {

    if (pMapType  == 'big' && reload == false) {
        url = '/browse/bigmap';
    } else {
        url = '/browse/smallmap';
    }

    id = getExclusions('id');
    if (reload) {
		var data = '&id='+id[0]+'&call=ajax';

        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: url,
            data: data,
            success: function( data ) {
                if ( 'big' == pMapType ) {
                    mapData[4].marker.infoWindowInstance.remove();
                    mapData[4].marker.remove();
                    mapData[4] = mapData[3];
                    mapData[3] = mapData[2];
                    mapData[2] = mapData[1];
                    mapData[1] = mapData[0];
                    mapData[0] = {};
                }
                if ( 'small' == pMapType ) {
                    mapData[0].marker.infoWindowInstance.remove();
                    mapData[0].marker.remove();
                    mapData[0] = {};
                }
                refreshMap( data );
            }
        });
    } else {
        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: url + '?call=ajax',
            data: 'id=',
            success: function( data ) {
                refreshMap( data );
                if ( 'big' == pMapType ) {
                    GEvent.addListener( map, "moveend", function() {
                        redrawMarkers();
                    });
                }
            }
        });
    }
}

function getExclusions( field ) {
    if ( 'isbn13' == field && 'small' == pMapType )
        return isbns;
    var array = new Array();
	if ('small' == pMapType) {
		array.push(mapData[0][field]);
	} else {
		for (var i = 0; i < 5; i++) {
			array.push(mapData[i][field]);
		}
	}

    return array;
}

function refreshMap( data ) {
    var num = data.length;
    if ( data.id > 0 ) {
        addMarker( 0, data );
    } else {
        for (var i = 0; i < num; i++) {
            addMarker( i, data[i] );
        }
    }
    if ( 'big' == pMapType )
        redrawMarkers();
    window.clearTimeout();
    loopNumber++;
    if ( loopNumber > maxRequestsPerSession) return;
    window.setTimeout( 'getMapData(true)', requestFrequency );
}

function redrawMarkers() {
    var num = mapData.length;
    for ( var j = 0; j < num; j++ )
        mapData[j].marker.infoWindowInstance.redraw( true );
    //GWO tracking codes
    if ( 'big' == pMapType ) {
	$("img.bookImage").click(function(){
	    try{pageTracker._trackEvent('map', 'book image', 'big map')}catch(err){}return true;
	});
	$(".bookTitle").click(function(){
	    try{pageTracker._trackEvent('map', 'book title', 'big map')}catch(err){}return true;
        });
    }
}

function addMarker( i, data ) {
        mapData[i].id = data.id;
        mapData[i].county = data.county;
        mapData[i].country = data.country;
        mapData[i].isbn13 = data.isbn13;
        mapData[i].title = data.title;
        mapData[i].subtitle = data.subtitle;
        mapData[i].displayName = data.displayName;
        mapData[i].Latitude = data.Latitude;
        mapData[i].Longitude = data.Longitude;
        mapData[i].bookImage = data.coverUrl;
        mapData[i].timeDiff = data.timeDiff;
        mapData[i].timeUnit = data.timeUnit;
        mapData[i].pFlagImage = data.country.toLowerCase();
        mapData[i].coverUrl = data.coverUrl;
        mapData[i].bookUrl = data.bookUrl;
        mapData[i].website = data.website;
        pFlagImage = data.country.toLowerCase();
        if ( 'US' == data.website && 'US' == data.country && data.countyCode.length > 0 ) {
            mapData[i].pFlagImage = 'US-' + data.countyCode.toLowerCase();
            pFlagImage = 'US-' + data.countyCode.toLowerCase();
            data.displayName = data.county;
            mapData[i].displayName = data.county;
        }
        point = createPoint( data.Latitude, data.Longitude );
        html = createHtml( data.isbn13, data.coverUrl, pFlagImage, data.coverUrl, data.title, data.displayName, data.timeDiff, data.timeUnit, data.website, data.bookUrl);
        marker = createMarker( point, html );
        // changes too fast
        mapData[i].marker = marker;
        if ( 'small' == pMapType )
            $('#GoogleMap').click(function() { document.location = data.bookUrl; });

	// GWO tracking codes
	if ( 'small' == pMapType ) {
	    $("img.bookImage").click(function(){
		try{pageTracker._trackEvent('map', 'book image', 'mini map')}catch(err){}return true;
	    });
	    $(".bookTitle").click(function(){
	        try{pageTracker._trackEvent('map', 'book title', 'mini map')}catch(err){}return true;
	    });
	}
}

function drawMap() {
    map = new GMap2( document.getElementById( 'map' ) );
    if ( 'big' == pMapType ) {
        map.addControl( new GSmallMapControl() );
        map.addControl( new GMapTypeControl() );
        map.setCenter( new GLatLng( sStartLat, sStartLng ), zoomLevel );
//        map.disableDragging();
    	map.disableDoubleClickZoom();
        map.disableScrollWheelZoom();
    }
    if ( 'small' == pMapType ) {
        map.setCenter( new GLatLng( sStartLat, sStartLng ), zoomLevel );
        map.disableDoubleClickZoom();
		map.disableDragging();
    }
    getMapData( false );
}

function createHtml( pIsbn, pBookImage, pFlagImage, pImage, pTitle, pDisplayName, pTimeDiff, pTimeUnit, pWebsite, pBookUrl ) {
    var html;

    deliveryVar = 'delivery';
    if( 'US' == pWebsite )
    {
	    deliveryVar = 'shipping';
    }
    if ( 'big' == pMapType ) {
        html = '<span class="GoogleMap"><a href="' + pBookUrl + '">';
        html += '<img src="' + pBookImage + '" alt="' + pTitle + '" width="75" height="80" class="bookImage" />';
        html += '<span class="orderContent">';
        html += '<span class="location">Someone in<br /> ' + pDisplayName + '<img src="' + sImageDir + 'worldflags/' + pFlagImage + '.png" alt="' + pDisplayName + '" class="flag" /></span>';
        html += '<span class="bookTitle"><em>Bought </em>' + pTitle + '</span>';
        html += '<span class="deliveryMessage">with free ' + deliveryVar + '</span>';
        html += '<span class="map_minutes">' + pTimeDiff + '</span>';
        html += '</span></a></span>';
    }
    if ( 'small' == pMapType ) {
        html = '<span class="GoogleMap" id="GoogleMap">';
        html += '<img src="' + pImage + '" alt="' + pTitle + '" width="75" height="80" class="bookImage" />';
        html += '<span class="orderContent">';
        html += '<span class="location">Someone in<br/> ' + pDisplayName + '<img src="' + sImageDir + 'worldflags/' + pFlagImage + '.png" alt="' + pDisplayName + '" class="flag" /></span>';
        html += '<span class="bookTitle"><em>Bought </em>' + pTitle + '</span>';
        html += '<span class="deliveryMessage">with free ' + deliveryVar + '</span>';
        html += '<span class="map_minutes">' + pTimeDiff + '</span></span></span>';


    }
    return html;
    $("img.bookImage").click(function(){
	    alert('book image');
	    try{pageTracker._trackEvent('map', 'book image', 'mini map')}catch(err){}return true;
	});
}


function createMarker( pPoint, pHtml ) {
    var tinyIcon = new GIcon();
    tinyIcon.image = sImageDir + 'mm_20_red.png';
    tinyIcon.shadow = sImageDir + 'mm_20_shadow.png';
    tinyIcon.iconSize = new GSize( 12, 20 );
    tinyIcon.shadowSize = new GSize( 22, 20 );
    tinyIcon.iconAnchor = new GPoint( 6, 20 );
    tinyIcon.infoWindowAnchor = new GPoint( 4, 1 );
    mOptions = { icon: tinyIcon };
    var gMarker = new GMarker( pPoint, mOptions );
    fromLatLng = map.fromLatLngToDivPixel( pPoint );
    fromLatLng.x += 80;
    fromLatLng.y -= 70;
    newPoint = map.fromDivPixelToLatLng( fromLatLng );
    if ( 'big' == pMapType ) {
        map.panTo( newPoint );
        map.addOverlay( gMarker );
        if ( gMarker.infoWindowInstance == null ) {
            gMarker.infoWindowInstance = new infoWindow( gMarker, pHtml );
            map.addOverlay( gMarker.infoWindowInstance );
        }
    }
    if ( 'small' == pMapType ) {
        map.panTo( newPoint );
        map.addOverlay( gMarker );
        if ( gMarker.infoWindowInstance == null ) {
            gMarker.infoWindowInstance = new infoWindow( gMarker, pHtml );
            map.addOverlay( gMarker.infoWindowInstance );
        }
    }
    return gMarker;
}

function createPoint( pLatitude, pLongitude ) {
    return new GLatLng( pLatitude, pLongitude );
}

function bigMapOpenBook( pBookUrl ) {
    document.location = pBookUrl;
}

function infoWindow( marker, html, width ) {
    this.html = html;
    this.width = ( width ) ? width + 'px' : 'auto';
    this.marker = marker;
}
infoWindow.prototype = new GOverlay();
infoWindow.prototype.initialize = function( map ) {
    this.map = map;
    var container = document.createElement( 'div' );
    container.setAttribute( 'class', 'container' );
    map.getPane( G_MAP_FLOAT_PANE ).appendChild( container );
    this.container = container;

    var shadow = document.createElement( 'div' );
    shadow.setAttribute( 'class', 'shadowContainer' );
    map.getPane( G_MAP_FLOAT_SHADOW_PANE ).appendChild( shadow );
    this.shadow = shadow;
}
infoWindow.prototype.remove = function() {
    this.container.parentNode.removeChild( this.container );
    this.shadow.parentNode.removeChild( this.shadow );
}
infoWindow.prototype.redraw = function( force ) {
    if ( !force ) return;
    var content = document.createElement( 'span' );
    content.innerHTML = this.html;
    content.setAttribute( 'class', 'mapBookSurround' );
    content.style.margin = '6px 0px 0px 0px';
    content.style.padding = '0';
    content.style.border = '0';
    content.style.width = '208px';
    content.style.height = '108px';
    content.style.display = 'block';
    content.style.position = 'absolute';
    content.style.background = '#fff';
    this.map.getContainer().appendChild( content );
    content.parentNode.removeChild( content );
    var contentWidth = 204;
    var contentHeight = 105;
    var wrapper = document.createElement( 'div' );
    wrapper.setAttribute( 'class', 'mapSurround4' );
    wrapper.appendChild( content );
    var wrapperParts = {
        tl: {},
        t: {},
        tr: {},
        l: {},
        r: {},
        bl: {},
        p: {},
        b: {},
        br: {}
    }
    for (i in wrapperParts) {
        var img = document.createElement( 'img' );
        img.src = sImageDir + 'map_window/' + i + '.png';
        img.alt = '';
		img.className = 'bubbleCorners ' + i;
        wrapper.appendChild( img );
        wrapperParts[i].img = img;
    }
    var pixelLocation = this.map.fromLatLngToDivPixel( this.marker.getPoint() );
    this.container.style.position = 'absolute';
    this.container.style.left = ( pixelLocation.x - 3 ) + 'px';
    this.container.style.top = ( pixelLocation.y - contentHeight - 25 - this.marker.getIcon().iconSize.height ) + 'px';
    this.container.style.display = 'block';
    this.container.appendChild( wrapper );
    var mapNE = this.map.fromLatLngToDivPixel( this.map.getBounds().getNorthEast() );
    var panX = 0;
    var panY = 0;
    if ( this.container.offsetTop < mapNE.y ) {
        panY = mapNE.y - this.container.offsetTop;
    }
    if ( this.container.offsetLeft + contentWidth + 10 > mapNE.x ) {
        panX = ( this.container.offsetLeft + contentWidth + 10 ) - mapNE.x;
    }
}

window.onunload = GUnload;
