var _gaq = _gaq || [];

String.prototype.regexmatch = function(format, value) {
  var result = format.exec(this);
  return !result ? value : (result.length === 1 ? result[0] : (result.length === 2 ? result[1] : result));
};

jQuery.expr[':'].regex = function(elem, index, match) {
  return new RegExp(match[3], 'i').exec($(elem).text());
}

jQuery.fn.reduce = function(fun, initial) {
  var value = initial;
  $(this).
  each(
    function() {
      value = fun(value, $(this));
    }
  );
  return value;
}

jQuery.fn.cookie = function(name, value) {
  if (value === undefined) {
    return document.cookie ? document.cookie.regexmatch(new RegExp('(?:^| )' + name + '=([^;]*)')) : null;
  }
  var date = new Date();
  date.setTime(date.getTime() + 7 * 24 * 60 * 60 * 1000);
  document.cookie = name + '=' + escape(value) + '; expires=' + date.toUTCString() + ';';
  return this;
}

function oude_browser() {
  return $.browser.msie && $.browser.version <= 6;
}

function zetLettergrootte() {
  var schermbreedte = $(window).width();
  if (schermbreedte == $('body').data('schermbreedte'))
    return;

  $('link#metschermbreedte').
  attr('href',
    function(index, val) {
      return val.replace(/\?.*|$/, '?schermbreedte=' + schermbreedte);
    }
  );

  var verhouding = schermbreedte / 2633;

  $('body').
  cookie('schermbreedte', schermbreedte).
  data('schermbreedte', schermbreedte).
  data('verhouding', verhouding).
  find('div#fotobalk, div#nieuwefotobalk').
    css('background-image',
      function(index, val) {
        return val.replace(/\bbreedte=\d+/, 'breedte=' + schermbreedte);
      }
    ).
  end();

  var kaderbreedte = Math.floor(schermbreedte * 0.13) - 2;
  var kaderhoogte  = Math.round(kaderbreedte / 1003 * 83);
  $('div#links').
    find('.kadertussen').
      css('background-image', 'url("kader-tussen.jpg?breedte=' + kaderbreedte + '")').
    end().
    find('.kaderboven').
      css({
        'background-image': 'url("kader-boven.jpg?breedte=' + kaderbreedte + '")',
        'height': kaderhoogte
      }).
    end().
    find('.kaderonder').
      css({
        'background-image': 'url("kader-onder.jpg?breedte=' + kaderbreedte + '")',
        'height': kaderhoogte
      }).
    end().
  end();

  if (oude_browser())
    $('div#links').
      css('margin-left', schermbreedte * 0.095 / 2).
    end();
  else
    zetHoogteKaderTussen();
}

function zetHoogteKaderTussen() {
  var topmenu = $('div#topmenu ul');
  var oudeitemmarge = parseFloat(topmenu.find('li:first').css('padding-left'));
  if (!oudeitemmarge) {
    // de lettergrootte is nog niet doorberekend in alle groottes
    setTimeout(zetHoogteKaderTussen, 100);
    return;
  }

  var breedtewitvlak = Math.round($('body').data('verhouding') * 2237);
  var topmenuitems = topmenu.find('li');
  var nieuweitemmarge = oudeitemmarge + (breedtewitvlak - topmenu.width()) / (2 * topmenuitems.length);
  topmenuitems.
  css({
    'padding-left': nieuweitemmarge,
    'padding-right': nieuweitemmarge
  });

  $('.kadertussen').
    each(
      function() {
        var hoogte =
          $(this).
          children('ul:visible').
          height();
        $(this).
        css('height',
          hoogte ? hoogte + 0.03 * $(this).width() : 0
        );
      }
    ).
  end();
}

function plaatjeFotobalk(verhoging) {
  var fotobalken = new Array(
    'achtergrond-fotobalk-een.jpg',
    'achtergrond-fotobalk-twee.jpg',
    'achtergrond-fotobalk-drie.jpg',
    'achtergrond-fotobalk-vier.jpg',
    'achtergrond-fotobalk-vijf.jpg',
    'achtergrond-fotobalk-zes.jpg',
    'achtergrond-fotobalk-zeven.jpg',
    'achtergrond-fotobalk-acht.jpg'
  );
  var nummer = (parseInt($('body').data('fotobalknr') || $('body').cookie('fotobalknr') || 0) + verhoging) % fotobalken.length;

  $('body').
  data('fotobalknr', nummer).
  cookie('fotobalknr', nummer);

  return fotobalken[nummer] + '?breedte=' + $('body').cookie('schermbreedte');
}

function volgendeFotobalk() {
  $('<img />').
  attr('src', plaatjeFotobalk(1)).
  load(
    function() {
      $('<div></div>').
      attr('id', 'nieuwefotobalk').
      css({
        'background-image': 'url("' + $(this).attr('src') + '")',
        'display': 'none'
      }).
      insertAfter('div#fotobalk').
      fadeIn(
        2000,
        function() {
          $('div#fotobalk').
          remove();
          $('div#nieuwefotobalk').
          attr('id', 'fotobalk');
          setTimeout(volgendeFotobalk, 2000);
        }
      );
    }
  );
}

$(document).
ready(
  function() {
    if (document.domain.regexmatch(/^(www\.)?[\w\-]+\.\w+$/)) {
      _gaq.push(['_setAccount', 'UA-16154545-1']);
      _gaq.push(['_trackPageview']);

      $('a.externeverwijzing').
      click(
        function() {
          _gaq.push(['_trackEvent', 'Externe verwijzing', window.location.href + ' \u2192 ' + this.href]);
          document.location = this.href;
          return false;
        }
      );

      $('a.emailadres').
      click(
        function() {
          _gaq.push(['_trackEvent', 'Emailadres', window.location.href + ' \u2192 ' + this.href]);
          return true;
        }
      );
    }

    $('div#links>ul>li').
      addClass('kader').
      wrapInner('<div class="kadertussen"></div>').
      prepend('<div class="kaderboven"></div>').
      append('<div class="kaderonder"></div>').
    end();

    $('div#links a.gekozen').
    click(
      function() {
        return false;
      }
    );

    var huidigepagina = window.location.href.regexmatch(/([\w-]+)[^\/]*$/);
    if (huidigepagina == 'welkom' && !oude_browser()) {
      $('div#tussen').
      prepend('<div id="bladeren"></div>');
      $('div#kop').
      remove();
    }

    $(window).
    resize(zetLettergrootte);

    zetLettergrootte();
    setTimeout(zetLettergrootte, 1000);
    
    if (!oude_browser() && !$('body').cookie('stilstaandefotobalk'))
      setTimeout(volgendeFotobalk, 2000);

    $('ul.uitklapbaar>li').
      wrapInner('<div></div>').
      find(':first :first').
        each(
          function() {
            $(this).
            parent().
              parent().
                prepend(
                  $(this).
                  clone()
                ).
              end().
            end().
            remove();
          }
        ).
      end().
      find(':first').
        wrapInner('<span></span>').
        find(':first').
          click(
            function() {
              $(this).
              parent().
                next().
                  slideToggle().
                end().
              end().
              toggleClass('open');
            }
          ).
          addClass('klikbaar').
        end().
        next().
          hide();

    var nu = new Date();
    var drie_dagen_terug = (new Date()).setDate(nu.getDate() - 3);
    var vier_weken_verder = (new Date()).setDate(nu.getDate() + 28);
    var maanden = {'jan': 0, 'feb': 1, 'mrt': 2, 'apr': 3, 'mei': 4, 'jun': 5, 'juni': 5, 'jul': 6, 'juli': 6, 'aug': 7, 'sep': 8, 'sept': 8, 'okt': 9, 'nov': 10, 'dec': 11};
    var weekdagen = {'zo': 0, 'ma': 1, 'di': 2, 'wo': 3, 'do': 4, 'vr': 5, 'za': 6};
    var aantal_zichtbaar = 0;

    $('table#agenda').
    find('tr').
      each(
        function() {
          var klasse = 'ongeldig';
          var datumtekst = $(this).find('td:nth-child(1)').text();
          var tijdtekst  = $(this).find('td:nth-child(2)').text();
          var datumvelden = /^(\w+) +(\d+) +(\w+) +(\d+) +(\d+):(\d+)$/.exec(datumtekst + ' ' + tijdtekst); // bijvoorbeeld za 03 juli 2010 09:00
          if (datumvelden != null) {
            var aanvang = new Date(datumvelden[4], maanden[datumvelden[3].toLowerCase()], datumvelden[2], datumvelden[5], datumvelden[6]);
            if (weekdagen[datumvelden[1].toLowerCase()] != aanvang.getDay())
              klasse = 'ongeldig';
            else if (aanvang < drie_dagen_terug)
              klasse = 'verleden';
            else if (aanvang < nu)
              klasse = 'recent';
            else if (datumvelden[3] == datumvelden[3].toUpperCase()) {
              klasse = 'belangrijk';
              aantal_zichtbaar += 1;
            }
            else if (aanvang < vier_weken_verder || aantal_zichtbaar < 20) {
              klasse = 'binnenkort';
              aantal_zichtbaar += 1;
            }
            else
              klasse = 'toekomst';
          }
          $(this).
          addClass(klasse).
          find('td:nth-child(1)').
            html(
              datumtekst.
              regexmatch(/^(\w+ +\d+ +\w+)/, datumtekst). // haal jaar eraf
              toLowerCase()
            ).
            css('text-align', 'right').
          end();
        }
      ).
    end();

    var laatste_kolom =
      $('table#agenda tr').
      reduce(
        function(a, b) {
          return Math.max(a, $(b).find('td').length);
        },
        0
      );

    $('table#agenda').
    find('tr').
      find('td:nth-child(' + laatste_kolom + ')').
        each(
          function() {
            $(this).
            closest('tr').
              find('td:nth-child(' + (laatste_kolom - 2) + ')').
                css('width', '100%').
                wrapInner('<span></span>').
                find(':first').
                  addClass('klikbaar').
                  click(
                    function() {
                      $(this).
                      toggleClass('open').
                      next().
                      slideToggle();
                    }
                  ).
                  after('<div class="extrainfo">' + $(this).html() + '</div>').
                end().
              end().
            end().
            remove();
          }
        ).
      end().
    end();

    $('.fotos').
    wrap('<div class="fotogalerij"></div>').
    before('<div class="galerij"></div>').
    find('img').
      click(
        function() {
          $(this).
          closest('.fotogalerij').
            find('.galerij').
              empty().
              append(
                $(this).
                clone()
              ).
            end().
            find('.active').
              removeClass('active').
            end().
          end().
          addClass('active');
        }
      ).
      eq(0).
        click().
      end().
    end();

    $('ul#actualiteiten li').
    find('a:regex("^meer$")').
      addClass('meer').
      parent().
        click(
          function() {
            var adres = $(this).find('a:last').attr('href');
            if (adres)
              window.location.href = adres;
          }
        ).
        css('cursor', 'pointer').
      end().
    end();

    $('img').
    closest('a.emailadres').
    removeClass('emailadres');

    function has_no_val(id) {
      return $('#' + id).val() ? null : id;
    }

    function has_val(id) {
      return !$('#' + id).val() ? null : id;
    }

    $('form#aanmelden').
    submit(
      function() {
        var probleemveld =
          has_no_val('achternaam') ||
          has_no_val('telefoonnummer') ||
          has_no_val('mailadres') ||
          (has_no_val('voornaam1') || has_no_val('leeftijd1') || has_no_val('verblijf1') || has_no_val('opbouw1')) ||
          ((has_val('voornaam2') || has_val('leeftijd2') || has_val('verblijf2') || has_val('opbouw2')) && (has_no_val('voornaam2') || has_no_val('leeftijd2') || has_no_val('verblijf2') || has_no_val('opbouw2'))) ||
          ((has_val('voornaam3') || has_val('leeftijd3') || has_val('verblijf3') || has_val('opbouw3')) && (has_no_val('voornaam3') || has_no_val('leeftijd3') || has_no_val('verblijf3') || has_no_val('opbouw3'))) ||
          ((has_val('voornaam4') || has_val('leeftijd4') || has_val('verblijf4') || has_val('opbouw4')) && (has_no_val('voornaam4') || has_no_val('leeftijd4') || has_no_val('verblijf4') || has_no_val('opbouw4'))) ||
          ((has_val('voornaam5') || has_val('leeftijd5') || has_val('verblijf5') || has_val('opbouw5')) && (has_no_val('voornaam5') || has_no_val('leeftijd5') || has_no_val('verblijf5') || has_no_val('opbouw5'))) ||
          ((has_val('voornaam6') || has_val('leeftijd6') || has_val('verblijf6') || has_val('opbouw6')) && (has_no_val('voornaam6') || has_no_val('leeftijd6') || has_no_val('verblijf6') || has_no_val('opbouw6'))) ||
          ((has_val('voornaam7') || has_val('leeftijd7') || has_val('verblijf7') || has_val('opbouw7')) && (has_no_val('voornaam7') || has_no_val('leeftijd7') || has_no_val('verblijf7') || has_no_val('opbouw7'))) ||
          ((has_val('voornaam8') || has_val('leeftijd8') || has_val('verblijf8') || has_val('opbouw8')) && (has_no_val('voornaam8') || has_no_val('leeftijd8') || has_no_val('verblijf8') || has_no_val('opbouw8')));
        if (probleemveld) {
          $('#' + probleemveld).
          addClass('probleem').
          focus().
          blur(
            function() {
              $(this).
              removeClass('probleem');
            }
          );
        }
        return probleemveld ? false : true;
      }
    );

    $('form#aanmelden table select').
    mousedown(
      function() {
        if (!$(this).data('open')) {
          $(this).
          addClass('breed').
          focus();
        }
      }
    ).
    click(
      function() {
        if (!$(this).data('open')) {
          $(this).
          data('open', true);
        }
        else {
          $(this).
          data('open', false).
          removeClass('breed');
        }
      }
    ).
    blur(
      function() {
        $(this).
        data('open', false).
        removeClass('breed');
      }
    ).
    change(
      function() {
        $(this).
        data('open', false).
        removeClass('breed');
      }
    );
  }
);

