var mapshown = new Array();
var gmap_options = new Array();
var deathList = new Array();
var module;
var map;
var aMarkers = new Array();
var aDetails = new Array();
var mapType = google.maps.MapTypeId.ROADMAP;
var currentMarker;
var iZIndex = 1000;

function defaultMapLoad(canvas, site_lat, site_long) {

  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); 
  if(aLoad['center']['latitude'] == 'NaN' || aLoad['center']['longitude'] == 'NaN' || typeof aLoad['center']['longitude'] == 'undefined' || typeof aLoad['center']['latitude'] == 'undefined' ) { 
      aLoad['center']['latitude'] = site_lat; 
      aLoad['center']['longitude'] = site_long; 
  }
  
  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) {
  
  var ul = document.getElementById('smallList');
  if (ul) {
      clearList(ul);
  }

  var latlng = new google.maps.LatLng(array['center']['latitude'], array['center']['longitude']);
  var myOptions = {
    zoom: 13,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    mapTypeControl: true,
    mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
    streetViewControl: false,
    scrollwheel:false
  };
  
  if(gmap_options['zoom'] && map_details['canvas'] == 'large_canvas') { myOptions.zoom = gmap_options['zoom']; }
  
  if(map_details['canvas'] == 'large_canvas') {
    myOptions.streetViewControl = true;
  }
  
  map = new google.maps.Map(document.getElementById(map_details['canvas']), myOptions);
  bounds = map.getBounds() || new google.maps.LatLngBounds();
  
    
  if(map_details['canvas'] == 'large_canvas') iGridSize = 20;
  else                                        iGridSize = 8;
  var clusterOptions = {gridSize:iGridSize, styles:[{height:23, width:23,anchor:[0,0],url:'/_images/maps-pin-off.png', textSize:0}]};
                                                   
  if(array.details.length > 0) {
    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) {
            addPointer(array['points'][ele]['latitude'], array['points'][ele]['longitude'],array['details'][ele]);
        }
    }
  }
  
  hMapMove =  google.maps.event.addDomListener(map,'dragend',function() {mapMoved(map,map_details); });
  if(map_details['canvas'] != 'large_canvas') {
    google.maps.event.removeListener(hMapMove);
  }
  
  if (array['bounds'] == undefined || array['bounds'].length == 0) {
      array['bounds'] = array['points'];
  }

  for (var ele in array['bounds']) {
      point = new google.maps.LatLng(array['bounds'][ele]['latitude'], array['bounds'][ele]['longitude']);
      bounds.extend(point);
  }
  
  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);
  }
  
  //map.fitBounds(bounds);
  setPointersAsClusters(map, clusterOptions);
}

function addPointer(lat,long, details) {
  var latlng = new google.maps.LatLng(lat, long);
  
  var markerIcon = new google.maps.MarkerImage('/_images/maps-pin-off.png');
  
  var marker = new google.maps.Marker({
    position: latlng,
    hide: true,
    icon:markerIcon
  });
  
  // To add the marker to the map, call setMap();
  marker.setMap(map);
  aMarkers.push(marker);
  aDetails.push(details);
}

function setPointersAsClusters(map, clusterOptions) {  
  var clusterOptionsToUse = clusterOptions || {gridSize:20, styles:[{height:23, width:23,anchor:[0,0],url:'/_images/maps-pin-off.png', textSize:0}]};
  var markerCluster = new MarkerClusterer(map, aMarkers, clusterOptionsToUse,aDetails);
}

function mapMoved(map,map_details) {
  
  // If there are any infoboxes, delete them.
  clearInfoBoxesFromContainer();
  
	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) {
    if(showBusiness) return;
	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.getElementById('infoBoxContainerDiv').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) {
    if(showBusiness) return;
	// 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 infobox_block_top ' + active);
		headerdiv.setAttribute('className','block_top infobox_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']);
            if(array['target']) { moreLink.setAttribute('target',array['target']); }

			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 clearInfoBoxesFromContainer() {
  
  infoBoxes = document.getElementById('infoBoxContainerDiv');
    
  if(infoBoxes != null && typeof infoBoxes != 'undefined' && infoBoxes.hasChildNodes())  {
      while(infoBoxes.childNodes.length >= 1) { infoBoxes.removeChild( infoBoxes.firstChild ); } 
  }
}

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);
    if(showBusiness) return;
		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.getDiv();
	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('cityID').value;
    args['typeID'] = document.getElementById('typeID').value;
    if(document.getElementById('keyword').className == 'suggestTextActive') args['phrase'] = document.getElementById('keyword').value;
	mapDetails = new Array();
	mapDetails['canvas'] = mapcanvas;
    if(map != undefined) {
      mapType = map.getMapTypeId();
    }
	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) {
    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;
}
