// GOOGLE AJAX SEARCH FUNCTIONS...
var coreSearch;

function SolutionLoad() {
	externalLinks();
	var controlRoot = document.getElementById("searchControl");

	// create the search control
	coreSearch = new GSearchControl();
	coreSearch.setLinkTarget(GSearch.LINK_TARGET_SELF);
	coreSearch.setResultSetSize(GSearch.LARGE_RESULTSET);

	// prep for decoupled search form
	var searchFormElement = document.getElementById("searchform");
	var drawOptions = new GdrawOptions();
	drawOptions.setSearchFormRoot(searchFormElement);
	drawOptions.setDrawMode(GSearchControl.DRAW_MODE_TABBED);

	var searcher = new GwebSearch();
	searcher.setSiteRestriction("http://www.what-to-do.org/");
	searcher.setUserDefinedLabel("What To Do");
	coreSearch.addSearcher(searcher);

	searcher = new GwebSearch();
	searcher.setUserDefinedLabel("The Web");
	coreSearch.addSearcher(searcher);

	coreSearch.draw(controlRoot, drawOptions);
	coreSearch.setSearchCompleteCallback(this, searchComplete);

	sf = new GSearchForm(true, searchFormElement);
	sf.setOnSubmitCallback(this, searchSubmit);
	sf.setOnClearCallback(this, clearForm)
}

searchSubmit = function(form) {
	if (form.input.value) {
		coreSearch.execute(form.input.value);
	}
	return false;
}


searchComplete = function(sc, searcher) {
//	reDrawAllShadows();
}

clearForm = function(sc, searcher) {
	coreSearch.clearAllResults()
//	reDrawAllShadows();
	return false;
}
 

registerLoadHandler(SolutionLoad);

function registerLoadHandler(handler) {
	var node = window;
	if (node.addEventListener) {
		node.addEventListener("load", handler, false);
	} else if (node.attachEvent) {
		node.attachEvent("onload", handler);
	} else {
		node['onload'] = handler;
	}
	return true;
}


function getStyleObject(objectId) {
	// cross-browser function to get an object's style object given its
	if(document.getElementById && document.getElementById(objectId)) {
	// W3C DOM
		return document.getElementById(objectId).style;
	} else if (document.all && document.all(objectId)) {
	// MSIE 4 DOM
		return document.all(objectId).style;
	} else if (document.layers && document.layers[objectId]) {
	// NN 4 DOM.. note: this won't find nested layers
		return document.layers[objectId];
	} else {
		return false;
	}
} // getStyleObject

// SITE SPECIFIC FUNCTIONS...
function setRefCheck() {
	var designBy = document.getElementById('designBy');
	var refCheck = document.getElementById('refCheck');
	designBy.value = refCheck.value;
}

// GOOGLE MAP FUNCTIONS...

function loadMap() {
	if (document.getElementById('map'))
	{
		if (document.getElementById('latitude') && document.getElementById('longitude'))
		{
			if (GBrowserIsCompatible()) {
				var icon = new GIcon();
				icon.image = "/images/mappointer.png";
				icon.shadow = "/images/mappointershadow.png";
				icon.iconSize = new GSize(29, 36);
				icon.shadowSize = new GSize(60, 36);
				icon.iconAnchor = new GPoint(14, 36);
				icon.infoWindowAnchor = new GPoint(37, 41);
				
				
				var map = new GMap2(document.getElementById("map"));
				map.addControl(new GSmallMapControl());
				map.setCenter(new GLatLng(document.getElementById('latitude').value, document.getElementById('longitude').value), 13);

				var marker = new GMarker(map.getCenter(), icon);
				map.addOverlay(marker);


				GEvent.addListener(marker, "click", function() {
					map.setCenter(new GLatLng(document.getElementById('latitude').value,  document.getElementById('longitude').value), (map.getZoom()+1))
				});
			}
		}
	}
}

var map;
var xAdjustment = 5;
var yAdjustment = 50;
var defaultZoom = 13;
var baseLat;
var baseLng;
var bounds;
var defaultBounds;
var mapMoveHandler = false;
var showDetails = false;
var isMapType = false;

function loadMainMap() {
	if (document.getElementById('map'))
	{
		if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById("map"));
			map.addControl(new GSmallMapControl());
			map.setCenter(new GLatLng(0,0),0);

			bounds = new GLatLngBounds();

			for (i=0; i<attractions.length; i++)
			{
				createMarker(i)
			}

			map.setZoom(map.getBoundsZoomLevel(bounds));
			map.setCenter(bounds.getCenter());
			defaultBounds = bounds;

			mapMoveHandler = GEvent.addListener(map, "moveend", function() {
				updateAttractions();
			});
		}
	}
}

function loadHotelsMap() {
	if (document.getElementById('map'))
	{
		if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById("map"));
			map.addControl(new GSmallMapControl());
			map.setCenter(new GLatLng(0,0),0);

			bounds = new GLatLngBounds();

			for (i=0; i<properties.length; i++)
			{
				createHotelMarker(i)
			}

			map.setZoom(map.getBoundsZoomLevel(bounds));
			map.setCenter(bounds.getCenter());
			defaultBounds = bounds;

			mapMoveHandler = GEvent.addListener(map, "moveend", function() {
				updateAttractions();
			});
		}
	}
}

function loadEmptyMap(latitude, longitude) {
	if (latitude==0 && longitude==0)
	{
		latitude=55;
		longitude=-5;
		defaultZoom=5;
	};
	if (document.getElementById('map'))
	{
		if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById("map"));
			map.addControl(new GSmallMapControl());
			map.setCenter(new GLatLng(latitude, longitude), defaultZoom);
			bounds = map.getBounds();
			defaultBounds = bounds;

			mapMoveHandler = GEvent.addListener(map, "moveend", function() {
				updateAttractions();
			});
			updateAttractions();
		}
	}
}

function loadAttractionMap(latitude, longitude) {
	if (latitude==0 && longitude==0)
	{
		latitude=55;
		longitude=-5;
		defaultZoom=5;
	};
	if (document.getElementById('map'))
	{
		if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById("map"));
			map.addControl(new GSmallMapControl());
			map.setCenter(new GLatLng(latitude, longitude), defaultZoom);
			bounds = map.getBounds();
			defaultBounds = bounds;
			simpleMarker();
		}
	}
}

function simpleMarker()
{
	var point = new GLatLng(attraction[1], attraction[2]);
	bounds.extend(point);

	var icon = new GIcon();
	var imageType = attraction[5];
	if (imageType=="") imageType = "historic";
	icon.image = '/images/icons/'+imageType+'_small.png';
	icon.iconSize = new GSize(25, 25);
	icon.iconAnchor = new GPoint(12, 12);

	var opts = { 
	  "icon": icon,
	  "clickable": false
	};
	var marker = new LabeledMarker(point, opts);

	map.addOverlay(marker);
}

function createMarker(arrayId)
{
	var point = new GLatLng(attractions[arrayId][1], attractions[arrayId][2]);
	bounds.extend(point);

	var icon = new GIcon();
	var imageType = attractions[arrayId][5];
	if (imageType=="") imageType = "historic";
	icon.image = '/images/icons/'+imageType+'_wide.png';
	icon.iconSize = new GSize(41, 24);
	icon.iconAnchor = new GPoint(20, 12);
	icon.infoWindowAnchor = new GPoint(25, 7);

	opts = { 
	  "icon": icon,
	  "clickable": true,
	  "labelText": (attractions[arrayId][0]),
	  "labelOffset": new GSize(0, -8)
	};
	var marker = new LabeledMarker(point, opts);

	GEvent.addListener(marker, "click", function() {
		window.location=attractions[arrayId][4];
	});

	GEvent.addListener(marker, "mouseover", function() {
		displayLabel (arrayId);
	});

	GEvent.addListener(marker, "mouseout", function() {
		hideLabel(arrayId);
	});

	map.addOverlay(marker);
}


function createHotelMarker(arrayId)
{
	var property = properties[arrayId];
	var point = new GLatLng(property.latitude, property.longitude);
	bounds.extend(point);

	var icon = new GIcon();
	var imageType = property.propertyType.propertyTypeName ;
	if (imageType=="") imageType = "historic";
	icon.image = '/images/icons/'+imageType+'.png';
	icon.iconSize = new GSize(41, 24);
	icon.iconAnchor = new GPoint(20, 12);
	icon.infoWindowAnchor = new GPoint(25, 7);

	opts = { 
	  "icon": icon,
	  "clickable": true,
	  "labelText": (property.position),
	  "labelOffset": new GSize(0, -8)
	};
	var marker = new LabeledMarker(point, opts);

	GEvent.addListener(marker, "click", function() {
		window.location=property.localUrl;
	});

	GEvent.addListener(marker, "mouseover", function() {
		displayLabel (arrayId);
	});

	GEvent.addListener(marker, "mouseout", function() {
		hideLabel(arrayId);
	});

	map.addOverlay(marker);
}

function displayLabel(arrayId)
{
	var attractionElement = document.getElementById("attraction_number_"+(attractions[arrayId][0]));
	attractionElement.style.backgroundColor = '#F1E7B1';
	var aTag = attractionElement.getElementsByTagName('a').item(0)
	aTag.style.color = '#ba500c';
}


function hideLabel(arrayId)
{
	var attractionElement = document.getElementById("attraction_number_"+(attractions[arrayId][0]));
	attractionElement.style.backgroundColor = '';
	var aTag = attractionElement.getElementsByTagName('a').item(0)
	aTag.style.color = '';
}

function resetMap()
{
	var addHandler = false;
	if (mapMoveHandler)
	{
		addHandler = true;
		GEvent.removeListener(mapMoveHandler);
	}
	map.setZoom(map.getBoundsZoomLevel(defaultBounds));
	map.setCenter(defaultBounds.getCenter());
	if (addHandler)
	{
		updateAttractions();
		mapMoveHandler = GEvent.addListener(map, "moveend", function() {
			updateAttractions();
		});
	}
}

function updateAttractionTypes(typeId)
{
	
	var color='';
	var backgroundPosition='';
	if (attractionTypes[typeId]=='N')
	{
		attractionTypes[typeId]='Y';
		color = '#494949';
		backgroundPosition = 'right -254px';
	} else {
		attractionTypes[typeId]='N';
		color = '#cccccc';
		backgroundPosition = 'right -79px';
	}
	setBackground(typeId, color, backgroundPosition);
	if (isMapType) updateAttractions();
}

function setBackground(typeId, color, backgroundPosition){
	var the_style = getStyleObject('categorylist'+typeId);
	var a_style = getStyleObject('categorylist'+typeId+"_atag");
	var span_style = getStyleObject('checkbox_span_'+typeId);
	if (span_style)
	{
//		the_style.backgroundColor = backgroundColor;
//		a_style.backgroundImage = backgroundImage;
		span_style.color = color;
		span_style.backgroundPosition = backgroundPosition;
	}
}

function checkAttractionTypes(typeValue){
	var color='#cccccc';
	var	backgroundPosition = 'right -79px';

	if (typeValue=='Y')
	{
		color='#494949';
		backgroundPosition = 'right -254px';
	}
	for (var i=0; i<=categoryCount; i++)
	{
		attractionTypes[i]= typeValue;
		setBackground(i, color, backgroundPosition);
	}
	if (isMapType) updateAttractions();
}

function setCategories(){
	for (var i=1; i<=categoryCount; i++)
	{
		var categoryElement = document.getElementById('category_'+(i));
		if (attractionTypes[i]=="Y") categoryElement.value = "Y";
		else categoryElement.value = "N";
	}
	document.attractionForm.submit();
}

function updateAttractions()
{
	if (showDetails)
	{
		$("#attraction_details").hide();
		showDetails = false;
	}
	map.clearOverlays();
	displayAttractions();
}

function displayAttractions(){
	var count=0;
	var categorysUrl = '';
	for (var i=0; i<=categoryCount; i++)
	{
		if (attractionTypes[i]=='Y')
		{
			categorysUrl = categorysUrl+"&category["+count+"]="+i;
			count++;
		}
	}
	if (count>0)
	{
		bounds = map.getBounds();
		var sw = bounds.getSouthWest();
		var ne = bounds.getNorthEast();
		var currentTime = new Date();
		var qs = "action=search_map&swlat="+sw.lat()+"&swlng="+sw.lng()+"&nelat="+ne.lat()+"&nelng="+ne.lng()+categorysUrl+"&baseLat="+baseLat+"&baseLng="+baseLng+"&clean="+currentTime.getTime();
		ajaxRun(url, handleHttpResponse, "GET", qs, false, true);
	}
}
var url = "/xml/destinations/destinationlist.php"; // The server-side script
function handleHttpResponse(httpObject) {   
	if (httpObject.readyState == 4) {
		if(httpObject.status==200) {
			var mapList = document.getElementById("map-list");
			var html = "";
			var zoomLevel = map.getZoom();
			var center = map.getCenter();
			var xmldoc = httpObject.responseXML;
			var search_node = xmldoc.getElementsByTagName('search').item(0);
			var attractionList_node = search_node.getElementsByTagName('attractionList').item(0);
			var attractionList = attractionList_node.getElementsByTagName('attractionextended');
			attractions =  new Array();
			for (var i = 0; i < attractionList.length; i++) {
				var currentAttraction = attractionList[i];

				attraction = new Array();
				var attractionId = currentAttraction.getElementsByTagName('attractionId').item(0).childNodes[0].nodeValue;
				attraction[0] = (i+1);
				attraction[1] = currentAttraction.getElementsByTagName('latitude').item(1).childNodes[0].nodeValue;
				attraction[2] = currentAttraction.getElementsByTagName('longitude').item(1).childNodes[0].nodeValue;
				attraction[3] = currentAttraction.getElementsByTagName('attractionName').item(0).childNodes[0].nodeValue;
				attraction[4] = '/attractions/index.php?attraction='+attractionId;
				var category = currentAttraction.getElementsByTagName('category').item(0);
				attraction[5] = category.getElementsByTagName('title').item(0).childNodes[0].nodeValue;
				var imageType = attraction[5];
				if (imageType=="") imageType = "historic";
				var categoryName = category.getElementsByTagName('name').item(0).childNodes[0].nodeValue;
				attractions[i] = attraction;
				createMarker(i);

				var address = currentAttraction.getElementsByTagName('address').item(0);
				var addressHtml = "";
				if (address.getElementsByTagName('address1').item(0).childNodes[0]) addressHtml += address.getElementsByTagName('address1').item(0).childNodes[0].nodeValue+", ";
				if (address.getElementsByTagName('address2').item(0).childNodes[0]) addressHtml += address.getElementsByTagName('address2').item(0).childNodes[0].nodeValue+", ";
				if (address.getElementsByTagName('address3').item(0).childNodes[0]) addressHtml += address.getElementsByTagName('address3').item(0).childNodes[0].nodeValue+", ";
				if (address.getElementsByTagName('town').item(0).childNodes[0]) addressHtml += address.getElementsByTagName('town').item(0).childNodes[0].nodeValue+", ";
				if (address.getElementsByTagName('county').item(0).childNodes[0]) addressHtml += address.getElementsByTagName('county').item(0).childNodes[0].nodeValue+", ";
				if (address.getElementsByTagName('postcode').item(0).childNodes[0]) addressHtml += address.getElementsByTagName('postcode').item(0).childNodes[0].nodeValue;

				var description = "";
				if (currentAttraction.getElementsByTagName('description').item(0).childNodes[0]){
					description = currentAttraction.getElementsByTagName('description').item(0).childNodes[0].nodeValue;
					if (description.length>200) description = description.substring(0,200)+"...";
				}
				//html += "<li id=\"attraction_number_"+(i+1)+"\"><a href=\""+attraction[4]+"\">"+(i+1)+". "+attraction[3]+"</a></li>";
				html += "<div id=\"attraction_number_"+(i+1)+"\" class=\"map_search_item\">";
				html += "	<div class=\"attraction_header\">";
				html += "		<img style=\"float: right;\" alt=\""+categoryName+"\" src=\"/images/icons/"+imageType+"_small.png\"/>";
				html += "		<div class=\"link\">";
				html += "			"+(i+1)+". <a title=\"more information about "+attraction[3]+"\" href=\"/attractions/index.php?attraction="+attractionId+"\">"+attraction[3]+"</a>";
				html += "		</div>";
				html += "	</div>";
				html += "	<div class=\"map_address\">"+addressHtml;
				html += "	</div>";
				if (description.length>0) html += "	<p>"+description+"</p>";
				html += "</div>";
			}
			mapList.innerHTML = html;
			var maxItems = document.getElementById("maxItems");
			if (attractions.length>=50)
			{
				var resultCount = attractionList_node.getElementsByTagName('result_count').item(0).childNodes[0].nodeValue;
				maxItems.innerHTML = "SHOWING 50 OF "+resultCount+" ATTRACTIONS. <br/>PLEASE ZOOM IN FOR MORE ATTRACTION DETAILS";
				maxItems.style.visibility = "visible";
			}
			else {
				maxItems.innerHTML = "";
				maxItems.style.visibility = "hidden";
			}
		}
	}
}

function traverseDOM(x, arr) {
        arr.push("<DL><DT>")
        arr.push(x);
        arr.push(x.nodeName);
        arr.push(" = "+x.nodeValue);
        for (var i = 0; i < x.childNodes.length; i++) {
                arr.push("<DD>");
                traverseDOM(x.childNodes[i], arr);
        }
        arr.push("</DL>");
        return arr;
}

function printDOM(x) {
        arr = Array();
        arr = traverseDOM(x, arr);
        for (var i = 0; i < arr.length; i++) {
                document.write(arr[i]);
        }
}

function locateOnMap(){
	var address1 = document.getElementById('address_address1').value;
	var address2 = document.getElementById('address_address2').value;
	var town = document.getElementById('address_town').value;
	var postcode = document.getElementById('address_postcode').value;
	var country = "UK";
	var latitude = document.getElementById('latitude').value;
	var longitude = document.getElementById('longitude').value;
	window.open('/mapdisplay.php?latitude='+latitude+'&longitude='+longitude+'&address1='+address1+'&address2='+address2+'&town='+town+'&postcode='+postcode+'&country='+country,'mapwindow','width=550,height=280,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,copyhistory=no,resizable=no');
}

function copyToClipboard(text) {
	if (window.clipboardData) {
		window.clipboardData.setData("Text",text);
	} else {
		var copytext="Text to copy"; 
		var str = Components.classes["@mozilla.org/supports-string;1"]. createInstance(Components.interfaces.nsISupportsString); 
		if (!str) return false; 
		str.data = copytext; 
		var trans = Components.classes["@mozilla.org/widget/transferable;1"]. createInstance(Components.interfaces.nsITransferable); 
		if (!trans) return false; 
		trans.addDataFlavor("text/unicode"); 
		trans.setTransferData("text/unicode",str,copytext.length * 2); 
		var clipid = Components.interfaces.nsIClipboard; 
		var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(clipid); 
		if (!clip) return false; 
		clip.setData(trans,null,clipid.kGlobalClipboard); 
	}
}

function loadThumbnails()
{
	var lastThumbnailDone = "";

	$(".thumbnails").mouseover(function(){
		$(this).animate({opacity: 1.0}, 200);
	});

	$(".thumbnails").mouseout(function(){
		$(this).animate({opacity: 0.6}, 200);
	});


	$(".thumbnails").animate({opacity: 0.6}, 1);
	$('#attraction_images a').lightBox({fixedNavigation:true});
}

function externalLinks() {
	if (!document.getElementsByTagName) return;
	var anchors = document.getElementsByTagName("a");
	for (var i=0; i<anchors .length; i++) {
		var anchor = anchors[i];
		if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external") {
			anchor.target = "_blank";
			anchor.title = (anchor.title != "") ? anchor.title+" (opens in a new window) ": "opens in a new window";
			anchor.className = (anchor.className != '') ? anchor.className+' external' : 'external';
			var track = anchor.href;
			track = track.replace('http://','');
			anchor.onclick = function() { 
				pageTracker._trackPageview('/outgoing/'+track);
			}
		}
	}
}

function getURLVar(urlVarName) {
	//divide the URL in half at the '?'
	var urlHalves = String(document.location).split('?');
	var urlVarValue = '';
	if(urlHalves[1]){
		//load all the name/value pairs into an array
		var urlVars = urlHalves[1].split('&');
		//loop over the list, and find the specified url variable
		for(i=0; i<=(urlVars.length); i++){
			if(urlVars[i]){
				//load the name/value pair into an array
				var urlVarPair = urlVars[i].split('=');
				if (urlVarPair[0] && urlVarPair[0] == urlVarName) {
					//I found a variable that matches, load it's value into the return variable
					urlVarValue = urlVarPair[1];
				}
			}
		}
	}
	return urlVarValue;   
}