// FIXED MAP VARIABLES
var max_zoom = 17;
var min_zoom = 7;
var current_zoom;

// STREET VIEW
var svPan = null;		// street view panoramic
var svOverlay = null;	// street view overlay
var svMarker = null;	// street view marker
var svIcon = null;		// street view icon
var svOverlayAdded = false;	// street view added tracker

function mapFunctions(map) {
    
    //store the current position so you can return to it
    GEvent.addListener(map, "movestart", function() {
    		map.savePosition();
    });
    
    //store the current zoom after every zoom
    GEvent.addListener(map, "zoomend", function() {
    		current_zoom = map.getZoom();
    		alignZoomBar();
    });
}

function alignZoomBar() {
    zoom_bar_pos = (17-current_zoom)*10;
    $('#zoom_bar').css("top", zoom_bar_pos+"px");    
}

// PAN THE MAP
function mapPan(way){ switch (way) { case "up": map.panDirection(0,1);break; case "down": map.panDirection(0,-1);break; case "left": map.panDirection(1,0);break; case "right": map.panDirection(-1,0);break; } }

// RETURN TO THE PREVIOUS MAP POSITION
function returnToLastPosition() { map.returnToSavedPosition(); }

// CHANGE THE MAP TYPE
function mapType(type) {
	switch(type) {
		case "satellite":
			map.setMapType(G_SATELLITE_MAP);
			break;
		case "hybrid":
			map.setMapType(G_HYBRID_MAP);
			break;
		case "road":
		default:
			map.setMapType(G_NORMAL_MAP);
			break;
	}
}


// ZOOM THE MAP
function zoomMap(way) {
	var currentzoom = map.getZoom();
	var way = parseInt(way);
	if (((currentzoom+way) >= min_zoom) && ((currentzoom+way) <= max_zoom)) {
		map.setZoom(map.getZoom()+parseInt(way));
	}
}

// CUSTOM CONTROLS

function CLAControls() { }    
CLAControls.prototype = new GControl();

CLAControls.prototype.initialize = function(map) {
        
    // MAIN CONTAINER
    var container = document.createElement("div");
    $(container).attr("id", "control_container");
    var container_bg = document.createElement("img");
    $(container_bg).attr("src", "/gfx/map/rightnav_bg.png");
    $(container_bg).attr("id", "control_container_bg");
    container.appendChild(container_bg);
    $(container_bg).load(function() {
        fixRightPNG();
    });
    
    // PANNING CONTROLS    
    var pan_up = this._addControl(container, "pan_up", "Pan up"); $(pan_up).click(function() { mapPan("up"); return false; } );
    var pan_down = this._addControl(container, "pan_down", "Pan down"); $(pan_down).click(function() { mapPan("down"); return false; } );
    var pan_left = this._addControl(container, "pan_left", "Pan left"); $(pan_left).click(function() { mapPan("left"); return false; } );
    var pan_right = this._addControl(container, "pan_right", "Pan right"); $(pan_right).click(function() { mapPan("right"); return false; } );
    var pan_last = this._addControl(container, "pan_last", "Pan to last result"); $(pan_last).click(function() { returnToLastPosition(); return false; } );
    
    // ZOOM CONTROLS
    var zoom_in = this._addControl(container, "zoom_in", "Zoom in"); $(zoom_in).click(function() { zoomMap(1); return false; } );
    var zoom_out = this._addControl(container, "zoom_out", "Zoom out"); $(zoom_out).click(function() { zoomMap(-1); return false; } );
    
    var zoom_bar_container = document.createElement("div");
    $(zoom_bar_container).attr("id", "zoom_bar_container");
    container.appendChild(zoom_bar_container);
    var zoom_bar = this._addControl(zoom_bar_container, "zoom_bar", "Drag to change zoom level");
    $(zoom_bar).draggable({
        axis:'y',
        containment:'parent',
        grid:[10,10],
        stop: function(e, ui) {
            var zoom_level = 17-(ui.position.top/10);
            if (zoom_level > 17 || zoom_level < 7) {
                map.setZoom(current_zoom);
                alignZoomBar();
            }
            else {
                map.setZoom(zoom_level);
            }
        }
    });
    
    // TYPE CONTROLS
    var type_map = this._addControl(container, "type_map", "Show street map"); $(type_map).click(function() { mapType("road"); return false; } );
    var type_satellite = this._addControl(container, "type_satellite", "Show satellite imagery"); $(type_satellite).click(function() { mapType("hybrid"); return false; } );
    var type_streetview = this._addControl(container, "type_hybrid", "Show street view"); $(type_streetview).click(function() { toggleStreetView(); return false; } );
        
    map.getContainer().appendChild(container);
    
    mapFunctions(map);
    
    return container;
    
}

CLAControls.prototype.getDefaultPosition = function() {
    return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(2, 5));
}

CLAControls.prototype._addControl = function(container, id, title) {
    
    var control = document.createElement("a");
    $(control).attr("href", "#");
    $(control).attr("id", id);
    $(control).attr("title", title);
    $(control).click(function() {
        return false;
    });
        
    var control_img = document.createElement("img");
    $(control_img).attr("src", "/gfx/map/"+id+".png");
    
    control.appendChild(control_img);
    container.appendChild(control);
    
    return control;
}


function getAptInfoWindow(i) {
    // SHORTEN NAME IF REQUIRED
	var aptname_split = apts[i]['name'].split(" ");
	var j=0;
	var aptname = "";
	do {
		aptname += aptname_split[j] +" ";
		j++;
	} while ((j < aptname_split.length) && (aptname.length < 30));
	
	var html = "<div class='bubble'>";
	html += "<table>";
	html += "<tr><td colspan='2'><a href='"+apts[i]['link']+"' style='color:#0FAECF;font-weight:bold'>"+aptname+"</a></td></tr>";
	html += "<tr>";
	html += "<td style='padding:0px'><a href='"+apts[i]['link']+"'><img src='"+apts[i]['folder']+"/tn.jpg' width='69' height='46' alt=\""+aptname+"\" /></a></td>";
	html += "<td valign='top' style='padding-top:5px;padding-right:0px' class='info'><strong>Minimum Stay:</strong> "+apts[i]['minstay']+" "+getNights(apts[i]['minstay'])+"<br />";
	html += "<strong>Lowest Rate:</strong> <span class='rate'>&pound;"+apts[i]['lowrate']+"</span><br />";
	html += "<a href='"+apts[i]['link']+"' class='infolink'>more information</a></td>";
	html += "</tr>";
	html += "</table>";
	html += "</div>";
	return html;
}

function getNights(nights) {
	if (parseInt(nights) > 1) return "Nights";
	else return "Night";
}

function showTooltip(i) {
	var marker = apts[i]['marker'];
	marker.tooltip = '<table cellspacing="0" class="tooltip"><tr><td class="tleft" width="14"><img src="/gfx/map/tooltip-front2.gif" /></td><td class="tmiddle">'+apts[i]["name"]+'</td><td class="tright" width="15"><img src="/gfx/map/tooltip-back2.gif" /></td></tr></table>';
	tooltip.innerHTML = marker.tooltip;
	var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());
	var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
	var anchor=marker.getIcon().iconAnchor;
	var width=marker.getIcon().iconSize.width;
	var height=tooltip.clientHeight;
	var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width + 5, offset.y - point.y -anchor.y -height + 16));
	pos.apply(tooltip);
	
	var marker_right = findPos(tooltip,"left")+tooltip.offsetWidth;
	
	var themap = document.getElementById("map");
	var map_right = findPos(themap,"left")+themap.offsetWidth-60;
	
	if (marker_right > map_right) {
		marker.tooltip = '<table cellspacing="0" class="tooltip"><tr><td class="tleft" width="14"><img src="/gfx/map/tooltip-back1.gif" /></td><td class="tmiddle">'+apts[i]["name"]+'</td><td class="tright" width="15"><img src="/gfx/map/tooltip-front1.gif" /></td></tr></table>';
		tooltip.innerHTML = marker.tooltip;
		var newpos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x - tooltip.offsetWidth - 5, offset.y - point.y -anchor.y -height + 16)); 
		newpos.apply(tooltip);		
	}
	
	tooltip.style.visibility="visible";
}

function hideTooltip() {
    tooltip.style.visibility = "hidden";
}

function findPos(obj,pos) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft; curtop = obj.offsetTop;
		while (obj = obj.offsetParent) { curleft += obj.offsetLeft; curtop += obj.offsetTop;}
	}	
	//return [curleft,curtop];
	if (pos == "left") return curleft;
	if (pos == "top") return curtop;
}

function toggleStreetView() {
	
	if (null === svOverlay) {
		svOverlay = new GStreetviewOverlay();
	}
	if (null === svPan) {
		svPan = new GStreetviewPanorama(document.getElementById("streetview"));    
		GEvent.addListener(svPan, "initialized", moveStreetViewIcon);
		GEvent.addListener(svPan, "yawchanged", rotateStreetViewIcon);
	}
	
	if (false === svOverlayAdded) {
	    svOverlayAdded = true;
	    map.addOverlay(svOverlay);
	    $('#streetviewcontrol').html('Hide Street View');
	    showStreetView(null, map.getCenter());
	}
	else {
	    svOverlayAdded = false;
	    $('#streetviewcontrol').html('Show Street View');
	    map.removeOverlay(svOverlay);
	    if (svMarker != null) map.removeOverlay(svMarker);
	    svPan.remove();
	    $('#streetview').slideUp();
	}
	
}

function showStreetView(overlay, latlng) {
    $('#streetview').slideDown("normal", function() {
	    if (svMarker == null) {
            svIcon = new GIcon();
		    svIcon.iconSize = new GSize(49, 52);
		    svIcon.iconAnchor = new GPoint(25, 35);
            svIcon.image = '/gfx/map/man_arrow-1.png';
	        svMarker = new GMarker(latlng, {
                icon: svIcon,
                draggable: true
            });
            GEvent.addListener(svMarker, "dragstart", function(latlng) {
               svMarker.setImage('/gfx/map/man_arrow-1.png');
            });
		    GEvent.addListener(svMarker, "dragend", function(latlng) {
               showStreetView(overlay, latlng);
            });
	    }
	    else {
	        map.removeOverlay(svMarker);
	        svMarker.setLatLng(latlng);
	    }
	    $('#streetview').show();
	    svPan.setLocationAndPOV(latlng);    
	    map.addOverlay(svMarker);
    	addStreetViewHelp();
    });
}

function moveStreetViewMarker(latlng) {
	if (null !== svMarker) {
		svMarker.setLatLng(latlng);
		svPan.setLocationAndPOV(latlng);
	}
}

function moveStreetViewIcon(location) {
    svMarker.setLatLng(location.latlng);
}

function rotateStreetViewIcon(yaw) {
    niceYaw = parseInt(Math.round(yaw));
    while (niceYaw%24 != 0) {
        niceYaw--;
    }
    niceYaw = (niceYaw/24)+1;
    svMarker.setImage('/gfx/map/man_arrow-'+niceYaw+'.png');
}

function addStreetViewHelp() {
	$('#streetview').html([
		'<div style="padding:10px;font-size:12px;">',
			'In order to start using Street View, please move the Street View marker (<img style="position:relative;top:20px;" src="/gfx/map/man_arrow-1.png"/> ) directly over a street marked with a blue outline.',			
		'</div>'
	].join(''));
}

function svHandleNoFlash(errorCode) {
    if (errorCode == 603) {
        alert("Error: Flash doesn't appear to be supported by your browser");
    }
}