var map;
var infoWindow;
var markerList = [];

function load() {
   map = new google.maps.Map(document.getElementById("map_container"), {
      center: new google.maps.LatLng(51, 7.5),
      zoom: 5,
      mapTypeId: 'roadmap',
      mapTypeControl: false
   });
   infoWindow = new google.maps.InfoWindow({
      pixelOffset: new google.maps.Size( 0, 20 )
   });
}

function searchLocations() {
   var countrySelectValue = document.getElementById('countrySelect').value;
   var countrySelectValueLong = isoCountryArray[countrySelectValue];
   if( countrySelectValue.indexOf( "XY" ) >= 0 || countrySelectValue.indexOf( "XY" ) >= 0 ){
      countrySelectValueLong = "";
   }
   var address = document.getElementById('addressInput').value + ' ' + countrySelectValueLong;
   if( document.getElementById('addressInput').value == '' ) {
      document.getElementById('addressNotFoundContainer').style.display = 'block';
      document.getElementById('partnerResultList').style.display = 'none';
   }
   else {
      var geocoder = new google.maps.Geocoder();
      geocoder.geocode({address: address}, function(results, status) {
       if (status == google.maps.GeocoderStatus.OK) {
         searchLocationsNear(results[0].geometry.location);
         document.getElementById('addressNotFoundContainer').style.display = 'none';
         document.getElementById('partnerResultList').style.display = 'block';
         document.getElementById('partnerResultList').style.padding = '0';
         
       } else {
         document.getElementById('addressNotFoundContainer').style.display = 'block';
         document.getElementById('partnerResultList').style.display = 'none';
       }
     });
   }
}

function parseXml(str) {
   if (window.ActiveXObject) {
      var doc = new ActiveXObject('Microsoft.XMLDOM');
      doc.loadXML(str);
      return doc;
   } else if (window.DOMParser) {
      return (new DOMParser).parseFromString(str, 'text/xml');
   }
}


function downloadUrl(url,callback) {
   var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest;
   
   request.onreadystatechange = function() {
      if (request.readyState == 4) {
         request.onreadystatechange = doNothing;
         callback(request.responseText, request.status);
      }
   };
   
   request.open('GET', url, true);
   request.send(null);
}



function clearLocations() {
  infoWindow.close();
  for (var i = 0; i < markerList.length; i++) {
    markerList[i].setMap(null);
  }
  markerList.length = 0;
}


function searchLocationsNear(center) {
   clearLocations();
   
   var radius = document.getElementById('radiusSelect').value;
   var userlanguage = document.getElementById('languageField').value;
   var competenceCenter = document.getElementById('competenceCenterField').value;
   var countrySelectValue = document.getElementById('countrySelect').value;
   
   var searchUrl = '/response_scripts/xml_file_response.php?latitude=' + center.lat() + '&longitude=' + center.lng() + '&radius=' + radius + '&language=' + userlanguage + '&competencecenter=' + competenceCenter + '&countryselect=' + countrySelectValue;
   
   downloadUrl(searchUrl, function(data) {
      var xml = parseXml(data);
      var markerNodes = xml.documentElement.getElementsByTagName('partnerMarker');
      
      var sidebar = document.getElementById('partnerResultList');
      sidebar.innerHTML = '';
      if (markerNodes.length == 0) {
         sidebar.innerHTML = databaseErrorHint;
         map.setCenter(center, 5);
         return;
      }
      
      // zoomLevel including the original center
      var bounds = new google.maps.LatLngBounds();
      bounds.extend(center);
      
      for (var i = 0; i < markerNodes.length; i++) {
         var partnerStatus = markerNodes[i].getAttribute('partnerStatus');
         var companyName = markerNodes[i].getAttribute('companyName');
         var streetandNumber = markerNodes[i].getAttribute('streetandNumber');
         var postCode = markerNodes[i].getAttribute('postCode');
         var city = markerNodes[i].getAttribute('city');
         //var partnerStatus = markerNodes[i].getAttribute('partnerStatus');
         var partnerStatusComplete = markerNodes[i].getAttribute('partnerStatusComplete');
         var phoneNumber = markerNodes[i].getAttribute('phoneNumber');
         var numberOfCertifications = markerNodes[i].getAttribute('numberOfCertifications');
         var numberOfWlanCertifications = markerNodes[i].getAttribute('numberOfWlanCertifications');
         var numberOfNetworkConnectivityCertifications = markerNodes[i].getAttribute('numberOfNetworkConnectivityCertifications');
         var isCompetenceCenter = markerNodes[i].getAttribute('isCompetenceCenter');
         var isTrainingCenter = markerNodes[i].getAttribute('isTrainingCenter');
         var uniquePartnerId = markerNodes[i].getAttribute('partnerIdCrm');
         var distance = parseFloat(markerNodes[i].getAttribute('distance'));
         var latitude = parseFloat(markerNodes[i].getAttribute('latitude'));
         var longitude = parseFloat(markerNodes[i].getAttribute('longitude'));
         var routeLinkTarget = markerNodes[i].getAttribute('routeLinkTarget');
         
         var point = new google.maps.LatLng( latitude, longitude);
         
         
         var marker = createMarker(point, routeLinkTarget, companyName, streetandNumber, postCode, city, partnerStatus, partnerStatusComplete, isCompetenceCenter, uniquePartnerId );
         var sidebarEntry = createSidebarEntry(marker, companyName, streetandNumber, postCode, city, distance, partnerStatus, isCompetenceCenter, isTrainingCenter, numberOfWlanCertifications, numberOfNetworkConnectivityCertifications, uniquePartnerId);
         sidebar.appendChild(sidebarEntry);
         bounds.extend(point);
      }
      
      map.fitBounds(bounds);
      });
}

function createMarker(point, routeLinkTarget, companyName, streetandNumber, postCode, city, partnerStatus, partnerStatusComplete, isCompetenceCenter, uniquePartnerId ) {
   
   if( isCompetenceCenter == 1 ){
      var isCompetenceCenterButton = '_LCC';
   }
   else{
      var isCompetenceCenterButton = '';
   }
   
   var marker = new google.maps.Marker({
      map: map,
      position: point,
      icon: new google.maps.MarkerImage("/fileadmin/images/logos/partner/bullet/bullet_" + partnerStatus + isCompetenceCenterButton + "_sticker.png" ),
      shadow: new google.maps.MarkerImage( "/fileadmin/images/logos/partner/bullet/bullet_schatten.png", null, null, new google.maps.Point(15, 42) )
   });
   
   var moreInfoLink = document.createElement('a');
   moreInfoLink.innerHTML = moreInformationHint;
   moreInfoLink.style.cursor = 'pointer';
   moreInfoLink.style.width = '100%';
   moreInfoLink.id = 'info-' + uniquePartnerId;
   var htmlinfo = '<strong>' + companyName + '</strong> <br>' + streetandNumber + '<br>' + postCode + ' ' + city + '<br><a href="javascript:showDetailedInfo(\'' + uniquePartnerId + '\')" >' + moreInformationHint + '</a> | <a href="' + routeLinkTarget + '" target="_blank" >' + calculateRouteHint + '</a>' ;
   
   var infoDiv = document.createElement("div");
   infoDiv.innerHTML = htmlinfo;
   
   var zIndexOfMarkerOriginal = marker.getZIndex();
   
   google.maps.event.addDomListener(moreInfoLink, 'click', function() {
      showDetailedInfo( uniquePartnerId );
   });
   google.maps.event.addListener(marker, 'mouseover', function() {
      marker.setIcon( '/fileadmin/images/logos/partner/bullet/bullet_' + partnerStatus + isCompetenceCenterButton + '_sticker_big.png' );
      marker.setZIndex( 10000 );
      document.getElementById('div-' + uniquePartnerId).style.backgroundColor = '#eee';
   });
   google.maps.event.addListener(marker, 'mouseout', function() {
      marker.setIcon( '/fileadmin/images/logos/partner/bullet/bullet_' + partnerStatus + isCompetenceCenterButton + '_sticker.png' );
      marker.setZIndex( zIndexOfMarkerOriginal );
      document.getElementById('div-' + uniquePartnerId).style.backgroundColor = '#fff';
   });
   google.maps.event.addListener(marker, 'click', function() {
      marker.setIcon( '/fileadmin/images/logos/partner/bullet/bullet_' + partnerStatus + isCompetenceCenterButton + '_sticker_big.png' );
      marker.setZIndex( 10000 );
      infoWindow.setContent(infoDiv);
      infoWindow.open(map, marker);
   });
   markerList.push(marker);
   return marker;
}



function createSidebarEntry(marker, companyName, streetandNumber, postCode, city, distance, partnerStatus, isCompetenceCenter, isTrainingCenter, numberOfWlanCertifications, numberOfNetworkConnectivityCertifications, uniquePartnerId) {
   var div = document.createElement('div');
   
   if( isCompetenceCenter == 1 ){
      var isCompetenceCenterButton = '<div title="' + toolTippCompetenceCenter + '" style="position: relative; float: right; margin: 5px;"><img src="/fileadmin/images/logos/partner/bullet/bullet_LCC.png"></div>';
   }
   else{
      var isCompetenceCenterButton = '';
   }
   
   if( isTrainingCenter == 1 ){
      var isTrainingCenterButton = '<div title="' + toolTippTrainingCenter + '" style="position: relative; float: right; margin: 5px;"><img src="/fileadmin/images/logos/partner/bullet/bullet_LCTC.png"></div>';
   }
   else{
      var isTrainingCenterButton = '';
   }
   
   
   if( partnerStatus == "LQP" ){
      toolTippPartnerStatus = toolTippPartnerStatusLQP;
   }
   else if( partnerStatus == "LSP" ){
      toolTippPartnerStatus = toolTippPartnerStatusLSP;
   }
   else if( partnerStatus == "LAP" ){
      toolTippPartnerStatus = toolTippPartnerStatusLAP;
   }
   else if( partnerStatus == "LPP" ){
      toolTippPartnerStatus = toolTippPartnerStatusLPP;
   }
   else if( partnerStatus == "LR" ){
      toolTippPartnerStatus = toolTippPartnerStatusLR;
   }
   
   
   var partnerStatusButton = '<div title="' + toolTippPartnerStatus + '" style="position: relative; float: right; margin: 5px;"><img src="/fileadmin/images/logos/partner/bullet/bullet_' + partnerStatus + '.png"></div>';
   
   if( numberOfNetworkConnectivityCertifications > 19 ) {
      var leftCharOfNCNumber = numberOfNetworkConnectivityCertifications.charAt(0);
      var rightCharOfNCNumber = numberOfNetworkConnectivityCertifications.charAt(1);
      var certificatesButtonNC = '<div title="' + toolTippCertificationsNc + numberOfNetworkConnectivityCertifications + '" style="position: relative; float: right; margin: 5px;"><img src="/fileadmin/images/logos/partner/bullet/bullet_Zertifzierung_NC_L' + leftCharOfNCNumber + '.png"><img src="/fileadmin/images/logos/partner/bullet/bullet_Zertifzierung_NC_R' + rightCharOfNCNumber + '.png"></div>';
   }
   else if( numberOfNetworkConnectivityCertifications > 0 ) {
      var certificatesButtonNC = '<div title="' + toolTippCertificationsNc + numberOfNetworkConnectivityCertifications + '" style="position: relative; float: right; margin: 5px;"><img src="/fileadmin/images/logos/partner/bullet/bullet_Zertifzierung_NC_' + numberOfNetworkConnectivityCertifications + '.png"></div>';
   }
   else{
      var certificatesButtonNC = '';
   }
   
   if( numberOfWlanCertifications > 19 ) {
      var leftCharOfWlanNumber = numberOfWlanCertifications.charAt(0);
      var rightCharOfWlanNumber = numberOfWlanCertifications.charAt(1);
      var certificatesButtonWLAN = '<div title="' + toolTippCertificationsWlan + numberOfWlanCertifications + '" style="position: relative; float: right; margin: 5px;"><img src="/fileadmin/images/logos/partner/bullet/bullet_Zertifzierung_WLAN_L' + leftCharOfWlanNumber + '.png"><img src="/fileadmin/images/logos/partner/bullet/bullet_Zertifzierung_WLAN_R' + rightCharOfWlanNumber + '.png"></div>';
   }   
   else if( numberOfWlanCertifications > 0 ) {
      var certificatesButtonWLAN = '<div title="' + toolTippCertificationsWlan + numberOfWlanCertifications + '" style="position: relative; float: right; margin: 5px;"><img src="/fileadmin/images/logos/partner/bullet/bullet_Zertifzierung_WLAN_' + numberOfWlanCertifications + '.png"></div>';
   }
   else {
      var certificatesButtonWLAN = '';
   }
   
   var div = document.createElement( "div" );
   var html = '<table style="width:100%; border-bottom-width:1px; border-bottom-style:solid"><tr><td><strong>' + companyName + '</strong> (' + distance.toFixed(1) + 'km)<br>' + streetandNumber + ', ' + postCode + ' ' + city + '</td><td style="width: 200px;">' + partnerStatusButton + certificatesButtonNC + certificatesButtonWLAN + isCompetenceCenterButton + isTrainingCenterButton + '</td></tr></table>';
   div.innerHTML = html;
   div.style.cursor = 'pointer';
   div.style.marginBottom = '5px'; 
   div.id = 'div-' + uniquePartnerId;
   
   google.maps.event.addDomListener(div, 'click', function() {
      google.maps.event.trigger(marker, 'click');
      showDetailedInfo(uniquePartnerId);
   });
   google.maps.event.addDomListener(div, 'mouseover', function() {
      google.maps.event.trigger(marker, 'mouseover');
      div.style.backgroundColor = '#eee';
   });
   google.maps.event.addDomListener(div, 'mouseout', function() {
      google.maps.event.trigger(marker, 'mouseout');
      infoWindow.close();
      div.style.backgroundColor = '#fff';
   });
   return div;
}


function showDetailedInfo( uniquePartnerId ) {

   var searchUrl = '/response_scripts/xml_file_info_response.php?_partnerId=' + uniquePartnerId;
   downloadUrl(searchUrl, function(data) {
      var xml = parseXml(data);
      var details = xml.documentElement.getElementsByTagName('partnerInfo');
      
      var companyName = details[0].getAttribute('companyName');
      var streetandNumber = details[0].getAttribute('streetandNumber');
      var postCode = details[0].getAttribute('postCode');
      var city = details[0].getAttribute('city');
      var partnerStatus = details[0].getAttribute('partnerStatus');
      var phoneNumber = details[0].getAttribute('phoneNumber');
      var companyProfileText = details[0].getAttribute('companyProfileText');      
      var faxNumber = details[0].getAttribute('faxNumber');
      var email = details[0].getAttribute('email');
      var url = details[0].getAttribute('url');
      var companyLogo = details[0].getAttribute('companyLogo');
      var routeLinkTarget = details[0].getAttribute('routeLinkTarget');
      
      if( companyLogo == ''){
         companyLogoLink = '';
         document.getElementById('infoCompanyLogo').style.display = 'none';
         document.getElementById('infoCompanyAddress').style.width = '340px';
      }
      else{
         companyLogoLink = '<img src="/fileadmin/lanvantage/partner_logos/' + companyLogo + '">';
         document.getElementById('infoCompanyLogo').style.display = 'block';
         document.getElementById('infoCompanyAddress').style.width = '170px';
      }
      
      var certifiedUser = xml.documentElement.getElementsByTagName('certifiedUser');
      var certifiedUsersHtml = '';
      for (var i = 0; i < certifiedUser.length; i++) {
         var firstName = certifiedUser[i].getAttribute('firstName');
         var lastName = certifiedUser[i].getAttribute('lastName');
         
         var certificationsText = '';
         for( var j = 0; j < certifiedUser[i].childNodes.length; j++ ) {
            if( certifiedUser[i].childNodes.item( j ).nodeName.indexOf( "#text" ) == -1 ) {
               certificationValue = certifiedUser[i].childNodes.item( j ).firstChild.nodeValue;
               certificationsText = certificationsText + certificationValue + '<br/>';
            }
         }
                  
         var html = '<div style="margin-top: 5px;"><b>' + firstName + ' ' + lastName + '</b><br>' + certificationsText + '</div>';
         var certifiedUsersHtml = certifiedUsersHtml + html;
      }
      
      if( certifiedUsersHtml == '' ){
         document.getElementById('infoCertificatesContainer').style.display = 'none';
      }
      else{
         document.getElementById('infoCertificatesContainer').style.display = 'block';
      }
      
      var companyProfileText = xml.documentElement.getElementsByTagName('companyProfileText');
      if( companyProfileText[0].firstChild != null ){
         var resultingCompanyProfileText = companyProfileText[0].firstChild.nodeValue;
         resultingCompanyProfileText = resultingCompanyProfileText.replace( /\n/g, "<br />" );
         document.getElementById('infoCompanyProfileContainer').style.display = 'block';
      }
      else{
         var resultingCompanyProfileText = '';
         document.getElementById('infoCompanyProfileContainer').style.display = 'none';
      }
      
      
      var htmlCompanyName = '<h1>' + companyName + '</h1>';
      var htmlCompanyAddress = streetandNumber + '<br/>' + postCode + ' ' + city + '<br/><a href="' + routeLinkTarget + '" target="_blank" >' + calculateRouteHint + '</a><br/><br/>Tel: ' + phoneNumber + '<br/>Fax: ' + faxNumber + '<br/><a href="mailto:' + email + '" target="_blank">' + email + '</a><br/><a href="' + url + '" target="_blank">' + url + '</a>';
      var htmlCompanyProfile = '<p>' + resultingCompanyProfileText + '</p>';
      
      
      
      document.getElementById('infoCompanyName').innerHTML = htmlCompanyName;
      document.getElementById('infoCompanyLogo').innerHTML = companyLogoLink;
      document.getElementById('infoCompanyAddress').innerHTML = htmlCompanyAddress;
      document.getElementById('infoCertifiedUser').innerHTML = certifiedUsersHtml;
      document.getElementById('infoCompanyProfileText').innerHTML = htmlCompanyProfile;            
      
      document.getElementById('partnerStatusLogo').innerHTML = '<img src="/fileadmin/images/logos/partner/' + partnerStatus + '.gif">';
      
   });
   document.getElementById('ShadowBox').style.display = 'block';
   document.getElementById('closeButton').onclick = zoomOut;
}

function zoomOut() {
   document.getElementById('ShadowBox').style.display = 'none';
}

function highlightMarker() {
   document.getElementById('ShadowBox').style.display = 'none';
}

function doNothing() {}
