var geocoder;				//Geocoder object to lookup addresses
var latLng;					//LatLng of geo point
var map;                  	//Map object
var markersArray = [];		//Markers array
var directionsDisplay;		//Directions
var debug = true;

var infowindow = new google.maps.InfoWindow({ 
		size: new google.maps.Size(150,50)
	});						//InfoWindow object

function initialize() {  

    var formObj = document.getElementById("searchForm");
    if (formObj == null) {
    	formObj = document.getElementById("directionsForm");
    }
    
    if (formObj.point.value == "") {
    	//show the entire country
    	latLng = new google.maps.LatLng(-27, 133);
    	map_zoom = 4;
    } else {
    	if (typeof map_zoom == 'undefined') {
    		latLng = new google.maps.LatLng(-27, 133);
			map_zoom = 4;
			//back button pressed, reset to defaults
			formObj.address.value = "";
			formObj.point.value = "";
			formObj.postcode.value = "";
    	} else {
			var location = formObj.point.value.split(",");
			//Set map centre to the search point
			latLng = new google.maps.LatLng(location[0], location[1]);
    	}
    }

	var myOptions = {
	    zoom: map_zoom,
	    center: latLng,
	    mapTypeId: google.maps.MapTypeId.ROADMAP,
	    mapTypeControl: false,
	    panControl: true,
	    panControlOptions: {
	        position: google.maps.ControlPosition.TOP_LEFT
	    },
	    zoomControl: true,
	    zoomControlOptions: {
	        style: google.maps.ZoomControlStyle.SMALL,
	        position: google.maps.ControlPosition.LEFT_CENTER
	    },
	    scaleControl: true,
	    scaleControlOptions: {
	        position: google.maps.ControlPosition.TOP_RIGHT
	    },
	    streetViewControl: false
	};

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    
    if (typeof locations != 'undefined') {
      //set up the info window
      for (var i = 0; i < locations.length; i++) {
        var details = locations[i].split("#");
        var point = new google.maps.LatLng(details[1], details[2]);
        
        var markerContent = '<div class="marker">';
        markerContent += '<b>'+ details[3]+'<\/b>';
        markerContent += '<div style="margin-top:5px;">' + details[0] + '<br \/>' + details[3] + ', ' + details[4] + ', ' + details[5];
        markerContent += '<\/div><\/div>';
              
        var marker = createMarker(point, markerContent, i);
        
      }
    }
    setTimeout('panMap()', 150);
    
/*
    if (typeof box != 'undefined') {
      //set up the info window
      for (var i = 0; i < box.length; i++) {
        var details = box[i].split("#");
        var point = new google.maps.LatLng(details[0], details[1]);

        var markerContent = '<div class="marker">';
        markerContent += '<b>Box point '+ i +'<\/b>';
        markerContent += '<\/div>';
              
        var marker = createMarker(point, markerContent, i);
        
      }
    }
*/

}

function panMap() {
    //check that all the markers appear in the window, if not zoom out until they do
    var markersInFrame = false;
    while (markersInFrame == false) {
      var zoomOut = false;
      var bounds = map.getBounds();
      var northEast = bounds.getNorthEast();
      var southWest = bounds.getSouthWest();
      for (var i = 0; i < markersArray.length; i++) {
        //alert ('NW: ' + northEast.lng() + ', ' + northEast.lat() + ' SE: ' + southWest.lng() + ', ' + southWest.lat() + ' Marker: '  + markersArray[i].getPosition().lng() + ', ' + markersArray[i].getPosition().lat());
        if (markersArray[i].getPosition().lng() > northEast.lng() || markersArray[i].getPosition().lat() > northEast.lat() || markersArray[i].getPosition().lng() < southWest.lng() || markersArray[i].getPosition().lat() < southWest.lat()) {
          zoomOut = true;
        }
      }
      if (zoomOut == true) {
        // change the zoom level
        map.setZoom(map.getZoom() - 1);
      
      } else {
        markersInFrame = true;
      }
    }
}

function createMarker(latlng, html, result) {
    var contentString = html;

    var image = new google.maps.MarkerImage('/jsp/jahia/templates/heatcraft/internet_templates/assets/img/marker-base2.gif',
              // This marker is 29 pixels wide by 29 pixels tall.
              new google.maps.Size(29, 29),
              // The origin for this image is 0,0.
              new google.maps.Point(0,0),
              // The anchor for this image is the base of the pointer at 0,29.
              new google.maps.Point(0, 29));

    var marker = new google.maps.Marker({
        position: latlng,
        map: map,
        icon: image,
        zIndex: Math.round(latlng.lat()*-100000)<<5
        });
    
    markersArray.push(marker);
    
    google.maps.event.addListener(marker, 'mouseover', function() {
        infowindow.setContent(contentString); 
        infowindow.open(map, marker);
    	});

    google.maps.event.addListener(marker, 'mouseout', function() {
        infowindow.close();
    	});

    google.maps.event.addListener(marker, 'click', function() {
        jQuery("#branches").accordion('activate', result);
        });

    jQuery(".hover").click(function(){
      var markerClicked = jQuery(this).attr('alt');
      if (markerClicked == result){
        map.panTo(latlng);
        infowindow.setContent(contentString); 
        infowindow.open(map, marker);
      }
    });
}

function verifySearch(formId) {

	if (currentSelection > -1) {
		//Enter was pressed in the result box - we don't want to submit the request yet
		currentSelection = -1;
		return;
	}
	var formObj = document.getElementById(formId);
	//check address meets criteria
	var address = formObj.address.value;
	if (address.length == 4 && isNumeric(address)){
		formObj.postcode.value = address;
	} else if (isNumeric(address.substring(address.length - 4, address.length))) {
		formObj.postcode.value = address.substring(address.length - 4, address.length);
	} else {
		formObj.postcode.value = "";
	}
	//geocode address
	geocodeLocation(formObj.address.value);
}

function geocodeLocation(address) {

    geocoder = new google.maps.Geocoder();
    
	var geocoderRequest = {
	    address: address,
	    region: 'AU'
	};
    
	geocoder.geocode( geocoderRequest, processResult);
    
}

function processResult(results, status) {
	
	if (status == google.maps.GeocoderStatus.OK) {

        var address = results[0].address_components;
        for (var i = 0; i < address.length; i++ ) {
            if (address[i].types[0] == 'country') {
                var country = (address[i].short_name);
            }
        }

        if (country == 'AU') {
        	var formObj = document.getElementById('searchForm');
        	// Store the resulting point in the form
        	formObj.point.value = results[0].geometry.location.lat() + "," + results[0].geometry.location.lng();
        	//alert (results[0].geometry.location.lat() + "," + results[0].geometry.location.lng());
        	
        	// Submit form with new point
        	formObj.submit();
		} else {
			alert("Please enter a valid suburb and state, or a postcode.");
		}
	} else {
		alert("Please enter a valid suburb and state, or a postcode.");
	}
}

var currentSelection

function isNumeric(value) {
  // checks for numeric value (note: not negatives or decimals since we're using this for postcodes)
  if (value == null || !value.toString().match(/^\d*$/)) return false;
  return true;
}


function loadDirections(idBranch) {

	var directionsService = new google.maps.DirectionsService();

	directionsDisplay = new google.maps.DirectionsRenderer();

	directionsDisplay.setMap(map);
	directionsDisplay.setPanel(document.getElementById("directions-panel"));

	var formObj = document.getElementById("directions-form_"+idBranch);

	var start = formObj.from.value;

	if (start == "") {
		alert("Please enter a street address and suburb.");
	    return;
	}
	var address = formObj.address.value;
	var suburb = formObj.suburb.value;
	var state = formObj.state.value;
	var postcode = formObj.postcode.value;
	var phone = formObj.phone.value;

	// Change the directions details to the branch selected
        
    var dirAddress = document.getElementById('dir-address');
    dirAddress.innerHTML = address + "<br />" + suburb + ", " + state + ", " + postcode;
    
    var dirPhone = document.getElementById('dir-phone');
    dirPhone.innerHTML = phone;
    
    var dirSuburb = document.getElementById('dir-suburb');
    dirSuburb.innerHTML = suburb;
	
    // Create the directions request
	var point = formObj.point.value;
	var details = point.split(",");
    var endPoint = new google.maps.LatLng(details[0], details[1]);
    
	var request = {
		origin: start, 
		destination: endPoint,
		region: 'AU',
		travelMode: google.maps.DirectionsTravelMode.DRIVING
	};

	directionsService.route(request, function(result, status) {
		if (status == google.maps.DirectionsStatus.OK) {

		    jQuery('#branches').hide();

		    jQuery('#directions').show();
		    jQuery('#directions-panel').show();
			directionsDisplay.setDirections(result);
			clearOverlays();
		} else {
			alert("The address could not be found. Please enter a street address and suburb then try again.");
		}
	});
}

function showResults() {

    jQuery('#directions').hide();
    
    var dirPanel = document.getElementById('directions-panel');
    dirPanel.innerHTML = "";
    
    jQuery('#directions-panel').hide();
    jQuery('#branches').show();

	directionsDisplay.setMap(null);
	showOverlays();
	
}

function printPage() {
	infowindow.close();
	window.print();
}

function clearOverlays() {
	if (markersArray) {
		for (i in markersArray) {
			markersArray[i].setMap(null);
		}
	}
}

function showOverlays() {
	if (markersArray) {
		for (i in markersArray) {
			markersArray[i].setMap(map);
		}
	}
}
