var global = new Object();
global.geolocation = 0;
global.map = 0;
global.overlay = false;
global.count =0;
global.followMe = false;
global.onInit = function(){};
var MY_MAPTYPE_ID = 'gizzing';
var clickedMarkers = [];

var markerGroups = {
  "restaurant": [],
  "atractie": [],
  "bar": [],
  "hotel": [],
  "winkel": [],
  "horeca": [],
  "musea": [],
  "museum": [],
  "tanken": [],
  "tu":[],
  "nu":[],
  "oranje":[],
  "blauw":[],
  "vermeer":[],
  "mooiweerspelen":[],
  "mooiweerspelenvrijdag":[],
  "mooiweerspelenzaterdag":[],
  "mooiweerspelenzondag":[],
  "mooiweerspelenzaterdag2010":[],
  "mooiweerspelenzondag2010":[],
  "jazzfestivaldelftvrijdag":[],
  "jazzfestivaldelftzaterdag":[],
  "jazzfestivaldelftzondag":[],
  "delftbasiswandeling":[],
  "delftoranjelus":[],
  "delftgroenelus":[],
  "delftblauwelus":[],
  "wuc":[],
  "test":[],
  "testdelft":[],
  "eelco":[],
  "ferries":[],
  "delft":[],
  "nl":[],
  "jo":[],
  "nieuwkoopseplassen":[],
"geolivesnieuwkoopseplassen":[],
"zuidhollandnieuwkoopseplassen":[],
"nieuwkoopalgemeen":[],
"nieuwkoopseplaasenfiets":[],
"zhbtpoints":[],
"zevenhovenroute":[],
"coperoute":[],
"jaagpadroute":[],
"top":[],
"fietsverhuurdomgevingnieuwkoop":[],
"restauurantsgroenehart":[],
"museaomgevingnieuwkoop":[],
"attractiesomgevingnieuwkoop":[],
"bouwwerkenomgevingnieuwkoop":[],
"recreatietereinnenomgevingnieuwkoop":[],
"efteling":[],
"vvv":[],
"poi1":[],
"poi2":[],
"brug1":[],
"brug2":[],
"miljonairsfair":[],
"laurens":[]
  };
var overlayGroups = {
  "restaurant": [],
  "atractie": [],
  "bar": [],
  "hotel": [],
  "winkel": [],
  "horeca": [],
  "musea": [],
  "museum": [],
  "tanken": [],
  "tu":[],
  "nu":[],
  "oranje":[],
  "blauw":[],
  "vermeer":[],
  "mooiweerspelen":[],
  "mooiweerspelenvrijdag":[],
  "mooiweerspelenzaterdag":[],
  "mooiweerspelenzondag":[],
  "mooiweerspelenzaterdag2010":[],
  "mooiweerspelenzondag2010":[],
  "jazzfestivaldelftvrijdag":[],
  "jazzfestivaldelftzaterdag":[],
  "jazzfestivaldelftzondag":[],
  "delftbasiswandeling":[],
  "delftoranjelus":[],
  "delftgroenelus":[],
  "delftblauwelus":[],
  "wuc":[],
  "test":[],
  "testdelft":[],
  "eelco":[],
  "ferries":[],
  "delft":[],
  "nl":[],
  "jo":[],
  "nieuwkoopseplassen":[],
"geolivesnieuwkoopseplassen":[],
"zuidhollandnieuwkoopseplassen":[],
"nieuwkoopalgemeen":[],
"nieuwkoopseplaasenfiets":[],
"zhbtpoints":[],
"zevenhovenroute":[],
"coperoute":[],
"jaagpadroute":[],
"top":[],
"fietsverhuurdomgevingnieuwkoop":[],
"restauurantsgroenehart":[],
"museaomgevingnieuwkoop":[],
"attractiesomgevingnieuwkoop":[],
"bouwwerkenomgevingnieuwkoop":[],
"recreatietereinnenomgevingnieuwkoop":[],
"efteling":[],
"vvv":[],
"poi1":[],
"poi2":[],
"brug1":[],
"brug2":[],
"miljonairsfair":[],
"laurens":[]
  };

function setText(text) {
  var textBox = document.getElementById('textBox');
  textBox.style.display = '';
  textBox.style.top = '2px';
  textBox.innerHTML ='<div class="closeDiv" onclick="closeText();"><img src="/uploads/a6/0d/a60d352a55f3f20a3839296faa851987/round_red_close_button_30X30.png"  alt="close this frame" /></div>' + text
}

function closeText() {
  var textBox = document.getElementById('textBox');
  textBox.innerHTML = '';
  textBox.style.display = 'none';
}

function setList() {
	var targetDiv = document.getElementById('map');
	targetDiv.style.display = 'none';
	var targetDiv = document.getElementById('searchBox');
	targetDiv.style.display = '';
}

function setMap() {
	var targetDiv = document.getElementById('map');
	targetDiv.style.display = '';
	var targetDiv = document.getElementById('searchBox');
	targetDiv.style.display = 'none';
}

function setMyPos() {
  var latLng = global.myPosition.getPosition();
  global.map.setCenter(latLng);
  toggleMenu();
}

 // First, we have to load the APIs.
 google.load("maps", "3", {other_params:"sensor=true"});
 google.load("search", "1");

function setMapFrame(){
  if (!document.getElementById('border')){
    var map = document.getElementById('map');
    var textbox = document.getElementById('textBox');
    map.style.height = getHeight() + 'px';
//    textbox.style.height = (getHeight()-10) + 'px';
  } else {
    var map = document.getElementById('map');
    map.style.height = '480px';
var textbox = document.getElementById('textBox');
    textbox.style.height = '470px';
  }
}

function TopControl(controlDiv, map) {
}
function BottomControl(controlDiv, map) {
}
function SearchControl(controlDiv, map) {
}
function initialize() {
  //try to get myposition (first start in Delft, then try other stuff
  try {
    var LatLng = new google.maps.LatLng(beginLat,beginLon);
  } catch(e) {
    var LatLng = new google.maps.LatLng(52.013389,4.35889);
  }
  try {
    var zoomLevel = customZoom;
  } catch(e) {
    var zoomLevel = 12;
  }
 var stylez = [
    {
      featureType: "landscape",
      elementType: "geometry",
      stylers: [
        { hue: "#0000FF" },
        { saturation: 75 },
        { lightness: +50}
      ]
    }
  ];
  var mapOptions = {
       zoom: zoomLevel,
       center: LatLng,
       disableDefaultUI: true,
       mapTypeId: MY_MAPTYPE_ID,
       mapTypeControl: false,
       mapTypeControlOptions: {
        style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
        position: google.maps.ControlPosition.TOP_RIGHT,
		mapTypeIds: [google.maps.MapTypeId.ROADMAP, MY_MAPTYPE_ID]
       },
       navigationControl: true,
       navigationControlOptions: {
        style: google.maps.NavigationControlStyle.ANDROID,
        position: google.maps.ControlPosition.BOTTOM
       },
       scaleControl: false
   };
  var styledMapOptions = {
    name: "gizzing"
  };

  var gizzingMapType = new google.maps.StyledMapType(stylez, styledMapOptions);

  global.map = new google.maps.Map(document.getElementById('map'), mapOptions );

  global.map.mapTypes.set(MY_MAPTYPE_ID, gizzingMapType);

  //add bottom bar
  var bottomControlDiv = document.getElementById('bottombar');
  var myBottomControl = new BottomControl(bottomControlDiv);
  bottomControlDiv.index = 2;
  global.map.controls[google.maps.ControlPosition.BOTTOM_RIGHT].push(bottomControlDiv);
  //setMapIcons();
  global.lastIconImage = new google.maps.MarkerImage('/uploads/d6/b2/d6b249ed6b4a482966dd0ae4c2042945/gizzing.png',
          new google.maps.Size(32, 37),
          new google.maps.Point(0, 0),
          new google.maps.Point(16, 37)
    );
  blueIcon = new google.maps.MarkerImage('/media/images/markers/bluecirclemarker.png',
      // This marker is 16 pixels wide by 16 pixels tall.
      new google.maps.Size(31, 31),
      // The origin for this image is 0,0.
      new google.maps.Point(0,0),
      // The anchor for this image is the base of the flagpole at 8,8.
      new google.maps.Point(8, 8)
  );
  global.myPosition = new google.maps.Marker({
        position: LatLng,
        map: global.map,
        icon: blueIcon
    });
  doGeolocation();
  setInterval("checkPoint();", 10000);
  LoadMapSearchControl();
  setMapFrame();
  try {
	//customPolygon.setMap(global.map);
  } catch(e){
  };

  //window.onresize = setMapFrame;
  global.onInit();
}

google.setOnLoadCallback(initialize);

function doGeolocation() {
  // Try W3C Geolocation (Preferred)
  if(navigator.geolocation) {
    browserSupportFlag = true;
    navigator.geolocation.getCurrentPosition(positionSuccess, positionError,{enableHighAccuracy: true});
  // Try Google Gears Geolocation
  } else if (google.gears) {
    browserSupportFlag = true;
    var geo = google.gears.factory.create('beta.geolocation');
    geo.getCurrentPosition(positionSuccess, positionError);
  // Browser doesn't support Geolocation
  } else {
    positionError(-1);
  }
}

function positionError(err) {
  var msg;
  switch(err.code) {
      case err.UNKNOWN_ERROR:
        msg = "Unable to find your location";
        break;
      case err.PERMISSION_DENINED:
        msg = "Permissioned denied in finding your location";
        break;
      case err.POSITION_UNAVAILABLE:
        msg = "Your location is currently unknown";
        break;
      case err.BREAK:
        msg = "Attempt to find location took too long";
        break;
      default:
        msg = "Location detection not supported in browser";
  }
  //setText(msg);
}

function positionSuccess(position) {
  // Centre the map on the new location
  var coords = position.coords || position.coordinate || position;
  var latLng = new google.maps.LatLng(coords.latitude, coords.longitude);

  //place marker
  global.myPosition.setPosition(latLng);

  //if followme do setcenter
  var follow = 1;
  try {
    follow = followMe;
  } catch(e) {}
  if (follow ==1 ) {
    global.map.setCenter(latLng);
    try {
      global.searcher.setCenterPoint(latLng);
    } catch(e){};
    global.followMe = true;
    try {
      document.getElementById('waarbenik').innerHTML = '<input class="topbutton" type="button" value="Mijn huidige locatie" onclick="setMyPos();" title="Ga naar mijn huidige locatie" />';
    } catch(e){};
    try {
      document.getElementById('whereami').innerHTML = '<input class="topbutton" type="button" value="me" onclick="setMyPos();" title="Go back to my position" />';
    } catch(e){};
  }
}

function CheckPointSuccessCallback(p) {
  var lastMarker;
  var lastDelta = 10;
  var coords = p.coords || p.coordinate || p;
  var latLng = new google.maps.LatLng(coords.latitude, coords.longitude);
  global.myPosition.setPosition(latLng);
  xmlhttp=new XMLHttpRequest();
  xmlhttp.open("GET",'/logger?func=logTrackPoint;lat=' + latLng.lat() + ';lng=' + latLng.lng() ,false);
  xmlhttp.send();

  for (var markerGroupName in markerGroups) {
    var markerGroup = markerGroups[markerGroupName];
    for (var i = 0; i < markerGroup.length; i++) {
      var marker = markerGroup[i];
      if ((typeof(marker)!='undefined') && (typeof(marker)!='string') ){
        if (marker.getVisible()) {
          //check if in neighbourhood
          var point = marker.getPosition();
          var deltaLat = Math.abs(latLng.lat()-point.lat());
          var deltaLon = Math.abs(latLng.lng()-point.lng());
          var delta = Math.sqrt((deltaLat*deltaLat)+(deltaLon*deltaLon));
          if (delta < lastDelta){
            lastDelta = delta;
            lastMarker = marker;
          }
        }
      }
    }
  }
  if (lastDelta < 0.001) {
    if (isInArray(lastMarker, clickedMarkers)) {
      if (typeof(global.lastMarker)!='undefined') {
        global.lastMarker.setIcon(global.lastIcon);
      }
      clickedMarkers.push(lastMarker);
      google.maps.event.trigger(lastMarker,'click');
    }
  }
}

  function CheckPointErrorCallback(err) {
    var msg = 'Error retrieving your location: ' + err.message;
    //setText(msg);
  }

function checkPoint() {
try { var follow = followMe } catch(e) { var follow = global.followMe }

  if (follow) {
    try {
    navigator.geolocation.getCurrentPosition(CheckPointSuccessCallback, CheckPointErrorCallback,
            {enableHighAccuracy: true}
    );
//      global.geolocation.getCurrentPosition(CheckPointSuccessCallback,
//                                 CheckPointErrorCallback,
//                                 { enableHighAccuracy: true,
//                                   gearsRequestAddress: false });
    } catch(e) {
    }
  }
}

function addDataPoint(placemark,doc)
{
  var marker = global.geoXml.createMarker(placemark);
         google.maps.event.clearListeners(marker, 'click');
  google.maps.event.addListener(marker, 'click', function(){
  setText(		
				"<div class='buttons'>" +
				"<div class='nextButton'><input type='button' class='nextButton' value='>>' onclick='setNextMarker();'></div>"+
                "<div class='previousButton'><input type='button' class='previousButton' value='<<' onclick='setPreviousMarker();'></div>" +
                "</div>" +
				"<div class=\"markerTitle\">" +
				' ' + placemark.name +
				"</div>" +
				"<div class=\"markerDescription\">" +
				placemark.description +
				"</div>");
    if (typeof(global.lastMarker)!='undefined') {
      global.lastMarker.setIcon(global.lastIcon);
      global.lastMarker.setZIndex(1);
    }
    global.thisMarker = this;
    global.lastMarker = this;
    global.lastIcon = this.getIcon();
    this.setIcon(global.lastIconImage);
    this.setZIndex(10);
  });
  markerGroups[global.category.toLowerCase()].push(marker);
  marker.setVisible(true);
  return true;
}

function addOverlay(groundOverlay,doc)
{
  var overlay = global.geoXml.createOverlay(groundOverlay);
  overlayGroups[global.category.toLowerCase()].push(overlay);
}


function setPoi(category,categoryName,categoryType){
  global.category = category;
  document.getElementById(category+'_button').style.color = "#C8B482";
  if (markerGroups[category].length == 0) {
    if (global.map != false){
    blankMarker = new google.maps.MarkerImage('/uploads/d6/b2/d6b249ed6b4a482966dd0ae4c2042945/gizzing.png',
          new google.maps.Size(32, 37),
          new google.maps.Point(0, 0),
          new google.maps.Point(16, 37)
    );
    // Make the call to the server for KML data
      if (categoryType == 'gizzingKML') {
        global.geoXml = new geoXML3.parser({
            map: global.map,
            createMarker: addDataPoint,
            icon: blankMarker
        });
        global.geoXml.parse("/gizzing.kml?group="+category);
      } else if (categoryType == 'mws') {
        global.geoXml = new geoXML3.parser({
            map: global.map,
            createMarker: addDataPoint,
            icon: blankMarker
        });
        global.geoXml.parse("/gizzing-mws.kml/?group="+category);
      } else if (categoryType == 'festival') {
        global.geoXml = new geoXML3.parser({
            map: global.map,
            createMarker: addDataPoint,
            icon: blankMarker
        });
        global.geoXml.parse("/gizzing-festival.kml?group="+category);
      } else if (categoryType == 'festival2') {
        global.geoXml = new geoXML3.parser({
            map: global.map,
            createMarker: addDataPoint,
            icon: blankMarker
        });
        global.geoXml.parse("/gizzing-festival2.kml?group="+category);
      } else if (categoryType == 'route') {
        global.geoXml = new geoXML3.parser({
            map: global.map,
            createMarker: addDataPoint,
            createOverlay: addOverlay,
            icon: blankMarker
        });
        global.geoXml.parse("/gizzing-routes.kml?group="+category);
      } else if (categoryType == 'mygizzing') {
        global.geoXml = new geoXML3.parser({
            map: global.map,
            createMarker: addDataPoint,
            icon: 'http://google-maps-icons.googlecode.com/files/dog-leash.png'
        });
        global.geoXml.parse("/mygizzing.kml?group="+category);
      } else if (categoryType == 'mygizzing2') {
        global.geoXml = new geoXML3.parser({
            map: global.map,
            createMarker: addDataPoint
	    });
        global.geoXml.parse("/mygizzing2.kml?group="+category);
      } else {
        global.searcher.setCenterPoint(global.map.getCenter());
        global.searchControl.execute(category);
      }
    } else {
      alert('maps not defined');
    }
  } else {
    for (var i = 0; i < markerGroups[category].length; i++) {
      var marker = markerGroups[category][i];
      if (marker.getVisible() === false) {
        marker.setVisible(true);
        document.getElementById(category+'_button').style.color = "#C8B482";
      } else {
        marker.setVisible(false);
        document.getElementById(category+'_button').style.color = "";
      }
    }
    for (var i = 0; i < overlayGroups[category].length; i++) {
      var overlay = overlayGroups[category][i];
      if (overlay.percentOpacity_ === 0) {
        overlay.setOpacity(100);
      } else {
        overlay.setOpacity(0);
      }
    };
  }
  toggleMenu();
};

function LoadMapSearchControl() {
   // We'll wait to the end to actually initialize the map
   // So let's build the search control
   global.searchControl = new google.search.SearchControl();

   // Initialize a LocalSearch instance
   global.searcher = new google.search.LocalSearch(); // create the object
   global.searcher.setCenterPoint(global.map.getCenter()); // bind the searcher to the map

   // Create a SearcherOptions object to ensure we can see all results
   var options = new google.search.SearcherOptions(); // create the object
   options.setExpandMode(google.search.SearchControl.EXPAND_MODE_OPEN);

   // Add the searcher to the SearchControl
   global.searchControl.addSearcher(global.searcher , options);
   global.searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
   // And second, we need is a search complete callback!
   global.searchControl.setSearchCompleteCallback(global.searcher , function() {
     var results = global.searcher.results; // Grab the results array
     // We loop through to get the points
     for (var i = 0; i < results.length; i++) {
       var result = results[i]; // Get the specific result


       var markerLatLng = new google.maps.LatLng(parseFloat(result.lat),
                                                 parseFloat(result.lng));
       // Bind information for the infoWindow aka the map marker popup

       blankMarker = new google.maps.MarkerImage('/media/icons/'+global.category.toLowerCase()+'.png',
           new google.maps.Size(32, 37),
           new google.maps.Point(0,0),
           new google.maps.Point(16, 37)
       );
       var marker = new google.maps.Marker({
           position: markerLatLng,
           map: global.map,
           title: result.title,
           icon: blankMarker
       });
       google.maps.event.clearListeners(marker, 'click');
       google.maps.event.addListener(marker, 'click', function(){
               setText(this.content);
               });
	marker.content = 	
				"<div class=\"markerTitle\">" +
				' ' + result.title +
				"</div>" +
				"<div class=\"markerDescription\">" +
				result.html.innerHTML +
				"</div>" +
				"<div class=\"markerExtra\">" +
				"<a href='"+result.url+"'>Klik hier voor aanbiedingen</a>" +
				"</div>" ;
       markerGroups[global.category.toLowerCase()].push(marker);

     }

   });

   // Draw the control
   var controlContainer = document.getElementById('searchBox');
   global.searchControl.draw(controlContainer);
}

function setNextMarker() {
  for (var markerGroupName in markerGroups) {
    var markerGroup = markerGroups[markerGroupName];
    for (var i = 0; i < markerGroup.length; i++) {
      var marker = markerGroup[i];
      if (marker == global.thisMarker) {
        if (i < (markerGroup.length-1)) {
          previousMarker = markerGroup[i+1];
          google.maps.event.trigger(previousMarker,'click');
          break;
        } else {
          previousMarker = markerGroup[0];
          google.maps.event.trigger(previousMarker,'click');
          break;
        }
      }
    }
  }
}

function setPreviousMarker() {
  for (var markerGroupName in markerGroups) {
    var markerGroup = markerGroups[markerGroupName];
    for (var i = 0; i < markerGroup.length; i++) {
      var marker = markerGroup[i];
      if (marker == global.thisMarker) {
        if (i > 0) {
          previousMarker = markerGroup[i-1];
          google.maps.event.trigger(previousMarker,'click');
          break;
        } else {
          previousMarker = markerGroup[markerGroup.length-1];
          google.maps.event.trigger(previousMarker,'click');
          break;
        }
      }
    }
  }
}

function toggleMenu() {
    var el = document.getElementById('mobilemenu');
    if (typeof(el)!='undefined'){
      if (el.style.position=='absolute') {
        el.style.position='';
        el.style.top = '-2000px';
      } else {
        el.style.position='absolute';
        el.style.top = '2px';
      }
    }
}

function toggleGizzingInfo() {
    var el = document.getElementById('GizzingInfo');
    if (el.style.position=='absolute') {
      el.style.position='';
      el.style.top = '-2000px';
    } else {
      el.style.position='absolute';
      el.style.top = '2px';
    }
}


function findPosX(obj)
  {
    var curleft = 0;
    if(obj.offsetParent)
        while(1)
        {
          curleft += obj.offsetLeft;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
  }

function findPosY(obj)
  {
    var curtop = 0;
    if(obj.offsetParent)
        while(1)
        {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
  }

function getHeight() {
  var myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myHeight = document.body.clientHeight;
  }
  return myHeight;
}

function getWidth() {
  var myWidth = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
  }
  return myWidth;
}



function isInArray(needle, arrayHaystack){
  for (x=0; x < arrayHaystack.length; x++)
    if (arrayHaystack[x] == needle)
      return true;
  return false;
}


function var_dump(obj) {
   if(typeof obj == "object") {
      return "Type: "+typeof(obj)+((obj.constructor) ? "\nConstructor: "+obj.constructor : "")+"\nValue: " + obj;
   } else {
      return "Type: "+typeof(obj)+"\nValue: "+obj;
   }
}//end function var_dump


/* updateOrientation checks the current orientation, sets the body's class attribute to portrait, landscapeLeft, or landscapeRight,
   and displays a descriptive message on "Handling iPhone or iPod touch Orientation Events".  */
function updateOrientation()
{
	/*window.orientation returns a value that indicates whether iPhone is in portrait mode, landscape mode with the screen turned to the
	  left, or landscape mode with the screen turned to the right. */
	var orientation=window.orientation;
	document.getElementById("viewport").setAttribute('content','initial-scale=1.0, user-scalable=no');
	switch(orientation)
	{
	
		case 0:
				/* If in portrait mode, sets the body's class attribute to portrait. Consequently, all style definitions matching the body[class="portrait"] declaration */
				break;	
				
		case 90:
				/* If in landscape mode with the screen turned to the left, sets the body's class attribute to landscapeLeft. In this case, all style definitions matching the
				   body[class="landscapeLeft"] declaration in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
				break;
		
		case -90:	
				/* If in landscape mode with the screen turned to the right, sets the body's class attribute to landscapeRight. Here, all style definitions matching the
				   body[class="landscapeRight"] declaration in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
				break;
	}

}

// Point to the updateOrientation function when iPhone switches between portrait and landscape modes.
window.onorientationchange=updateOrientation;
