var highlightTimer;
var animLength = 250;
var animSteps = 10;

var obj = [];
var moving = [];
var currentOffset = [];
var endOffset = [];
var styleType = [];
var timerId = [];
var panelTimer = [];
var startTime = [];

var staticMapWidth = 556;
var panelWidth = 240;
var panelHeight = 450;
var mapResized = false;
var browser = new Browser();

function recentreStaticMap() {
	if (browser.isIE && browser.version == '6') {
		var content = document.getElementById('content');
		var pageWidth = document.getElementById('header').offsetWidth;
		var bodyWidth = document.body.offsetWidth;
		content.style.width = (bodyWidth <= 960) ? '766px' : (bodyWidth > 1188) ? '1008px' : 'auto';
	}
	var currentMapWidth = document.getElementById('mapwindow').offsetWidth;
	if (currentMapWidth == staticMapWidth) { return; }
	var extraWidth = Math.floor((currentMapWidth - staticMapWidth)/2);
	if (biggerMap && !mapResized) {
		extraWidth -= panelWidth/2;
	}
	staticMapWidth = currentMapWidth;
	mapResized = true;

	var mapTiles = document.getElementById('maptiles');
	if (mapTiles) { mapTiles.style.left = parseInt(mapTiles.style.left) + extraWidth + 'px'; }
	var mapPois = document.getElementById('staticmappois');
	if (mapPois) { mapPois.style.left = (parseInt(mapPois.style.left) + extraWidth) + 'px'; }

	updateLinksInPanel();
}

function updateLinksInPanel() {
	var contentHolder = document.getElementById('mapcontentholder');

	if (contentHolder) {
		var resultsPanels = getElementsByClassName(contentHolder, 'div', 'results');
		var currentPattern = new RegExp('\\bcurrent\\b');

		for (var i=0; i<resultsPanels.length; i++) {
	 		var resultsPanel = resultsPanels[i];

			if (currentPattern.test(resultsPanel.className)) {
				var items = resultsPanel.getElementsByTagName('li');

				for (var j=0; j<items.length; j++) {
					var item = items[j];

					if (item) {
						updateLink(item);
					}
				}
			}
		}
	}
}

function updateLink(item) {
	var id = item.id.substring(5);
	var icon = document.getElementById('staticicon' + id);

	if (icon) {
		var left = parseInt(icon.style.left) - 12;
		var totalExtraWidth = (staticMapWidth - 518) / 2;
		var onMap = (left > (0 - totalExtraWidth)) && (left < (518 + totalExtraWidth));

		if (onMap) {
			item.style.display = '';
		} else {
			item.style.display = 'none';
		}
	}
}


function getElementsByClassName(containerElement, elementType, className) {
	var elementsByClassName = new Array();
	var els = containerElement.getElementsByTagName(elementType);
	var elsLen = els.length;
	var pattern = new RegExp('\\b' + className + '\\b');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			elementsByClassName[j] = els[i];
			j++;
		}
	}
	return elementsByClassName;
}

function initialisePanelLinks() {
	// General results links
	var links = document.getElementById('mapcontentholder').getElementsByTagName('a');
	for (var i = 0; i < links.length; i++) {
		var link = links[i];
		var listItem = link.parentNode;
		var relIndex = link.getAttribute('rel'); // get the value of it's 'REL' attribute
		if (relIndex){
			if (relIndex == 'slide') {
				// Only highlight on results panels
				if (listItem.parentNode.parentNode.className.match('results')) {
					addEvent(listItem,'mouseover',highlight);
					addEvent(listItem,'mouseout',unhighlight);
				}
			}
		}
	}

	// Add highlight to poi icons
	links = document.getElementById('staticmappois').getElementsByTagName('a');
	for (var i = 0; i < links.length; i++) {
		var link = links[i].getElementsByTagName('img')[0];
		if (link.className == 'mapicon' || link.className == 'mapicon dontPrint'){
			addEvent(link,'mouseover',highlightPanelItem);
			addEvent(link,'mouseout',unhighlightPanelItem);
		}
	}

	// Individual links
//	var changeSoldPriceOptionsLink = document.getElementById('changesoldpriceoptions');
//	if (changeSoldPriceOptionsLink) { addEvent(changeSoldPriceOptionsLink, 'click', showSoldPricesForm); }
}

function showSoldPricesForm(evt) {
	showBox('soldpricesformholder');
	cancelEvent(evt);
}

function showBox(objname) {
	obj[objname] = document.getElementById(objname);
	var objChildHeight = obj[objname].getElementsByTagName('form')[0].offsetHeight;
	styleType[objname] = 'height';
	currentOffset[objname] = obj[objname].offsetHeight;
	endOffset[objname] = (currentOffset[objname] != 0) ? 0 : objChildHeight;

	startSlide(objname);
	panelTimer[objname] = setTimeout('endPanelSlide("'+objname+'");',animLength+(animLength/animSteps)); // Clean up the animation
}

/* Common to pizazz.js */
function addEvent(obj, evType, fn, useCapture){
	useCapture = (!useCapture) ? 'false' : useCapture;
	if (obj.addEventListener){
		obj.addEventListener(evType, fn, useCapture);
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	}
}

function cancelEvent(evt) {
	evt = (evt) ? evt : window.event;

	evt.cancelBubble = true; // for IE
	if (typeof evt.stopPropagation == 'function') { evt.stopPropagation(); }

	evt.returnValue = false; // for IE
	if (typeof evt.preventDefault == 'function') { evt.preventDefault(); }
}

function startSlide(objname) {
	if (currentOffset[objname] == endOffset[objname]) {
		return;
	}
	startTime[objname] = (new Date()).getTime();

	var animStep = animLength/animSteps;
	timerId[objname] = [];

	// Set original positions
	switch (styleType[objname]) {
		case ('height'):
			obj[objname].style.height = currentOffset[objname] + 'px';
			break;
		case ('width'):
			obj[objname].style.width = currentOffset[objname] + 'px';
			break;
		case ('left'):
			obj[objname].style.left = currentOffset[objname] + 'px';
			break;
		case ('marginLeft'):
			obj[objname].style.marginLeft = currentOffset[objname] + 'px';
			break;
	}

	// And animate
	for (var i=0; i<animSteps; i++) {
	  timerId[objname][i] = setTimeout('slideTick2("' + objname + '",' + (i+1) + ');',animStep*(i+1));
	}
}

function slideTick2(objname,count) {
	var d = currentOffset[objname] + Math.round((endOffset[objname] - currentOffset[objname]) / animSteps * count);
	switch (styleType[objname]) {
		case ('height'):
			obj[objname].style.height = d + 'px';
			break;
		case ('width'):
			obj[objname].style.width = d + 'px';
			break;
		case ('left'):
			obj[objname].style.left = d + 'px';
			break;
		case ('marginLeft'):
			obj[objname].style.marginLeft = d + 'px';
			break;
	}
}

function endPanelSlide(panel) {
	clearTimeout(panelTimer[panel]);
	cleanupAnimation(panel);
}

function cleanupAnimation(objname) {
	if (timerId && timerId[objname]) {
		for (var i=0; i<timerId[objname].length; i++) {
			clearTimeout(timerId[objname][i]);
		}
	}
	delete(moving[objname]);
	delete(currentOffset[objname]);
	delete(timerId[objname]);
	if (panelTimer) { delete(panelTimer[objname]); }
	delete(startTime[objname]);
	delete(styleType[objname]);
	delete(endOffset[objname]);
	delete(obj[objname]);

	return;
}

function setCurrent(itemId, siblings) {
	for (var i=0; i<siblings.length; i++){
		var e = siblings[i];
		e.className = (e.className.match('current')) ? e.className.replace(/current/g, '') : e.className;
	}
	document.getElementById(itemId).className += ' current';
}

function highlightPanelItem(evt) {
	evt = (evt) ? evt : window.event;
	var link = (evt.target) ? evt.target : evt.srcElement;
	var panelItemId = link.id.substring(5);
	var panelItem = document.getElementById('item-'+panelItemId);
	if (!panelItem) { return; }

	// See which panel we should be in (and move to it if necessary)
	var holdingPanel = panelItem.parentNode.parentNode;
	// See how far down the list the item is (and scroll down if it's outside the viewable area)
	var panelItemPosition = panelItem.offsetTop;
	holdingPanel.scrollTop = (panelItemPosition > (panelHeight*0.7)) ? (panelItemPosition-10) : 0;

	// Add 'current' to the class
	var siblings = panelItem.parentNode.getElementsByTagName('li');
	setCurrent('item-'+panelItemId, siblings);
	cancelEvent(evt);
}

function unhighlightPanelItem(evt) {
	evt = (evt) ? evt : window.event;
	var link = (evt.target) ? evt.target : evt.srcElement;
	var panelItemId = link.id.substring(5);
	var panelItem = document.getElementById('item-'+panelItemId);
	if (!panelItem) { return; }

	// Remove 'current' from item
	if (panelItem.className.match('current')) {
		panelItem.className = panelItem.className.replace(/current/g, '');
	}
	cancelEvent(evt);
}

var circleArray = new Array(6)
for (var i=0; i<circleArray.length; i++) {
	var tempImg = new Image();
	tempImg.src = '/amp/images/icon/circle'+(i<5?6-i:3)+'0.gif';
	tempImg.id = 'circleHighlight';
	tempImg.className = 'mapiconhighlight';
	circleArray[i] = tempImg;
	tempImg = null;
}

function showMeHighlightCircles(pElement,count) {
	var pCount = count - 1;
	if (pCount < (circleArray.length)) {
		if (pCount >= 0) {
			highlightCircles(pElement,pCount);
		}
		count++;
		highlightTimer = setTimeout('showMeHighlightCircles("'+pElement+'",'+count+')', 100);
	}
}

function stopHighlightCircles() {
	if(highlightTimer){
		window.clearTimeout(highlightTimer);
		removeHighlightElement()
	}
}

function removeHighlightElement() {
	var highlightElement = document.getElementById('circleHighlight');

	if (highlightElement) {
		highlightElement.parentNode.removeChild(highlightElement);
		highlightElement = null;
	}
}

function highlightCircles(pElement,arrayNum) {
	removeHighlightElement()

	if (arrayNum < circleArray.length) {
		var theElement = document.getElementById(pElement)
		var highlightImage = circleArray[arrayNum];
		// This Safari hack is needed as the appendChild method doesn't work when it should
		var safariHack = theElement.parentNode.innerHTML;

		try {
			theElement.parentNode.appendChild(highlightImage);
		} catch(e) {
			theElement.parentNode.innerHTML = safariHack + '<img src="'+highlightImage.src+'" id="'+highlightImage.id+'" class="'+highlightImage.className+'" />';;
		}
	}

}

function highlight(evt) {
	evt = (evt) ? evt : window.event;
	var link = (evt.target) ? evt.target : evt.srcElement;
	if (link.nodeName.toLowerCase() !== 'li') { link = link.parentNode; }
	var objname = link.id.substring(5); // Remove 'item-' from the list's id
	if (document.getElementById('icon-'+objname)) {
		showMeHighlightCircles('icon-'+objname,0);
	}
}

function unhighlight(evt) {
	evt = (evt) ? evt : window.event;
	var link = (evt.target) ? evt.target : evt.srcElement;
	if (link.nodeName.toLowerCase() !== 'li') { link = link.parentNode; }
	var objname = link.id.substring(5); // Remove 'item-' from the list's id
	stopHighlightCircles();
}

function focusBox() {
	if ( !document.getElementById ) { return; }
	var theField = document.getElementById('searchlocation');
	if (theField) { theField.focus(); }
}

/* Common to interactiveMap2.js */
function Browser() {
	var ua, s, i;

	this.isIE = false;
	this.isNS = false;
	this.version = null;

	ua = navigator.userAgent;

	s = "MSIE";
	if ((i = ua.indexOf(s)) >= 0) {
		this.isIE = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}

	s = "Netscape6/";
	if ((i = ua.indexOf(s)) >= 0) {
		this.isNS = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}

	// Treat any other "Gecko" browser as NS 6.1.

	s = "Gecko";
	if ((i = ua.indexOf(s)) >= 0) {
		this.isNS = true;
		this.version = 6.1;
		return;
	}
}
