var mapshown = new Array();
var gmap_options = new Array();
var deathList = new Array();
var module;
var map;
var mapType = G_NORMAL_MAP;
var currentMarker;
var iZIndex = 1000;

function defaultMapLoad(canvas) {

  var aLoadMap = new Array(); 
  aLoadMap['canvas'] = canvas;
  aLoad['center'] = new Array();
  aLoad['center']['latitude'] = String(array_sum(latitudes) / latitudes.length);  
  aLoad['center']['longitude'] = String(array_sum(longitudes) / longitudes.length); 
  
  populateMap(aLoad, aLoadMap);

}

var aLoad = new Array();
aLoad['bounds'] = new Array();
aLoad['points'] = new Array();
aLoad['details'] = new Array();
aLoad['error'] = '';
aLoad['events'] = new Array();
aLoad['HTML'] = new Array();
var iLoad = 0;
var latitudes = new Array();
var longitudes = new Array();

function createDefaultArrays(id, latitude, longitude, listing, address, city, postcode, url, image, premium) {
  latitudes[iLoad] = latitude;
  longitudes[iLoad] = longitude;
  var aLatLong = Array();
  aLatLong['latitude'] = latitudes[iLoad];
  aLatLong['longitude'] = longitudes[iLoad];
  aLoad['bounds'][iLoad] = new Array();
  aLoad['points'][iLoad] = new Array();
  aLoad['bounds'][iLoad] = aLatLong;
  aLoad['points'][iLoad] = aLatLong;
  aLoad['details'][iLoad] = new Array();
  aLoad['details'][iLoad]['id'] = id;
  aLoad['details'][iLoad]['name'] = listing;
  aLoad['details'][iLoad]['address'] = address;
  aLoad['details'][iLoad]['city'] = city;
  aLoad['details'][iLoad]['postcode'] = postcode;
  aLoad['details'][iLoad]['href'] = url;
  aLoad['details'][iLoad]['premium'] = premium;
  aLoad['details'][iLoad]['img'] = image;
  iLoad = 1+iLoad;
}

function loadExtraDefault(totMatches, matches) {
  var aExtra = new Array();
  aExtra['totMatches'] = totMatches;
  aExtra['matches'] = matches;
  aLoad['extra'] = aExtra;
}

function mapView() {
	// Show large map and small list. Hide small map and large list.
	if (document.getElementById('map_view_div')) {
		document.getElementById('map_view_div').style.display = 'block'
	}
	if (document.getElementById('list_view_div')) {
		document.getElementById('list_view_div').style.display = 'none'
	}
	if (document.getElementById('googlemap_block')) {
		document.getElementById('googlemap_block').style.display = 'none'
	}
	if (document.getElementById('listings_block')) {
		document.getElementById('listings_block').style.display = 'block'
	}
	kjax('setSession',{viewMode: 'map'},'fail','fail');
}

function listView() {
	// Show small map and large list. Hide large map and small list.
	gmap_zoom = undefined;
	gmap_options['minLat'] = 0;
	gmap_options['minLong'] = 0;
	gmap_options['maxLat'] = 0;	
	gmap_options['maxLong'] = 0;
	gmap_options['centerLat'] = 0;
	gmap_options['centerLong'] = 0;

	if (document.getElementById('map_view_div')) {
		document.getElementById('map_view_div').style.display = 'none'
	}
	if (document.getElementById('list_view_div')) {
		document.getElementById('list_view_div').style.display = 'block'
	}
	if (document.getElementById('googlemap_block')) {
		document.getElementById('googlemap_block').style.display = 'block'
	}
	if (document.getElementById('listings_block')) {
		document.getElementById('listings_block').style.display = 'none'
	}
	kjax('setSession',{viewMode: 'list'},'fail','fail');
}

function toggleDisplay() {
	var id;
	var display;
	for (var i = 0; i < arguments.length; i++) {
		id = arguments[i];
		display = document.getElementById(id).style.display;
		if (display == 'none') {
			document.getElementById(id).style.display = '';
		} else {
			document.getElementById(id).style.display = 'none';
		}
	}
}

function populateMap(array,map_details) {
	// Not strictly populating the map, but first let's clear out the explanatory list.
	var ul = document.getElementById('smallList');
	if (ul) {
		clearList(ul);
	}
	if (GBrowserIsCompatible() && document.getElementById(map_details['canvas'])) {
		var point;
		var marker;
		var id;
		map = new GMap2(document.getElementById(map_details['canvas']));
        map.setMapType(mapType);
		map.setCenter(new GLatLng(array['center']['latitude'],array['center']['longitude']), 13);
		var bounds = map.getBounds();
		var greenIcon = new GIcon(G_DEFAULT_ICON);
		greenIcon.image = '';
		greenIcon.shadow = '';
		greenIcon.shadowSize = new GSize(0,0);
		greenIcon.iconSize = new GSize(23,23);
		greenIcon.iconAnchor = new GPoint(10,18);

		var markers = [];
		var clusterStyles = [];
        if(map_details['canvas'] == 'large_canvas') iGridSize = 20;
        else                                        iGridSize = 8;
		var clusterOptions = {gridSize:iGridSize, styles:[{height:23, width:23,opt_anchor:[5,],url:'/_images/maps-pin-off.png'}]};
		for (var ele in array['points']) {
			if (ul) {
				var li = document.createElement('li');

                strLIStyle = 'listing_without_pic';
                strTopSeparator = "<div class='li_separator'></div>";
                if(array['details'][ele]['premium'] == 1) {
                  strLIStyle = 'listing_without_pic premium';
                  strTopSeparator = "";
                }

				li.innerHTML = strTopSeparator
                    + "<div class='listing_with_pic_div' onmouseover='mouseOverListResult(\""+array['details'][ele]['id']+"\");' onmouseout='mouseOutListResult(\""+array['details'][ele]['id']+"\");'>"
					+ "<span class='"+module+"_light feed_title' style=''>"
					+ "<a href='"+array['details'][ele]['href']+"' class='"+module+"_dark'>"+array['details'][ele]['name']+"</a>"
					+ "</span><br />\n</div>";
                li.setAttribute('class',strLIStyle);
                li.setAttribute('className',strLIStyle);
				ul.appendChild(li);
			}
			if (array['points'][ele]['latitude'] != 0 || array['points'][ele]['longitude'] != 0) {
				point = new GLatLng(array['points'][ele]['latitude'], array['points'][ele]['longitude']);
				marker = new GMarker(point, { icon:greenIcon, draggable: array['points'][ele]['draggable'], hide:true});
				markers.push([marker,array['details'][ele]]);
			}
		}

		if (array['bounds'] == undefined || array['bounds'].length == 0) {
			array['bounds'] = array['points'];
		}

		for (var ele in array['bounds']) {
			point = new GLatLng(array['bounds'][ele]['latitude'], array['bounds'][ele]['longitude']);
			bounds.extend(point);
		}
		if (array['details']['zoom']) {
			map.setZoom(array['details']['zoom'] * 1);
		} else {
			var zoom = map.getBoundsZoomLevel(bounds);
			map.setZoom(zoom);
			gmap_options['zoom'] = zoom;
		}
		var markerCluster = new MarkerClusterer(map, markers, clusterOptions, map_details['canvas']);	
		map.setUIToDefault();
		map.disableScrollWheelZoom();
         hMapMove =  GEvent.addListener(map,'moveend',function() {mapMoved(map,map_details); });
        if(map_details['canvas'] != 'large_canvas') {
          GEvent.removeListener(hMapMove);
        }
//		Zooming appears to trigger moveend anyway.
//		GEvent.addListener(map,'zoomend',function() {mapMoved(map,map_details); });
		bounds = String(bounds).replace(/[()\s]/g,'').split(',');
		var center = String(map.getCenter()).replace(/[()\s]/g,'').split(',');
		gmap_options['minLat'] = bounds[0];
		gmap_options['minLong'] = bounds[1];
		gmap_options['maxLat'] = bounds[2];	
		gmap_options['maxLong'] = bounds[3];
		gmap_options['centerLat'] = center[0];
		gmap_options['centerLong'] = center[1];
		if (map_details['canvas'] == 'large_canvas') {
			document.getElementById('resultMatches').innerHTML = array['extra']['matches'];
			document.getElementById('resultTotMatches').innerHTML = array['extra']['totMatches'];
			document.getElementById('resultNumbers').style.display = 'inline';
			setTimeout("document.getElementById('mapOverlay_" + map_details['canvas']+"').style.display = 'none'",500);
		}
	}
}

function mapMoved(map,map_details) {
	var bounds = map.getBounds();
	bounds = String(bounds).replace(/[()\s]/g,'').split(',');
	var center = String(map.getCenter()).replace(/[()\s]/g,'').split(',');
	gmap_options['zoom'] = map.getZoom();
	gmap_options['minLat'] = bounds[0];
	gmap_options['minLong'] = bounds[1];
	gmap_options['maxLat'] = bounds[2];	
	gmap_options['maxLong'] = bounds[3];
	gmap_options['centerLat'] = center[0];
	gmap_options['centerLong'] = center[1];
	getListings(map_details['canvas']);
}

function makeInfoBoxContainer(id) {
	var element = document.getElementById(id)
	if (element) {
		element.parentNode.removeChild(element);
	}

	if (document.getElementById(id) == null) {
		var containerdiv = document.createElement('div');
		containerdiv.setAttribute('id',id);
		containerdiv.setAttribute('class',module + ' var_infobox infoBoxContainer');
		containerdiv.setAttribute('className',module + ' var_infobox infoBoxContainer');
        containerdiv.setAttribute('name','infoContainer');
		containerdiv.style.borderBottom = '1px gray solid';
        containerdiv.style.backgroundColor = '#ffffff';
		containerdiv.onmouseover = function() { stopDeathCount(id); };
		containerdiv.onmouseout = function() { startDeathCount(id); };
		document.body.appendChild(containerdiv);
	}
}

function clearInfoBoxContainers(id) {
    id = 'infobox_container_' + id;
    var element = document.getElementById(id)
        if (element) {
        element.parentNode.removeChild(element);
    }
}

function makeInfoBox(array,marker,container,display) {
	// Take the information in array to build an info box, return the new div's id.
	// firstly check thast the box doesn't already exist!
	if(!array) {return;}
	var id = 'infobox_' + array['id'];
	var element = document.getElementById(id)
	if (element) {
		element.parentNode.removeChild(element);
	}
	var active = (document.getElementById(container).childNodes.length == 0?'active':'inactive');

	if (document.getElementById(id) == null) {
		var containerdiv = document.createElement('div');
		containerdiv.setAttribute('id',id);
		containerdiv.setAttribute('class', module);// + ' var_thin');
		containerdiv.setAttribute('className', module);// + ' var_thin');
		containerdiv.style.border = '1px gray solid';
		containerdiv.style.borderBottom = 'none';
		containerdiv.style.marginTop = '0';

		var headerdiv = document.createElement('div');
		headerdiv.setAttribute('class','block_top ' + active);
		headerdiv.setAttribute('className','block_top ' + active);
		headerdiv.onclick = function() { slidedown(id + '_contents',container); };

		var plusLink = document.createElement('div');
		plusLink.setAttribute('class','plusLink');
		plusLink.setAttribute('className','plusLink');
		plusLink.innerHTML="+";
		headerdiv.appendChild(plusLink);

		var headertitle = document.createElement('div');
        headertitle.setAttribute('class','infobox_header');
        headertitle.setAttribute('className','infobox_header');
		headertitle.innerHTML = array['name'];
		headerdiv.appendChild(headertitle);
		containerdiv.appendChild(headerdiv);

		var infodiv = document.createElement('div');

		infodiv.setAttribute('id',id + '_contents');
        if(array['premium'] == "1") {
            infodiv.setAttribute('class', 'premiumMap');
            infodiv.setAttribute('className', 'premiumMap');
        }
		if (display) {
			infodiv.style.display = 'block';
			downs[container] = id + '_contents';
		} else {
			infodiv.style.display = 'none';
		}
		infodiv.style.oferflow = 'hidden';
		infodiv.style.height = '80px';
        if(array['premium'] != "1") {
          infodiv.style.backgroundColor = '#FFFFFF';
          infodiv.style.backgroundImage = 'url(./_images/block_bg.gif)';
          infodiv.style.backgroundRepeat = 'repeat-x';
        }
		infodiv.style.margin = 0;
		infodiv.style.padding = '7px 0 0 0';

		var imagediv = document.createElement('div');
		imagediv.setAttribute('class','feed_image_div infobox_image_div');
		imagediv.setAttribute('className','feed_image_div infobox_image_div');
		imagediv.style.marginLeft = '8px';

		var pic = document.createElement('img');
		pic.setAttribute('src',array['img']);
		pic.setAttribute('alt',array['name']);
		pic.setAttribute('title',array['name']);
		pic.setAttribute('class','feed_image infobox_image');
		pic.setAttribute('className','feed_image infobox_image');
//		pic.style.height = '84px'; // Messes up ie.
		imagediv.appendChild(pic);
		infodiv.appendChild(imagediv);

		var infospan = document.createElement('span');
		var html = '';
//		if (array['name']) {
//			html += array['name'] + "<br />\n";
//		}
		if (array['address']) {
			html += array['address'] + "<br />\n";
		}
        if (array['city'] && array['premium'] == 1) {
            html += array['city'] + "<br />\n";
        }
		if (array['postcode']) {
			html += "("+array['postcode'] + ")<br />\n";
		}
		infospan.innerHTML = html;
        infospan.setAttribute('class', 'infobox_body');
        infospan.setAttribute('className', 'infobox_body');
		if (array['href']) {
			var moreLink = document.createElement('a');
			moreLink.setAttribute("href", array['href']);

			var linkImg = document.createElement('img');
			linkImg.setAttribute('src','_images/view-full-listing-off.gif');
			linkImg.setAttribute('alt','Full Listing');
			linkImg.setAttribute('title','Full Listing');
			linkImg.style.paddingTop = '5px';
			linkImg.onmouseover = function() {this.setAttribute('src','_images/view-full-listing-on.gif'); };
			linkImg.onmouseout = function() {this.setAttribute('src','_images/view-full-listing-off.gif'); };

			moreLink.appendChild(linkImg);
			infospan.appendChild(moreLink);
		}

		infodiv.appendChild(infospan);


		var reviewdiv = document.createElement('div');
		reviewdiv.style.clear = 'left';

		if (array['class']) {
			var starpic =  document.createElement('img');
			starpic.setAttribute('src','_images/' + array['class'] + 'star.png');
		}

		if (array['numrevues']) {
			var reviewspan = document.createElement('span');
			reviewspan.innerHTML = 'Rating ' + array['score'] + ' (' + array['numrevues'] + ' reviews)';
			reviewdiv.appendChild(reviewspan);
		}
		infodiv.appendChild(reviewdiv);
        containerdiv.setAttribute('name', 'infoBox');
		containerdiv.appendChild(infodiv);
		document.getElementById(container).appendChild(containerdiv);
	}
}

function toggleInfoBox(box_id,marker) {
	if (document.getElementById(box_id).style.display == 'none') {
		showInfoBox(box_id,marker);
	} else {
		hideInfoBox(box_id,marker);
	}
}

function showInfoBox(box_id,marker,map) {
	if (!showBusiness) {
		currentMarker = marker;
		activateImage(marker);
		var box = document.getElementById(box_id);
		var offsets = getOffsetsFor(marker,box,map);
		box.style.top = offsets[1] + 'px';
		box.style.left = offsets[0] + 'px';
		box.style.visibility = 'visible';
        
        image_replace();
	}
}

function hideInfoBox(box_id,marker) {
	if (deathList[box_id]) {
		deactivateImage(marker);
		document.getElementById(box_id).style.visibility = 'hidden';	
//		marker.setImage('_images/maps-pin-off.png');
	}
}

function startDeathCount(box_id,marker) {
	deathList[box_id] = 1;
	setTimeout(function() { hideInfoBox(box_id,marker); },100);
}

function stopDeathCount(box_id) {
	deathList[box_id] = 0;
}

function activateImage(marker) {
	if (!marker) {marker = currentMarker;}
	var image = marker.style.backgroundImage;
    //console.log(marker.parentNode.innerHTML);
	marker.style.backgroundImage = 'url(/_images/maps-pin-on.png)';
}

function deactivateImage(marker) {
	if (!marker) {marker = currentMarker;}
	var image = marker.style.backgroundImage;
	marker.style.backgroundImage = 'url(/_images/maps-pin-off.png)';
}

function getOffsetsFor(ele,div,map) {
	var xPos;
	var yPos;
	var image;
	var leftAdjust = 2;
 	var rightAdjust = 24;
	var topAdjust = -6;
	var ele_loc = getXY(ele);
	var cont = map.getContainer();
	var cont_loc = getXY(cont);
	var div_dim = getDim(div);
	var cont_dim = getDim(cont);	// If the element would go off the right hand side place it on the left instead.
	if (ele_loc[0] + div_dim[0] + rightAdjust > cont_loc[0] + cont_dim[0]) {
		xPos = ele_loc[0] + leftAdjust - div_dim[0];
		image = '/_images/maps-pin-on.png';
	} else {
		xPos = ele_loc[0] + rightAdjust;
		image = '/_images/maps-pin-on.png';
	}
	// If the element would  go off the bottom of the map, move it up.
	//if (ele_loc[1] + div_dim[1] + topAdjust> cont_loc[1] + cont_dim[1]) {
	//	yPos = cont_loc[1] + cont_dim[1] - div_dim[1]; 
	//} else {
		yPos = ele_loc[1] + topAdjust;
	//}
	return [xPos,yPos,image];
}

function getXY(ele) {
	var xpx = 0;
	var ypx = 0;
	while( ele != null ) {
		ypx += ele.offsetTop;
		xpx += ele.offsetLeft;
		ele = ele.offsetParent;
	}
	return [xpx,ypx];
}

function getDim(ele) {
	return [ele.offsetWidth,ele.offsetHeight];
}


function centerMapFromInput(lat_id,long_id,canvas_id) {
	// Build the array
	array = new Array();
	array['points'] = new Array();
	array['points'][0] = new Array();
	array['events'] = new Array();
	array['events'][0] = new Array();
	mapDetails = new Array();
	array['points'][0]['latitude'] = document.getElementById(lat_id).value;
	array['points'][0]['longitude'] = document.getElementById(long_id).value;
	array['points'][0]['draggable'] = true;
	array['events'][0]['dragend'] =  'var ele = this.getLatLng(); document.getElementById("' + lat_id + '").value = ele.lat(); document.getElementById("' + long_id + '").value = ele.lng();';
	mapDetails['canvas'] = canvas_id;
	populateMap(array,mapDetails);
}

function post2geo(post_id, lat_id, long_id,canvas_id) {
	var postcode = document.getElementById(post_id).value;
	id_array = new Array();
	id_array['lat'] = lat_id;
	id_array['long'] = long_id;
	id_array['canvas'] = canvas_id;
	kjax('post2geo',postcode,'updateLatLong','updateLatLong',id_array);
}

function updateLatLong(response,id_array) {
	if (response['error']) {
		alert(response['error']);
	} else {
		var latbox = document.getElementById(id_array['lat']);
		var longbox = document.getElementById(id_array['long']);
		latbox.value = response['results']['Latitude'];
		longbox.value = response['results']['Longitude'];
		if (id_array['canvas'] != null) {
			centerMapFromInput(id_array['lat'], id_array['long'], id_array['canvas']);
		}
	}
}

function getListings(mapcanvas) {
	if (document.getElementById('mapOverlay_' + mapcanvas)) {
		document.getElementById('mapOverlay_' + mapcanvas).style.display = 'block';
	}

	mapshown[mapcanvas] = true;
	args = new Array();
	args['module'] = module;
	args['map_id'] = mapcanvas;
	args['extra'] = gmap_options;
    args['locationID'] = document.getElementById('locaid').value;
    args['typeID'] = document.getElementById('busyid').value;
    if(document.getElementById('keyword').className == 'suggestTextActive') args['phrase'] = document.getElementById('keyword').value;
	mapDetails = new Array();
	mapDetails['canvas'] = mapcanvas;
    if(map != undefined) {
      mapType = map.getCurrentMapType();
    }
	kjax('getListings',args,'populateMap','fail',mapDetails,mapcanvas);
}

function fail() {
}

function updateNumbers(number) {
	gmap_options['results'] = number;
	setTimeout('updateNumbersConfirm(' + number + ');',500);
}

function updateNumbersConfirm(number) {
	if (number == gmap_options['results']) {
		getListings('large_canvas');
	}
}

function clearList(list) {
	while(list.hasChildNodes()){
		list.removeChild(list.childNodes[0])
	}
}

function array_sum (array) {
    var key, sum = 0;
        // input sanitation
    if (typeof array !== 'object') {
        return null;
    }
        for (key in array) {
        //tester_print_r(typeof sum);
        sum += (array[key] * 1);
    }
     return sum;
}


function mouseOutListResult(id) {
  iBox = document.getElementById("infobox_"+id);
  iParent = iBox.parentNode.id;
  iParent = iParent.replace("infobox_container_",'');

  //mouseOutPointer("infobox_container_"+iParent, document.getElementById('marker_'+iParent));
  deactivateImage(document.getElementById('marker_'+iParent));
}

function mouseOverListResult(id) {
  iBox = document.getElementById("infobox_"+id);
  iParent = iBox.parentNode.id;
  iParent = iParent.replace("infobox_container_",'');
  //mouseOverPointer("infobox_container_"+iParent, document.getElementById('marker_'+iParent), map);
  //slidedown('infobox_'+id+ '_contents',"infobox_container_"+iParent);

  activateImage(document.getElementById('marker_'+iParent));
}

function mouseOverPointer(id, ele, map) {

    //div.style.backgroundImage = 'url("_images/maps-pin-on.png")';
    ele.style.zIndex = iZIndex;
    iZIndex++;
    stopDeathCount(id, ele);
    showInfoBox(id, ele, map);
    activateImage(document.getElementById(ele.id));
}

function mouseOutPointer(id, ele) {
    startDeathCount(id, ele);
}


function startDeathCountPin(box_id,marker) {
    deathList[box_id] = 1;
    setTimeout(function() { hideInfoBox(box_id,marker); deactivateImage(document.getElementById(marker.id)); },100);
}

function stopDeathCountPin(marker_id) {
    deathList[box_id] = 0;
}