//TODO: define default center variable.....
 var iDEFAULTLAT = -37.3341;
 var iDEFAULTLNG = 143.5210;
 var iDEFAULTZOOM = 12;

//Mp Initialisation
 function load() {
	if (GBrowserIsCompatible() && ($A(document.getElementsByClassName('dirNode')).length || document.location.search.indexOf('dirNode') != -1)) {
				//$("gm_map").style.display = "none";	
				// Basic Map Start
				map = new GMap2(document.getElementById("gm_map"));	
				
				map.addControl(new GSmallMapControl());
				
				map.setCenter(new GLatLng(iDEFAULTLAT, iDEFAULTLNG ), iDEFAULTZOOM);


   
			}
	
	addCatTreeNavs();
	toggleAll(false);
	endGetCatList();
}
					
//window.onload = load; ////// moved to lightwindow event
window.onunload=GUnload;
			
function getCatList (e, index) {
	//get businesses for a category
	url = e.href + ''; 
	pars = 'ajax=true';
	pars += '&index=' + (index == null ? '0': index);
	
	startLoad();
	var myAjax = new Ajax.Updater('businesslist', url,{method: 'post', parameters: pars, onComplete: endGetCatList});
	
	return false;
}

function debug(req){
   alert(req.responseText);
}
function getBusiness (e){

	if (typeof e == 'string' && e == ''){
		alert ('Please select an option from the drop down list');
		return false;
	}

	 url = (typeof e == 'string') ?  document.location.toString() + '&id=businesssearchresult&dirNode=' + e : e.href;
	document.location = url ; 
//	url = e.href;
	pars = 'ajax=true';
	startLoad();
	var myAjax = new Ajax.Updater('businesslist', url,{method: 'post', parameters: pars, onComplete: endGetCatList});
	
	return false;
}

//TODO: set the minimum zoom level if only one marker is present
var iMinZoom = 15;

var myMarkers = [];
var myDescriptions = [];

function endGetCatList (req){

   //debug(req);
   
	map.clearOverlays();
	
	aMarker = $A(document.getElementsByClassName('dirNode'));

	myMarkers = [];
	myDescriptions = [];
	
	var bounds = new GLatLngBounds();
	var bValidMarker = false;	
	//ADD Markers
	aMarker.each(function(e,i){
						  
	cur_lat = $(e.value + '_lat').value;
	cur_lng = $(e.value + '_lng').value;
	
	
	if ($(e.value + '_lat').value != '' && $(e.value + '_lat').value != 0){
	bValidMarker = true;
      point = new GLatLng($(e.value + '_lat').value,$(e.value + '_lng').value);
      bounds.extend(point);
       html = "<div id='bubble'><strong class=\"red\">" + $(e.value + '_name').innerHTML + "</strong><br />";
	if ($(e.value + '_address')){
		html += "<strong>Address: </strong>" + $(e.value + '_address').innerHTML + '<br />';
	} 
      if($(e.value + '_phone')){
         html += "<strong>Phone: </strong>" + $(e.value + '_phone').innerHTML + '<br />';
      }
	  
	 if($(e.value + '_email')){
         html += "<strong>Email: </strong> <a href=\"mailto:" + $(e.value + '_desc').innerHTML +"\">" + $(e.value + '_desc').innerHTML + "</a><br />";
     }
	 
	  if($(e.value + '_more')){
         html += $(e.value + '_more').innerHTML;
      }
	  
	  //get direction Code ///////	 
	  
	  html += "<br /><form name='findRoot'><input id='getAdress' name='getAdress' type='text' style='width:175px;' value='Get Directions Enter your adress' onClick=\"value=''\"> ";
	  html += "<input id = 'current_address' name = 'current_address' type= 'hidden' value = '" + cur_lat + " "  + cur_lng + "'/>"; 
	  html += "<input name='getDirections' type='button' value='GO' onClick=\"showAddress($('getAdress').value , $('current_address').value)\"> </form>";



      var marker = addMarker(point, html);
		map.addOverlay(marker);
		myMarkers[e.value] = marker;
		myDescriptions[e.value] = html; 
		
		endLoad();
	}});
	
	//Add Polygons
	aPolygon = $A(document.getElementsByClassName('gm_polygon'));

	if (aPolygon.length){
		add_polygons(aPolygon , map);
	}

	    // ===== determine the zoom level from the bounds =====
	
	if (bValidMarker){
	 map.setZoom((map.getBoundsZoomLevel(bounds) > iMinZoom ? iMinZoom : map.getBoundsZoomLevel(bounds)));
	
	 // ===== determine the centre from the bounds ======
	 var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
	 var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;
	 map.setCenter(new GLatLng(clat,clng));
	//$('gm_map').style.display = 'block';
	} else {
	//	map.setCenter(new GLatLng(iDEFAULTLAT, iDEFAULTLNG ), iDEFAULTZOOM);
	}
}

function addMarker (point, html) {
   var marker = new GMarker(point);
   
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
	});
	
	GEvent.addListener(marker, 'mouseover', function(){
				//$(marker.sID).style.border = '1px solid black';
	});
			
	GEvent.addListener(marker, 'mouseout', function(){
		//$(marker.sID).style.border = '1px none';
	});
	
	return marker;
}

function catSearch(keyword) {
	if (keyword.length > 2) {
		
		if($('inpFilterType').value == 'category'){
		
		var aCats = document.getElementsByClassName('catItem');
		
		var sCatResults = '';
		
		for (var i = 0; i < aCats.length; i++){
			
			var index = aCats[i].innerHTML.toLowerCase().indexOf(keyword.toLowerCase());
			
			if ( index != -1) {
			
				// TODO: Get a bread crumb script going by doing some kind of while aCats.parentNode thingy...
				
				sCatResults +=	'<a href = "' + aCats[i].href + '" onclick = "getCatList(this);return false" >' + (aCats[i].innerHTML) + '</a><br/>';		
			}
			
		}
		
		$('catResults').innerHTML = (sCatResults == ''? 'No Results for ' + keyword.bold() + '. Please check your spelling.' : sCatResults);
		
		} else {
		   //Business Ajax search call 
			url = 'http://' + document.location.host + document.location.pathname; 
			pars = 'action=BusinessFrontEnd&handle=searchBusiness&keyword='+ keyword + '&ajax=true';
			startLoad();
			var myAjax = new Ajax.Updater('catResults', url, {method: 'get', parameters: pars});
		}
	}
}


function showInfo(dirNode){

   if(myMarkers[dirNode]){
      	   myMarkers[dirNode].openInfoWindowHtml(myDescriptions[dirNode]);
   }
}

function refreshMap(){
		//clear the overlays
		map.clearOverlays();

  		// ===== Start with an empty GLatLngBounds object =====     
      var bounds = new GLatLngBounds();
   			
   			 for (var i = 0; i < aMarkers.length; i++) {
            // obtain the attribues of each marker
			      var lat = parseFloat(markers[i].getAttribute("lat"));
	  		 	   var lng = parseFloat(markers[i].getAttribute("lng"));
	  			   var point = new GLatLng(lat,lng);
			      var html = markers[i].getAttribute("html");
			      var label = markers[i].getAttribute("label");
		         // create the marker
		         var marker = createMarker(point,label,html);
				if (lat != 0)
		         map.addOverlay(marker);
		         // ==== Each time a point is found, extent the bounds ato include it =====
				if (lat != 0)
		         bounds.extend(point);
		
		          // ===== determine the zoom level from the bounds =====
		          map.setZoom(map.getBoundsZoomLevel(bounds));
		
		          // ===== determine the centre from the bounds ======
		          var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
		          var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;
		          map.setCenter(new GLatLng(clat,clng));
            
          }   
      
}
    

    
    
    ///////////////////////////////////////////////////////////////////
    
    
    function clearMarkers() {
        if (!gmarkers) {
                mrkrCount = 0;
                return;
        }

       	// clear all existing markers
       	// (currently theres a bug in clearOverlays that criples the info
			//window
       	// but removing them one-by-one is OK) (see mike williams tutorial
			//site)
			
        for (i=0; i<gmarkers.length; i++) {
                logger("removing marker: " + i + " of " + gmarkers.length);

                // if we assigned an event, remove it specifically
                if(gmarkers[i].handle != null)
                        GEvent.removeListener (gmarkers[i].handle);

                // if I created a marker, remove it
                if(gmarkers[i].marker != null)
                        googleMap.removeOverlay (gmarkers[i].marker);

                // remove the Object itself
                delete gmarkers[i].marker;
        }

        for (i=0; i<gmarkers.length; i++) {
                delete gmarkers[0];
        }

        // empty the array and reset the counter
        mrkrCount = 0;
        gmarkers = [];

	} 
	
	
	
	//////////////////////////////////////////////////////////CODE GRABBED FROM 
	
	 function loadMarkers(xmlResp) {
        logger('loadMarkers hit by Ajax callback');
        updateRefreshCntr();
        clearMarkers();

        if(mapBounds)
                delete mapBounds;

        mapBounds = new GLatLngBounds();

        var xmlDoc = xmlResp.responseXML;
        var domMarkers = xmlDoc.documentElement.getElementsByTagName("marker");

        for (var i = 0; i < domMarkers.length; i++) {
                logger('processing marker ' + i + ' of ' + domMarkers.length);
                var lat  = domMarkers[i].getAttribute("lat");
                var lng  = domMarkers[i].getAttribute("lng");
                var html = domMarkers[i].getAttribute("html");
                logger('   lat: ' + lat + '; lng: ' + lng + '; html: ' + html);

                var point = new GLatLng(parseFloat(lat), parseFloat(lng));
				if (lat != 0 ){
                mapBounds.extend(point);

                logger('   creating marker and overlay');
				
                mrk = createMarker(point, html, null);
                if(mrk != null)
                        googleMap.addOverlay(mrk);

                logger('   performing cleanup');
				}
                delete point;
                lat = lng = html = mrk = point = null;
        }

        domMarkers = null;
        xmlDoc = null;

        if(bResizeAfterReload) {
                bResizeAfterReload = false;
                recenterMap();
                resetMarkerInterval();
        }

}

function createMarker(point, html, reason) {
        // eliminate leaks using this code
        var marker = null;
        var handle = null;

        gmarkers[mrkrCount] = new Object();
        gmarkers[mrkrCount].marker = marker;
        gmarkers[mrkrCount].handle = handle;
        mrkrCount++;

        handle = null;

        return marker;
}

function addCatTreeNavs (){
   aUL = document.getElementsByClassName('expand');
   
   for (i = 0 ; i < aUL.length ; i++){
   
      e = document.createElement('span');
      e.onclick = toggleExpand;
      //e.href = '#';
      e.className = 'expander';
      e.innerHTML = 'exp';
      //aUL[i].parentNode.insertBefore(aUL[i].parentNode.firstChild);
      aUL[i].parentNode.insertBefore(e, aUL[i].parentNode.firstChild);
   }
   
}

function toggleExpand(){
   e = this.parentNode.getElementsByTagName('ul')[0]; 
   e.style.display = ( e.style.display == 'block' ? 'none ': 'block');
   return false;
}

function toggleAll (bExp){
   aExp = $A(document.getElementsByClassName('expand'));
   aExp.each(function(e,i){
      e.style.display = (bExp ? 'block' : 'none');
   });
}

/*
 * Ajax Load States: TODO: add any 'loading' information here !!!'
 */
function startLoad(){
   ;
}

function endLoad(){
   ;
}


var t;
function top() {
if (document.body.scrollTop>10 || document.documentElement.scrollTop>10){
	
window.scrollBy(0,-20);
t=setTimeout('top()',10);
}
else clearTimeout(t);
}

function getTarriff(e) {
	//get businesses for a category
	oForm = e.parentNode.parentNode.parentNode.parentNode.parentNode;
	url = oForm.action; 
	pars = Form.serialize(oForm) + '&tajax=true';
	
	startLoad();
	var myAjax = new Ajax.Updater('acc', url,{method: 'post', parameters: pars, 
						onComplete: function (){
							document.location = '#CostStructure';
						//	loadStart();
						//	loadEnd();
						//	loadBrowse();
						}
						});
	
	return false;
}

function add_polygons(aPolygon, myMap){

        for (var i = 0 ; i < aPolygon.length ; i++){
                oPolygon = aPolygon[i];

                aPoints = oPolygon.getElementsByTagName('div');

                points = new Array();

                for(var j = 0 ; j < aPoints.length; j++){
                        pointdiv = aPoints[j];

                        myPoint =  pointdiv.getElementsByTagName('input');
			vlat = myPoint[0].value;
                        vlng = myPoint[1].value;

                        point = new GLatLng(vlat,vlng);
                        points[points.length]  = point;

                }

                myMap.addOverlay( new GPolygon(points, '#00BB00', 0, 0,'#00BB00', 0.50));
        }

}

var geocoder = new GClientGeocoder();
var directions;
var directionsPanel;

function showAddress(address, myDest) {

  geocoder.getLatLng(
    address,
  
  function(point) {
      if (!point) {
        alert(address + " not found");
      } else {
        myLat = point.lat();
        myLng = point.lng();
        map.setCenter(point, 13);
        var marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(address + '<br/>');
		myPrefix = aMarker[0].value;
		//myDest = $(myPrefix + '_lat').value + ' ' + $(myPrefix + '_lng').value;
		directionsPanel = document.getElementById("gm_directions");
		directions = new GDirections(map, directionsPanel);
	 	my_result = directions.load(myLat + " " + myLng  + " to " + myDest);

		$('gm_map').style.width = '450px';
		$('gm_directions').style.display = 'block';
      }
    }
  );
}
function checkAddress(){
	//var address = $F('search_address');
	var address = '1 Sturt St. Ballarat 3350 Australia ';
	showAddress(address);
}
function showmap(){
	myLightWindow.activateWindow( {href: '#', loadingAnimation: false, type: 'map', title: 'Interactive Map', height: '500px', width: '760px'});
	load();
	}


