jQuery(function($) {
  $('body').addClass('js');
  
  $('a[rel^=lightbox]').lightBox({
    txtImage: 'Bild',
    txtOf: 'von',
    imageLoading: '/fileadmin/familienberatung/images/lightbox/lightbox-ico-loading.gif',
    imageBtnPrev: '/fileadmin/familienberatung/images/lightbox/lightbox-btn-prev.gif',
    imageBtnNext: '/fileadmin/familienberatung/images/lightbox/lightbox-btn-next.gif',
    imageBtnClose: '/fileadmin/familienberatung/images/lightbox/lightbox-btn-close.gif',
    imageBlank: '/fileadmin/familienberatung/images/lightbox/lightbox-blank.gif'
  });
  
  if ( $('#content .topicsearch').length ) initSortableTopics();
  externalLinks();
  initGeolocationSearch();
  initGeolocationVerification();
  initMapAndLightbox();
  initSearch();
  enlargeClickArea('advice_searchresults', 'dd');
  enlargeClickArea('news', 'li');
  enlargeClickArea('tx-indexedsearch-res', 'li');
  
  
  function externalLinks () {
    $('#pagecenter a.extern').attr({'target': '_blank', 'title': 'Link öffnet in neuem Fenster'});
  }
  
  /**********************/
  /* Geolocation Search */
  /**********************/
  
  function initGeolocationSearch() {
    if ( $('#state').length === 0 || $('#mapcontainer').length ) return;
    
    // DOM Elements we need more often
    var state = $('#state'),
        form = $('#main').find('.topicsearch form'),
        searchPositionLat,
        searchPositionLng,
        distanceWrapper,
        searchAddress,
        sortorder = $('#sortorder'),
        sortorderEntfernung;
    
    // all map variables
    var mapOptions = {
          center: new google.maps.LatLng(47.353711, 13.458252),
          zoom: 6,
          mapTypeControl: true,
          mapTypeControlOptions: {
            style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
          },
          mapTypeId: google.maps.MapTypeId.ROADMAP
        },
        geocoder = new google.maps.Geocoder(),
        map,
        initMapFinished = false,
        initFormsFinished = false,
        geoLocatingAllowed = false,
        readyToSubmit = false,
        alreadySearched = false;
    
    // do all the necessary changes to the html
    state.addClass('clearfix').children('h2')
    .replaceWith('<h2 class="clearfix"><span>1.</span> <a id="state_one_switch" class="current" href="#">Bundesland wählen</a> <span class="small">oder</span> <a id="state_two_switch" href="#">In Ihrer Nähe suchen</a></h2>');
    state.children('div.input').wrapAll('<div id="state_one" class="current"></div>');
    state.append('<div id="state_two"><div id="map_canvas"></div></div>');
    
    var mapWrapper = $('#state_two').addClass('clearfix'), 
        mapElement = $('#map_canvas').addClass('dontShow'),
        state_one = $('#state_one'),
        state_one_switch = $('#state_one_switch'),
        state_two_switch = $('#state_two_switch');
    
    // we have to know if we use nearbysearch or not and if we already searched or not
    if (! $('#nearbySearch').length ) {
      mapWrapper.append('<input type="hidden" id="nearbySearch" name="nearbySearch" value="0" />');
      var nearbySearch = $('#nearbySearch');
    } else {
      alreadySearched = true;
      var nearbySearch = $('#nearbySearch').val('0');
      var alreadyDistance = $('#searchDistance').val();
      toggleGeo(true);
    }
    
    // The Tab Handlers
    state_one_switch.click(function() {
      toggleGeo(false);
      return false
    });
    
    // The Tab Handlers
    state_two_switch.click(function() {
      toggleGeo(true);
      return false
    });
    
    // Switching between the two tabs
    function toggleGeo (state) {
      var state = state;
      if ( state === true && initFormsFinished ) {
        searchAddress.focus();
      } else if ( state === false ) {
        $('#state_select').focus();
      }
      if ( (state_one_switch.hasClass('current') && state === false) || (state_two_switch.hasClass('current') && state === true) ) return;
      
      var value = nearbySearch.val();
      
      state_one_switch.toggleClass('current');
      state_two_switch.toggleClass('current');
      
      state_one.toggleClass('current');
      mapWrapper.toggleClass('current');
      
      nearbySearch.val(Math.abs(value-1));
      
      if ( state === true ) {
        if (! initFormsFinished ) initForms();
         
        sortorder.find('.option:first').show();
        sortorder.find('input').removeAttr('checked');
        sortorderEntfernung.attr('checked', 'checked');
        searchAddress.focus();
      } else if ( state === false ) {
        sortorder.find('.option:first').hide();
        $('#user_familienberatung_plz').attr('checked', 'checked');
        $('#state_select').focus();
      }
    }
    
    function initForms() {
      mapWrapper.prepend('<p style="font-size: 0.9em">Die Ortsdaten der Beratungsstellen werden in den nächsten Tagen sukzessive eingetragen</p><div class="input"><label for="searchAddress">Ihr Standort</label><input type="text" id="searchAddress" name="searchAddress" /> <a id="addressSearch" href="#">Karte anzeigen</a></div>');
      
      mapWrapper.append('<fieldset id="distanceWrapper"><legend>Maximale Entfernung</legend><div class="option"><label for="fiveKm">5 km</label><input type="radio" id="fiveKm" name="distance" value="5" /></div><div class="option"><label for="twentyKm">20 km</label><input type="radio" id="twentyKm" name="distance" value="20" checked="checked" /></div><div class="option"><label for="fiftyKm">50 km</label><input type="radio" id="fiftyKm" name="distance" value="50" /></div></fieldset>');
      
      distanceWrapper = $('#distanceWrapper');
      searchAddress = $('#searchAddress');
      
      // If we already searched before
      if ( $('#searchPositionLat').length && $('#searchPositionLng').length ) {
        searchPositionLat = $('#searchPositionLat');
        searchPositionLng = $('#searchPositionLng');
        if ( alreadyDistance ) distanceWrapper.find('input').removeAttr('checked').filter('input[value='+alreadyDistance+']').attr('checked', 'checked');
        mapElement.slideDown(300, function() {
          initMap(new google.maps.LatLng($('#searchPositionLat').val(), $('#searchPositionLng').val()));
        });
      } else {
        mapWrapper.append('<input type="hidden" id="searchPositionLat" name="searchPositionLat" /><input type="hidden" id="searchPositionLng" name="searchPositionLng" />');
        searchPositionLat = $('#searchPositionLat');
        searchPositionLng = $('#searchPositionLng');
      }
      
      // Add the 3rd Sortorder Radiobutton
      sortorder.children('.optiongroup').prepend('<div class="option"><label for="user_familienberatung_entfernung">Enfernung</label><input type="radio" id="user_familienberatung_entfernung" name="user_familienberatung[sort]" value="2" /></div>');
      sortorderEntfernung = $('#user_familienberatung_entfernung');
      
      $('#addressSearch').click(addressSearch);
      
      distanceWrapper.hide();
      
      if ( navigator.geolocation ) {
        navigator.geolocation.getCurrentPosition(
          function(position) {
            geoLocatingAllowed = true;
            mapElement.slideDown(300, function() {
              initMap(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
            });
          }
        );
      }
      
      initFormsFinished = true;
    }
    
    function initMap (position) {
      map = new google.maps.Map(mapElement.get(0), mapOptions);
      marker = new google.maps.Marker({
        position: mapOptions.center,
        title: 'Ihr Standort',
        map: map
      });
      marker.setVisible(false);
      
      if ( (geoLocatingAllowed && position) || (alreadySearched && position) ) {
        map.setCenter(position);
        map.setZoom(7);
        if ( alreadySearched ) map.setZoom(15);
        marker.setPosition(map.getCenter());
        marker.setVisible(true);
        searchPositionLat.val(map.getCenter().lat());
        searchPositionLng.val(map.getCenter().lng());
      }
      
      google.maps.event.addListener(map, 'click', function(e) {
        //map.setCenter(e.latLng);
        setTimeout(function(){
          marker.setPosition(e.latLng);
          marker.setVisible(true);
        }, 300);
        searchPositionLat.val(e.latLng.lat());
        searchPositionLng.val(e.latLng.lng());
      });
      
      distanceWrapper.show();
      
      initMapFinished = true;
    }
    
    function addressSearch() {
      var address = searchAddress.val();
      
      if (! initMapFinished ) {
        mapElement.slideDown(300, function() {
          initMap();
          geoCode();
        });
      } else if ( mapElement.hasClass('dontShow') ) {
        mapElement.slideDown(300, function() {
          geoCode();
        });
      } else {
        geoCode();
      }
      
      function geoCode () {
        geocoder.geocode( { 'address': address, 'region': 'AT' }, function(results, status) {
          if ( status == google.maps.GeocoderStatus.OK ) {
            map.setCenter(results[0].geometry.location);
            map.setZoom(15);
            marker.setPosition(results[0].geometry.location);
            marker.setVisible(true);
            searchPositionLat.val(map.getCenter().lat());
            searchPositionLng.val(map.getCenter().lng());
            
            if ( readyToSubmit ) form.submit();
          } else if ( status == google.maps.GeocoderStatus.UNKNOWN_ERROR ) {
            setTimeout(geoCode, 500);
          } else if ( status == google.maps.GeocoderStatus.ZERO_RESULTS || status == google.maps.GeocoderStatus.INVALID_REQUEST) {
            enterAddressAgain();
          }
        });
      }
      
      return false;
    }
    
    // When the form is submitted
    form.submit(function() {
      if ( (nearbySearch.val() == 0) || (searchPositionLat.val() && searchPositionLng.val()) ) return true;
      
      readyToSubmit = true;
      if ( searchAddress.val() == '' ) {
        enterAddressAgain();
      } else {
        addressSearch();
      }
      
      return false;
    });
    
    // Focus to the Address Field and give hint
    function enterAddressAgain () {
      // Hinweis für User geben
      
      searchAddress.focus();
    }
  }
  
  /***************************************/
  /* Address Verification when logged in */
  /***************************************/
  
  function initGeolocationVerification () {
    if (! ($('#user_familienberatung_street').length && $('#user_familienberatung_zip').length && $('#user_familienberatung_city').length) ) return;
    
    // DOM Elements we need more often
    var addressVerification = $('#addressVerification'),
        streetField = $('#user_familienberatung_street'),
        zipField = $('#user_familienberatung_zip'),
        cityField = $('#user_familienberatung_city'),
        addressVerifiedField = $('#user_familienberatung_addressVerified'),
        searchPositionLat = $('#searchPositionLat'),
        searchPositionLng = $('#searchPositionLng'),
        form = $('#main').find('form'),
        infoElement,
        addressVerifier,
        saveAddress,
        mapUpdater,
        mapElement = addressVerification.append('<div id="map" style="width: 100%; height: 400px"></div>').children('#map');

    // Variables
    var mapOptions = {
          center: new google.maps.LatLng(47.353711, 13.458252),
          zoom: 6,
          mapTypeControl: true,
          mapTypeControlOptions: {
            style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
          },
          mapTypeId: google.maps.MapTypeId.ROADMAP
        },
        map,
        marker,
        geocoder = new google.maps.Geocoder();
        
    // HTML Changes beforehand
    mapUpdater = cityField.after('<p class="seeBetter"><a id="updateMap" href="#">Karte aktualisieren</a></p>').next('p').children('#updateMap');
    addressVerification.prepend('<p id="info" class="notice">Position nicht bestätigt.</p><a id="verifyAddress" href="#">Position bestätigen</a><a id="saveAddress" href="#">Speichern</a><p class="small">Der Rote Marker zeigt die Position der Beratungsstelle. Sie können durch klicken die Position des Markers ändern.</p>');
    addressVerifier = $('#verifyAddress');
    saveAddress = $('#saveAddress').hide();
    infoElement = $('#info');
    
    // Change Info if Position verified
    if ( addressVerifiedField.val() == 1 ){
      toggleInfo(true, true);
    }
    
    addressVerifier.click(verifyAddress);
    mapUpdater.click(updateMap);
    saveAddress.click(function() { form.submit(); return false; });
    $('#user_familienberatung_street, #user_familienberatung_zip, #user_familienberatung_city').change(function() {
      toggleInfo(false);
    });
    
    initMap();
    
    function toggleInfo (state, initialyVerified) {
      var verified = infoElement.hasClass('info') ? 1 : 0;
      if ( (state === false && verified === 0) || (state === true && verified === 1) ) return;
      
      var text =  infoElement.text() == 'Position bestätigt.' ? 'Position nicht bestätigt.' : 'Position bestätigt.';
      infoElement
        .toggleClass('notice')
        .toggleClass('info')
        .text(text);
      
      addressVerifier.toggle();
      addressVerifiedField.val(Math.abs(verified-1));
      
      if ( initialyVerified ) return;
      
      if ( state === true ) {
        saveAddress.show();
      } else if ( state === false ) {
        saveAddress.hide();
      } else {
        saveAddress.toggle();
      }
    }
    
    function verifyAddress () {
      toggleInfo(true);
      map.setCenter(marker.getPosition());
        
      return false;
    }
    
    function initMap () {
      map = new google.maps.Map(mapElement.get(0), mapOptions);
      marker = new google.maps.Marker({
        position: mapOptions.center,
        title: 'Ihr Standort',
        map: map
      });
      
      google.maps.event.addListener(map, 'click', function(e) {
        //map.setCenter(e.latLng);
        setTimeout(function(){
          marker.setPosition(e.latLng)
        }, 300);
        searchPositionLat.val(e.latLng.lat());
        searchPositionLng.val(e.latLng.lng());
        toggleInfo(false);
      });
      
      // if   the Address is already verified set it to the verified positions
      // else geoCode the information in the Address fields
      if ( addressVerifiedField.val() == 1 ) {
        map.setCenter(new google.maps.LatLng(searchPositionLat.val(), searchPositionLng.val()));
        map.setZoom(15);
        marker.setPosition(map.getCenter());
      } else {
        geoCode(getCurrentAddress());
      }
    }
    
    function getCurrentAddress() {
      return streetField.val() + ', ' + zipField.val() + ' ' + cityField.val();
    }
    
    function updateMap () {
      geoCode(getCurrentAddress());
      toggleInfo(false);
      
      return false;
    }
    
    function geoCode (address) {
      geocoder.geocode( { 'address': address, 'region': 'AT' }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          map.setCenter(results[0].geometry.location);
          map.setZoom(15);
          setTimeout(function() {
            marker.setPosition(results[0].geometry.location);
          }, 300);
          searchPositionLat.val(map.getCenter().lat());
          searchPositionLng.val(map.getCenter().lng());
        }
      });
    }
  }
  
  /******************************************/
  /* Make the Topics in the search sortable */
  /******************************************/
  
  function initSortableTopics() {
    var topicWrapper = $('#topic');
    var options = topicWrapper.find('.option');
    var optionGroups = topicWrapper.find('.optiongroup');
    var left = topicWrapper.find('.left');
    var right = topicWrapper.find('.right');
    var optionIds = [];
    
    // Add sorting Contrtols
    topicWrapper.find('h2').after('<div id="sorting">Sortierung: <a id="alpha" href="#">Alphabetisch</a>, <a id="group" class="current" href="#">Gruppiert</a></div>');
    var alpha = $('#alpha');
    var group = $('#group');
    
    // Add ids and sort
    options.each(function(i) {
      $(this).attr('id', $(this).children('label').text().substr(0,5));
      optionIds[i] = $(this).attr('id');
    });
    optionIds = optionIds.sort();

    // Remember grouping
    optionGroups.each(function(i) {
      $(this).children('.option').each(function(j) {
        $(this).addClass('group_'+i+' pos_'+j);
      });
    });
    
    // click Hanlders
    alpha.click(toAlphaHandler);
    group.click(toGroupHandler);
    
    // If sortAlpha cookie, sort it alphabetically
    if ( readCookie('sortAlpha') ) {
      toAlphaHandler.call(alpha);
    }
    
    function toAlphaHandler() {
      toAlpha();
      topicWrapper.addClass('alphabetic');
      $(this).addClass('current');
      group.removeClass('current');
      createCookie('sortAlpha',"1");
      return false;
    }
    
    function toGroupHandler() {
      toGroup();
      topicWrapper.removeClass('alphabetic');
      $(this).addClass('current');
      alpha.removeClass('current');
      eraseCookie('sortAlpha');
      return false;
    }
    
    function toAlpha () {
      left.empty();
      right.empty();
      
      for ( var i=0,j=optionIds.length; i<j; i++ ) {
        var side = i <= optionIds.length/2 ? left : right;
        options.filter('#'+optionIds[i]).appendTo(side);
      }
    }
    
    function toGroup () {
      left.empty();
      right.empty();
      
      for ( var i=1, j=optionGroups.length; i<=j; i++ ) {
        var side = i <= (j/2) ? left : right;
        options.filter('.group_'+(i-1)).appendTo($('<div class="optiongroup"></div>').appendTo(side));
      }
    }
  }
  
  /**
    * Map and Lightbox stuff
    */
  
  // does all the necessary initialisation
  function initMapAndLightbox() {
    if ( !document.getElementById('map') ) return;
    
    var map = document.getElementById('map');
    var areas = map.getElementsByTagName('area');
    for(i=0;i<areas.length;i++) {
      areas[i].onclick = mapClicked;
    }
    
    // lightbox stuff
    var outerBox = document.getElementById('lightbox_container');
    if ( outerBox == null ) { return; }
    outerBox.onclick = cancelLightbox;
    
    var cancelButton = document.getElementById('topic_cancel');
    cancelButton.onclick = cancelLightbox;
  }
  
  // shows the lightbox after initialising
  function mapClicked() {
    var state = document.getElementById('state');
    var stateHeading = state.getElementsByTagName('h2')[0];
    
    // create a hidden inputfield and insert the the right number as value
    var input = document.createElement('input');
    input.type = 'hidden';
    input.name = 'state_select';
    input.id = 'state_select';
    input.value = this.className; // the classname of the area holds the id
    state.appendChild(input);
    
    // insert the title from the area into the heading
    stateHeading.appendChild(document.createTextNode('1. Bundesland: ' + this.title));
    
    // register the 'ESC'-Key to close the lightbox
    document.onkeyup = escKeyHandler;
    
    toggleLightbox();
    
    window.location.hash = 'lightbox_topicsearch';
    
    return false;
  }
  
  // hides the lightbox after cleaning up
  function cancelLightbox() {
    var state = document.getElementById('state');
    var stateHeading = state.getElementsByTagName('h2')[0];
    var input = document.getElementById('state_select');
    
    var URL = location.href;
    var newUrl = URL.substring(0, URL.lastIndexOf('#'));
    
    //window.location.href = newUrl;
    window.location.hash = '';
    
    toggleLightbox();
    
    // remove the text of the heading
    stateHeading.removeChild(stateHeading.childNodes[0]);
    
    // remove the inputfield
    input.parentNode.removeChild(input);
    
    // unregister the keyevents
    document.onkeyup = null;
  }
  
  // show or hide the lightbox depending on its current state
  function toggleLightbox() {
    var outerBox = document.getElementById('lightbox_container');
    var innerBox = document.getElementById('lightbox_topicsearch');
    var display = outerBox.style.display == 'none' ? 'block' : 'none';
  
    outerBox.style.display = display;
    innerBox.style.display = display;
  }
  
  /**
   * Search
   */
  
  function initSearch() {
    if ( !document.getElementById('state_select') ) return;
    
    var state = document.getElementById('state_select');
    state.onchange = function() {
      if ( this.value == "W" ) {
        document.getElementById('user_familienberatung_plz').disabled = 'disabled';
        document.getElementById('user_familienberatung_city').disabled = 'disabled';
      } else {
        document.getElementById('user_familienberatung_plz').disabled = '';
        document.getElementById('user_familienberatung_city').disabled = '';
      }
    };
  }
  
  /**
   * Add onclick eventhandler to make clickabble area larger
   * @parentElement: The Element that includes the list of elements to check for
   * @childElementTag: The Tag of the Element that should be made clickabble 
   */
   
  function enlargeClickArea(parentElement, childElementTag) {
    if ( !document.getElementById(parentElement) ) return;
    
    var results = document.getElementById(parentElement);
    var list = results.getElementsByTagName(childElementTag);
    for(i=0;i<list.length;i++) {
      list[i].onclick = function() {
        window.location.href = this.getElementsByTagName('a')[0].href;
      };
    }
  }
  
  /**
   * Helpers
   */
   
  function escKeyHandler(e) {
    var kC  = (window.event) ? event.keyCode : e.keyCode;  // MSIE or Firefox?
    var Esc = (window.event) ? 27 : e.DOM_VK_ESCAPE // MSIE : Firefox
    if ( kC==Esc ) {
      cancelLightbox();
    }
  }
  
  /* --- Cookie Helpers --- */
  
  function createCookie(name,value,days) {
  	if (days) {
  		var date = new Date();
  		date.setTime(date.getTime()+(days*24*60*60*1000));
  		var expires = "; expires="+date.toGMTString();
  	}
  	else var expires = "";
  	document.cookie = name+"="+value+expires+"; path=/; domain="+window.location.hostname;
  }
  
  function readCookie(name) {
  	var nameEQ = name + "=";
  	var ca = document.cookie.split(';');
  	for(var i=0;i < ca.length;i++) {
  		var c = ca[i];
  		while (c.charAt(0)==' ') c = c.substring(1,c.length);
  		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  	}
  	return null;
  }
  
  function eraseCookie(name) {
  	createCookie(name,"",-1);
  }
  
  function getCookieDomain() {
    var domain = window.location.hostname;
    var parts = domain.split('.');
    var num = parts.length;
    
    if ( num > 1 ) {
      if ( num == 4 ) {
        if ( domain.match(/\d+.\d+.\d+.\d+/) ) {
          return domain;
        }
      }
      for (var i=0; i<num-2; i++) {
        parts.shift();
      }
      domain = '.' + parts.join('.');
    }
    return domain;
  }
});


/**
 * Hide and show input field contents
 */
 
// Clears predefined contents of an input field
function clearContent(O,content)
{
  if (O.value == content)
  { 
    O.value = "";
  }
}

// Restore predefined contents of an input field
function restoreContent(O,content)
{
  if (O.value == "")
  {
    O.value=content;
  }
}