// JavaScript Document

// credits and copyright
// ----------------------------------------------

// global objects and variables
// ----------------------------------------------
	// start customization
	var fltStartLat = 40.748024;
	var fltStartLon = -73.983943;
	var intStartZoom = 12;
	var strMapType = G_NORMAL_MAP;
	var icoImage = '/images/icons/maps/067_norm.png';
	var icoHover = '/images/icons/maps/067_hov.png';
	var icoReckson = '/images/icons/maps/reckson.png';
	var icoRecksonHover = '/images/icons/maps/recksonHover.png';
	var icoShadow = '/images/icons/maps/shadow40.png';
	//end customization

var objStats = null;
var objMap = null;
var map = null;
var objMarkers = null;
var objToolTip = null;
var objToolTipText = null
// create custom icons
var icoIcon = new GIcon();
icoIcon.image = icoImage;
icoIcon.shadow = icoShadow;
icoIcon.iconSize = new GSize(19, 23);
icoIcon.shadowSize = new GSize(30, 23);
icoIcon.iconAnchor = new GPoint(9, 11);
icoIcon.infoWindowAnchor = new GPoint(9, 11);
var icoIconReckson = new GIcon();
icoIconReckson.image = icoReckson;
icoIconReckson.shadow = icoShadow;
icoIconReckson.iconSize = new GSize(19, 23);
icoIconReckson.shadowSize = new GSize(30, 23);
icoIconReckson.iconAnchor = new GPoint(9, 11);
icoIconReckson.infoWindowAnchor = new GPoint(9, 11);

// image preloader
// ----------------------------------------------
var wmImg = new Array();
function wmPreload(strPath) {
	var objImg = new Image();
	objImg.src = strPath;
	wmImg.push(objImg);
}

// utility functions
// ----------------------------------------------
omcMap = function(objMap) {
	// store map object
	this.map = objMap;
	// create object for map state
	this.mapState = {}
}
addToPortfolio = function(intId, strAction) {
	new Ajax.Request(
		'/data/addToPortfolio.php', {
			method: 'post',
			parameters: 'property=' + intId + '&action=' + strAction,
			onSuccess: _addToPortfolio
	});
}
_addToPortfolio = function(strResponse) {
	var objResponse = strResponse.responseText.evalJSON(true);
	if (objResponse.result) {
		var obj = $('portfolioAction');
		if (objResponse.action == 'add') {
			obj.innerHTML = '<a id="lnkMapAdd" href="/" onclick="addToPortfolio(' + objResponse.id + ', \'delete\');return false;">Delete from portfolio</a>';
			for (var i = 0; i < objMarkers.properties.length; i++) {
				if (objMarkers.properties[i].id == objResponse.id) {
					objMarkers.properties[i].portfolio = true;
				}
			}
		} else if (objResponse.action == 'delete') {
			obj.innerHTML = '<a id="lnkMapAdd" href="/" onclick="addToPortfolio(' + objResponse.id + ', \'add\');return false;">Add to portfolio</a>';
			for (var i = 0; i < objMarkers.properties.length; i++) {
				if (objMarkers.properties[i].id == objResponse.id) {
					objMarkers.properties[i].portfolio = false;
				}
			}
		}
	} else {
	}
}
// generate query string parameters from current map
// parameters--
// returns string (query string like list of name/value pairs separate by ampersand)
omcMap.prototype.getMapLink = function() {
	// standard map parameters
	var intZoom = this.map.getZoom();
	var objCenter = this.map.getCenter();
	var strMapType = this.map.getCurrentMapType();
	var strOutput = 'zoom=' + intZoom + '&x=' + objCenter.x + '&y=' + objCenter.y + '&type=' + strMapType.zv + '&';
	// custom map parameters
	$('frmProperties').getElementsBySelector('input').each(function(obj) { 
		switch (obj.type) {
			case 'checkbox':
				strOutput += obj.id + '=' + obj.checked + '&';
			break;
			case 'text':
				strOutput = strOutput + obj.id + '=' + obj.value + '&';
			break;
		}
	});
	return strOutput;
}
omcMap.prototype.restoreMap = function() {
	// local vars and objects
	var arrTypes = { };
	arrTypes.Map = G_NORMAL_MAP;
	arrTypes.Sat = G_SATELLITE_MAP;
	arrTypes.Hyb = G_HYBRID_MAP;
	var intX = null;
	var intY = null;
	var obj = null;
	// retrieve and parse query string
	var arrParams = window.location.href.parseQuery();
	// restore map
	for (strKey in arrParams) {
		switch (strKey) {
			case 'type':
				this.map.setMapType(arrTypes[arrParams[strKey]]);
			break;
			case 'x':
				intX = arrParams[strKey];
			break;
			case 'y':
				intY = arrParams[strKey];
			break;
			case 'zoom':
				this.map.setZoom((arrParams[strKey] - 0));
			break;
			default:
				if ($(strKey)) {
					obj = $(strKey);
					switch (obj.type) {
						case 'checkbox':
							if (arrParams[strKey] == 'false') {
								obj.checked = false;
							} else {
								obj.checked = true;
							}
						break;
						case 'text':
							obj.value = arrParams[strKey];
						break;
					}
				break;
				}
		}
	}
	if (intX && intY) {
		this.map.panTo(new GLatLng(intY, intX));
	}
	wmFilter();
}

// tooltip functions
// ----------------------------------------------
function wmToolTipPosition() {
	if (objToolTip.marker) {
		var objPoint = objMap.getCurrentMapType().getProjection().fromLatLngToPixel(objMap.getBounds().getSouthWest(), objMap.getZoom());
		var objOffset = objMap.getCurrentMapType().getProjection().fromLatLngToPixel(objToolTip.marker.getPoint(), objMap.getZoom());
		var objIcon = objToolTip.marker.getIcon();
		var objAnchor = objIcon.iconAnchor;
		var intWidth = objIcon.iconSize.width;
		var offMap = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(objOffset.x - objPoint.x - objAnchor.x + intWidth, -objOffset.y + objPoint.y + objAnchor.y)).offset;
		if (offMap.width <= 0 || offMap.width >= 712 || offMap.height <= -10 || offMap.height >= 412) {
			objToolTip.style.display = 'none';
		} else {
			if (objToolTip.style.display == 'none' && objToolTip.marker) {
				objToolTip.style.display = 'block';
			}
		}
		var objPos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(objOffset.x - objPoint.x - objAnchor.x + intWidth - 85, -objOffset.y + objPoint.y + objAnchor.y + 157)); 
		objPos.apply(objToolTip);
	}
}
function wmToolTipClose() { wmToolTip('close'); }
function wmToolTip(strAction, objMarker, intIndex) {
	switch(strAction) {
		case 'close':
			// hide + reset tooltip
			objToolTip.style.display = 'none';
			objToolTip.marker = false;
		break;
		case 'open':
			// set tool tip properties
			var intId = objMarker.Wa.substring(6);
			objToolTip.id = intId;
			objToolTip.marker = objMarker;
			// set tool tip position
			wmToolTipPosition();
			// set tool tip inner HTML
			var strOutput = '<div id="toolTipPointer"><div id="toolTipFrame" style="z-index:1000;"><div id="toolTipClose"><a href="" onclick="javascript:wmToolTip(\'close\');return false;"></a></div><div id="tooltip_inner"><div id="tooltip_image"><img src="/images/property/' + objMarkers.properties[intIndex].image + '" alt="' + objMarkers.properties[intIndex].address + '" title="' + objMarkers.properties[intIndex].address + '" /></div><p><strong>' + objMarkers.properties[intIndex].address + '</strong>';
			if (objMarkers.properties[intIndex].sublease) {
				strOutput += '<br /><span style="color:#ca023b;">SUBLEASE</span>';
			}
			strOutput += '</p><p>Total Sq. Ft.: ';
			if (objMarkers.properties[intIndex].totalsqft == 0) {
				strOutput += 'N/A';
			} else {
				strOutput += objMarkers.properties[intIndex].totalsqft;
			}
			strOutput += '<br />Available units: ' + objMarkers.properties[intIndex].leases + '</p><p><a id="lnkMapMore" href="/properties/view/' + objMarkers.properties[intIndex].safename + '/' + map.getMapLink() + '">Click for more information &amp; photos</a><br />';
			if (objMarkers.loggedIn) {
				if (objMarkers.properties[intIndex].portfolio == false) {
					strOutput += '<span id="portfolioAction"><a id="lnkMapAdd" href="/" onclick="addToPortfolio(' + objMarkers.properties[intIndex].id + ', \'add\');return false;">Add to portfolio</a></span>';
				} else if (objMarkers.properties[intIndex].portfolio == true) {
					strOutput += '<span id="portfolioAction"><a id="lnkMapAdd" href="/" onclick="addToPortfolio(' + objMarkers.properties[intIndex].id + ', \'delete\');return false;">Delete from portfolio</a></span>';
				}
			}
			strOutput += '</p></div></div></div>';
			objToolTip.innerHTML = strOutput;
			// display tooltip
			objToolTip.style.display = 'block';
		break;
	}
}

// info pane functions
// ----------------------------------------------
function addInfo(intIndex, objProp) {
	var strOutput = '<p onclick="wmPanTo(' + intIndex + ', 14);" style="background-image:url(';
	if (objProp.reckson == '1') {
			strOutput += icoReckson;
		} else {
			strOutput += icoImage;
		}
	strOutput += ');"><span class="property_address">' + objProp.address + '</span><br />' + objProp.city + ', ' + objProp.state + ' ' + objProp.zipcode + '</p>';
	objInfo.innerHTML = objInfo.innerHTML + strOutput;
}
function resetInfo() {
	var arrPos = Position.positionedOffset(objInfo);
//	new Effect.Move(objInfo, {x: 0, y:-500, mode:'absolute'});
	objInfo.style.top = '0';
}

function updateInfo(strResponse) {
	// parse JSON response
	var objResponse = eval("(" + strResponse.responseText + ")");
	// int Id-->difference between object id and its array position
	var intId = objResponse.id - 1;
	// begin output HTML string
	var strOutput = '<h2>' + objMarkers.properties[intId].address + '</h2><p style="text-align:center;"><img src="' + objMarkers.properties[intId].mainimage + '" alt="' + objMarkers.properties[intId].address + '" title="' + objMarkers.properties[intId].address + '" width="250" /></p><p><img src="images/ajaxarrow_right.gif" alt="Right-pointing arrow" /><a href="/" onclick="javascript:wmPanAndZoom(' + intId + ');return false;">Area Map</a> &nbsp; ';
	if (objMarkers.properties[intId].leases > 0) {
		strOutput = strOutput + '<img src="images/ajaxarrow_right.gif" alt="Right-pointing arrow" /><a href="/" onclick="javascript:showModal(' + (intId + 1) + ', \'ajax\', \'Leases for ' + objMarkers.properties[intId].address + '\', 800);return false;">Leasing Info</a>';
	}
	if (objMarkers.properties[intId].leases > 0 && objMarkers.properties[intId].moreimages == "true") {
		strOutput = strOutput + ' &nbsp; ';
	}
	// output images
	if (objMarkers.properties[intId].moreimages == "true") {
		strOutput = strOutput + '<img src="images/ajaxarrow_right.gif" alt="Right-pointing arrow" /><a href="' + objResponse.images[0] + '" rel="lightbox[gallery]" title="' + objMarkers.properties[intId].address + '" onclick="javascript:myLightbox.start(this); return false;">More Images</a>';
		for (var i = 1; i < objResponse.images.length; i++) {
			strOutput = strOutput + '<a href="' + objResponse.images[i] + '" rel="lightbox[gallery]" style="display:none;">test</a>';
		}
	}
	strOutput = strOutput + '</p><h3>The Building</h3>' + "<p>" + objMarkers.properties[intId].propdesc + '</p>';
	// output building info
	if (objResponse.type) {
		for (var i = 0; i < objResponse.type.length; i++) {
			strOutput = strOutput + '<h3>' + arrTypes[i] + '</h3><ul>';
			for (var j = 0; j < objResponse.type[i].length; j++) {
				strOutput = strOutput + '<li>' + objResponse.type[i][j] + '</li>';
			}
			strOutput = strOutput + '</ul>';
		}
	}
	// output major tenants
	if (objResponse.tenants) {
		strOutput = strOutput + '<h3>Major Tenants</h3>';
		var strTenant = "";
		for(var i = 0; i < objResponse.tenants.length; i++) {
			for (var j = 0; j < objResponse.tenants[i].length; j++) {
				if (j % 2 == 0) {
					strTenant = strTenant + '<p><strong>' + objResponse.tenants[i][j] + '</strong></p>';
				} else {
					strTenant = strTenant + '<ul>';
					for (var k = 0; k < objResponse.tenants[i][j].length; k++) {
						strTenant = strTenant + '<li>' + objResponse.tenants[i][j][k].tenant + '</li>';
					}
					strTenant = strTenant + '</ul>';
				}
			}
		}
		strOutput = strOutput + strTenant;
	}
	// output contact info
	if (objResponse.contacts) {
		strOutput = strOutput + '<h3>Contacts</h3>';
		var strContact = "";
		for(var i = 0; i < objResponse.contacts.length; i++) {
			for (var j = 0; j < objResponse.contacts[i].length; j++) {
				if (j % 2 == 0) {
					strContact = strContact + '<p><strong>' + objResponse.contacts[i][j] + '</strong></p>';
				} else {
					for (var k = 0; k < objResponse.contacts[i][j].length; k++) {
						strContact = strContact + '<p>' + objResponse.contacts[i][j][k].name + '<br />' + objResponse.contacts[i][j][k].phone + '<br /><a href="mailto:' + objResponse.contacts[i][j][k].email + '" onclick="javascript:mdlContact(' + objResponse.contacts[i][j][k].contactid + ');return false;">' + objResponse.contacts[i][j][k].email + '</a></p>';
					}
				}
			}
		}
		strOutput = strOutput + strContact;
	}
	objInfo.innerHTML = strOutput;
	new Effect.Appear(objInfo);
}

// marker functions
// ----------------------------------------------
function wmPanTo(intId, intZoom) {
	objMap.setCenter(new GLatLng(objMarkers.properties[intId].lat, objMarkers.properties[intId].lon));
	if (intZoom) {
		objMap.setZoom(intZoom);
	}
	wmToolTip('open', objMarkers.properties[intId ].marker, intId );
}

function wmAddMarker(fltLat, fltLon, objIcon, i, intId) {
	// construct marker
	if (objMarkers.properties[i].reckson == '1') {
		objIcon = icoIconReckson;
	} else {
		objIcon = icoIcon;
	}
	var objPoint = new GLatLng(fltLat, fltLon);
	var objMarker = new GMarker(objPoint, {icon:objIcon});
	objMarker.Wa = "marker" + (intId);
	objMarkers.properties[i].marker = objMarker;
	// add marker to map
	objMap.addOverlay(objMarker);
	// mouse over--change icon to 'hover' state
	GEvent.addListener(objMarker, 'mouseover', function() {
		// change icon to 'hover' state
		if (objMarkers.properties[i].reckson) {
			objMarker.setImage(icoRecksonHover);
		} else {
			objMarker.setImage(icoHover);
		}
	});
	// mouse out--remove 'hover' state icon
	GEvent.addListener(objMarker, 'mouseout', function() {
		if (objMarkers.properties[i].reckson) {
			objMarker.setImage(icoReckson);
		} else {
			objMarker.setImage(icoImage);
		}
	});
	// mouse click--show info window
	GEvent.addListener(objMarker, 'click', function() {
		// retrieve marker id
		var intId = objMarker.Wa.substring(6);
		// show or hide tool tip window
		if (objToolTip.style.display == 'block') {
			wmToolTip('close');
			if (intId != objToolTip.id) {
				wmToolTip('open', objMarker, i);
			}
		} else {
			wmToolTip('open', objMarker, i);
		}
	});
}

function wmEnableDistrict(e) {
	if (Event.element(e).checked) {
		$('chkNewYork').checked = true;
		wmFilter();
	}
}
function wmDisableDistrict(e) {
	if (Event.element(e).checked) {
		$('filter_districts').getElementsBySelector('input').each(function(obj) {
			obj.checked = true;
		});
	} else {
		$('filter_districts').getElementsBySelector('input').each(function(obj) {
			obj.checked = false;
		});
	}
}
function wmFilter() {
	// local vars
	var intCount = 0;
	var objBounds = new GLatLngBounds();
	var arrLocations = new Array();
	var arrDistricts = new Array();
	var strAddress = '';
	// close tool tip
	if (objToolTip) {
		wmToolTip('close');
	}
	// remove all existing markers
	for (var i = 0; i < objMarkers.properties.length; i++) {
		if (objMarkers.properties[i].marker) {
			objMap.removeOverlay(objMarkers.properties[i].marker);
		}
	}
	// clear info window
	objInfo.innerHTML = '';
	// locations
	var arrI = $('filter_locations').getElementsBySelector('input');
	for (var i = 0; i < arrI.length; i++) {
		if (arrI[i].checked) {
			arrLocations.push(arrI[i].value);
		}
	}
	// districts
	var arrI = $('filter_districts').getElementsBySelector('input');
	for (var i = 0; i < arrI.length; i++) {
		if ($('chkNewYork').checked) {
			if (arrI[i].checked) {
				arrDistricts.push(arrI[i].value);
			}
		} else {
			arrDistricts.push(arrI[i].value);
		}
	}
	// address
	strAddress = $('txtSearchAddress').value.toLowerCase().strip();
	// determine bounds
	for (var i = 0; i < objMarkers.properties.length; i++) {
		if (arrLocations.indexOf(objMarkers.properties[i].location) != -1 && (arrDistricts.indexOf(objMarkers.properties[i].districtid) != -1 || (objMarkers.properties[i].city != 'Manhattan' && objMarkers.properties[i].city != 'Long Island City' && objMarkers.properties[i].city != 'Brooklyn') ) && (strAddress == '' || objMarkers.properties[i].address.toLowerCase().indexOf(strAddress) != -1) ) {
			objBounds.extend(new GLatLng(objMarkers.properties[i].lat, objMarkers.properties[i].lon));
			wmAddMarker(objMarkers.properties[i].lat, objMarkers.properties[i].lon, icoIcon, i, objMarkers.properties[i].id);
			addInfo(i, objMarkers.properties[i]);
			intCount++;
		}
	}
	// zoom to search result extent
	if (intCount > 0) {
		objMap.setZoom(objMap.getBoundsZoomLevel(objBounds));
		objMap.setCenter(objBounds.getCenter());
	}
}

function wmInit() {
	// create info pane and tooltip objects
	objInfo = $('info_inner');
	wmPreload(icoImage);
	wmPreload(icoReckson);
	objToolTip = $('tooltip');
	// create map, add controls, set properties, center, and render
	objMap = new GMap2($('map'));
	objMap.addControl(new smallZoomControl());
	objMap.addControl(new GOverviewMapControl());
	objMap.enableContinuousZoom()
	objMap.setCenter(new GLatLng(fltStartLat, fltStartLon), intStartZoom, strMapType);
	objMap.addControl(new mapTypeControl());
	map = new omcMap(objMap);
	// initialize non-Google Maps related elements and events
	if (BrowserDetect.browser != 'Explorer') {
		Event.observe('chkNewYork', 'click', wmDisableDistrict, false);
	}
	GEvent.addListener(objMap, 'mouseout', resetInfo);
	$('frmProperties').getElementsBySelector('input').each(function(obj) { 
		if (obj.id != 'txtSearchAddress') {
			Event.observe(obj, 'click', wmFilter, false);
		}
	});
	Event.observe('txtSearchAddress', 'keyup', wmFilter, false);
	Event.observe('txtSearchAddress', 'change', wmFilter, false);
	$('filter_districts').getElementsBySelector('input').each(function(obj) {
		Event.observe(obj, 'click', wmEnableDistrict, false);
	});
	if (BrowserDetect.browser == 'Explorer') {
		Event.observe('chkNewYork', 'click', wmDisableDistrict, false);
	}
	// initalize tooltip + preload images
	wmPreload('/images/backgrounds/bg_properties_tooltip.jpg');
	wmPreload('/images/backgrounds/bg_properties_tooltip_shadow.png');
	wmPreload('/images/icons/close.gif');
	wmPreload('/images/icons/arrow_right_blue.gif');
	wmPreload('/images/icons/plus.gif');
	wmPreload('/images/icons/maps/toolTipBg_bottom.png');
	// preload images
	for (var i = 0; i < objMarkers.properties.length; i++) {
		wmPreload('/images/property/' + objMarkers.properties[i].image);
	}
	// run filter and add markers to map; either restores or inits
	map.restoreMap();
	// hide tooltip if map, not marker, is clicked on
	GEvent.addListener(objMap, 'click', function(objMarker, arrPoint) {
		if (!objMarker) {
			objToolTip.style.display = 'none';
		}
	});
	// move tooltip with map
	GEvent.addListener(objMap, 'move', function() {
		wmToolTipPosition();
	});
	// move tooltip on zoom
	GEvent.addListener(objMap, 'zoomend', function(intZoomStart, intZoomEnd) {
		wmToolTipPosition();
	});
}

function wmLoad() {
	// test for browser compatibility using built-in Google function
	if (GBrowserIsCompatible()) {
		// retrieve and display existing points
		GDownloadUrl('/data/properties.php', function(data, responseCode) {
			// store JSON data in objMarkers
			if (responseCode == 200) {
				objMarkers = eval("(" + data + ")");
				wmInit();
			} else {
				objInfo.innerHTML = '<p>An error occurred while loading the properties.</p>';
			}
		});
	} else {
		// let client know their browser is not compatible with Google Maps and,
		// if possible, hide the map div
		if (document.getElementById) {
			objMap = document.getElementById('map');
			objMap.style.backgroundColor = '#ebebeb';
			objMap.innerHTML = '<p class="response">We\'re sorry, but your browser cannot display Google Maps.</p>';
		} else {
			alert('We\'re sorry, but your browser cannot display Google Maps.');
		}
	}
}

// listeners
// ----------------------------------------------
Event.observe(window, 'load', wmLoad, false);
Event.observe(window, 'unload', GUnload, false);