Application = (function() {
  var map, maptimizeMap, waiting_content, emptyMarker, search;

  // Load google map API
  function init(center, zoom, id) {
				registerUI();
				google.load("maps", "2");
				google.setOnLoadCallback(function() {
  			    //waitingContent = $('#waiting_content');
				$(document).ready(function(){		
					initCallback(center, zoom, id);	
				});
    });		
  }

  function afterUpdateElement(input, element) {
    var lat = element.readAttribute("lat"), lng = element.readAttribute("lng"), id = element.id,
        ll = new GLatLng(lat, lng);
		openPopup(ll, id);
  }

  function openPopup(ll, id) {
    map.setCenter(ll, 15);

    if (emptyMarker)
      emptyMarker.setLatLng(ll);
    else {
      emptyMarker = new GMarker(ll, {icon: new GIcon({image:           "/com/en/maps/empty.gif",
                                                     iconSize:         new GSize(1, 1),
                                                     iconAnchor:       new GPoint(1, 1),
                                                     infoWindowAnchor: new GPoint(1, 1)})});
      map.addOverlay(emptyMarker);
    }
    requestContent(emptyMarker, id);
  }

  function registerUI() {
 	/* jquery Version */
	search = $('#search');
	if (search){
		autoFill(search, "Enter Search Keyword");  
		search.keypress(function(event){
			setTimeout(updateMap, 100);
		});
	}

  }

	function autoFill(id, v){
		$(id).css({ color: "#b2adad" }).attr({ value: v }).focus(function(){
			if($(this).val()==v){
				$(this).val("").css({ color: "#333" });
			}
		}).blur(function(){
			if($(this).val()==""){
				$(this).css({ color: "#b2adad" }).val(v);
			}
		});

	}

  function buildCondition() {

    var conditions = Maptimize.Condition();
    //conditions.appendAnd('addresses = "tridonic"');
	
	conditions.appendAnd('map = "'+mapID+'"');	 
    conditions.appendAnd('lang = "'+Language+'"');	

    if (search.val() && search.val() != "Enter Search Keyword") {
     conditions.appendAnd('name LIKE "' + search.val().toLowerCase() + '"'); 
    }        

    return conditions;
  }

  function updateMap() {
    var condition = buildCondition();
    maptimizeMap.setCondition(condition);
    maptimizeMap.refresh();
  }

  function initCallback(center, zoom, id) {
    if (GBrowserIsCompatible()) {
      // Create a new google map
      //map = new GMap2($('#map')); //-> does not work!!!
	  var $map = document.getElementById('map');
	  map = new GMap2($map);
      window.map = map;
      
      // Set default center/zoom if not specified
      center = center || [25, 0];
      var mapCenter = new GLatLng(center[0], center[1])
      if (typeof zoom == 'undefined') {
        zoom    = map.getBoundsZoomLevel(new GLatLngBounds(new GLatLng(-50,-90), new GLatLng(50,90)));
        map.setCenter(mapCenter, zoom);
      }
      else {
        openPopup(new GLatLng(center[0], center[1]), id);
      }

      // Add controls
      map.setUIToDefault();
      map.addMapType(G_PHYSICAL_MAP);
      map.setMapType(G_PHYSICAL_MAP);
      map.disableScrollWheelZoom();
      
      // Attach maptimize plugin and set callbacks
      maptimizeMap = new Maptimize.Map(map);
      
      GEvent.addListener(maptimizeMap, 'beforeRefresh', function() {
      });
      
      GEvent.addListener(maptimizeMap, 'afterRefresh', function() {
        $('#counter').html(maptimizeMap.getTotalPointsCount() + " addresses on map.");
      });
      
      GEvent.addListener(maptimizeMap, 'markerClicked', function(marker) {
        marker.openPopup();
      });
      
      GEvent.addListener(maptimizeMap, 'clusterClicked', function(cluster) {
        cluster.openPopup();
      });
      updateMap();
      window.maptimizeMap = maptimizeMap;
    }
  }
  
  function reset() {
	var point; 
	// point assignment is abstracted from your zoom level logic 
	point = new google.maps.LatLng(25,0); 
 	map.setCenter(point, 2); 
	updateMap();
  }
  
  function clear() {
	  if (search.val() == "" || search.val() == "Enter Search Keyword"){
		//return;
	  }else{
		search.css({ color: "#b2adad" }).val("Enter Search Keyword");
	  }
	  reset();
	  return;
  }
  
  return {init: init,
          clear: clear,
		  reset:reset,
		  initCallback:initCallback}
})();


