function log () {
  if (window.console) {
    window.console.log.apply( window.console, arguments )
  }
  else if (window.opera) {
    window.opera.postError( arguments )
  }
};

jQuery(document).bind('load', function () {
  ;;;log('onload');
})
jQuery(function($){ 


  ;;;log('DOMready');

  var constrictSelection = function () { 
    ;;;log('constrict old');
  };

  document.body.className += 'js-present';

  // round corners
  $( '#page-main' )
    .addClass( 'round-box' )
    .append( '<i class="tc"><b></b></i>'+
             '<i class="bc"><b></b></i>' );

  // simple / advanced interface mode
  if ( $( 'form#weatherquery' ).length ) {
    var adv = $.cookie( 'advanced' );
    var adv_sw = $( '<ul class="adv-switch tabs" id="adv-switch"></ul>' );
    adv_sw.append( '<li class="sim"><a href="#simple">Einfalt viðmót</a></li>' );
    adv_sw.append( '<li class="adv"><a href="#advanced">Fullt viðmót</a></li>' );
    function set_adv ( ) {
      adv_sw.find('li').removeClass('current').filter('.adv').addClass('current');
      $('body').addClass('advanced-mode').removeClass('simple-mode')
      $.cookie( 'advanced', '1', { expires: 40, path: '/' } );
      constrictSelection(
        $( 'input#fromdate' ).datepicker( 'getDate' ),
        $( 'input#todate' ).datepicker( 'getDate' )
      );
    }
    function set_sim ( ) {
      adv_sw.find('li').removeClass('current').filter('.sim').addClass('current');
      $('body').addClass('simple-mode').removeClass('advanced-mode')
      $.cookie( 'advanced', null, { path: '/' } );
      constrictSelection(
        $( 'input#fromdate' ).datepicker( 'getDate' ),
        $( 'input#todate' ).datepicker( 'getDate' )
      );
    }
    if ( adv ) { set_adv(); } else { set_sim(); }
    $('#extra-one .wrap').append( adv_sw );
    adv_sw.click(function ( e ) {
      var s = e && e.target && e.target.nodeName == 'A' && e.target.href.split('#');
      if ( s && s[1] == 'advanced' ) { set_adv(); } else { set_sim(); }
      return false;
    });
  }
    

  // datepickers for time input
  if ( $.datepicker ) {
    var dpConf = {
      buttonImage: ( window.MEDIA_URL || '' ) + 'img/calendar.png',
      buttonText: 'Velja',
      changeYear: true,
      closeText: 'Loka',
      constrainInput: true,
      duration: '',
      hideIfNoPrevNext: true,
      maxDate: new Date( 3000, 0, 1 ),
      showButtonPanel: true,
      showOn: 'button',
      showOtherMonths: true
    };
    var now = new Date();
    var ly = new Date( now.getFullYear() - 1, now.getMonth(), now.getDate() );
    var fmt = $.datepicker.regional['is'] ? $.datepicker.regional['is'].dateFormat : dpConf.dateFormat;
    var input = $( 'input#fromdate' );
    input
      .datepicker( dpConf )
      .datepicker( 'option', 'defaultDate', '-1y' )
      .bind( 'change', function () {
        var d = $( this ).datepicker( 'getDate' ),
            o = $( 'input#todate' ).datepicker( 'option', 'minDate', d );
        constrictSelection( d, o.datepicker( 'getDate' ) );
      });
    if ( !input.val() ) input.val( $.datepicker.formatDate( fmt || 'd. m. yy', ly ) );
    input = $( 'input#todate' );
    input
        .datepicker( dpConf )
        .bind( 'change', function () {
          var d = $( this ).datepicker( 'getDate' ),
              o = $( 'input#fromdate' ).datepicker( 'option', 'maxDate', d );
          constrictSelection( o.datepicker( 'getDate' ), d );
        });
    if ( !input.val() ) input.val( $.datepicker.formatDate( fmt || 'd. m. yy', now ) );
  
    constrictSelection = function ( begin, end ) {
      ;;;log('constrict new');
      if ( window.datamarket && datamarket.mapselect ) {
        var st = datamarket.mapselect.stations;
        var beginT = begin.getTime(), 
            endT   = end.getTime(),
            advanced = $.cookie( 'advanced' ),
            sh = 0, hi = 0, to = 0, t;
        for ( var k in st ) {
          to++;
          var sby = st[k].begin;
          var sey = st[k].end;
          var ck = document.getElementById('st_'+k);
          if (
              (!sby || sby < endT)
              &&
              (!sey || sey > beginT)
            ) {
           // st[k].marker.show();
            if ( !advanced && !st[k].main ) {
              st[k].marker.hide();
              if ( ck && ck.parentNode ) {
                ck.parentNode.style.display = 'none';
              }
            }
            else {
              st[k].marker.show();
              if ( ck && ck.parentNode ) {
                ck.parentNode.style.display = '';
              }
            }

            sh++;
            t = true;
          }
          else {
            st[k].marker.hide();
            if ( ck && ck.parentNode ) {
              ck.parentNode.style.display = 'none';
            }
            hi++;
            t = false;
          }
        }
      }
    } 


  }



  // chart resize fix
  var am_chart = $( '#chart' );
  var am_timer = null;
  var am_fm = null;
  if ( am_chart.length ) {
    $( window ).bind('resize', function () {
      var am_fm = am_fm || am_chart.children('object');
      if ( am_fm ) {
        am_fm.width( am_chart.width() );
        if ( am_fm && am_fm[0] && am_fm[0].setParam ) {
          am_fm[0].setParam('width', parseInt( am_chart.width(), 10 )  );
        }
      }
    });
  }


  // dir indicates directional dominance, that is, who wins out where differences occur
  var _markerCache = null;
  function syncmarkers ( dir ) {
    ;;;log('sync markers');
    var dir = /^form|map$/.test( dir ) ? dir : 'form'; 
    _markerCache = _markerCache || $(':checkbox[name=st]');
    _markerCache.each(function(){
      var id = this.value;
      var checked = this.checked;
      var selected = datamarket.mapselect.stationSelected( id );

      // station is disabled or hidden
      if ( this.disabled || !this.clientHeight || !this.clientWidth ) {
        datamarket.mapselect.deselectStation( id );
        this.checked = false;
      }
      // station is available ...
      else {
        if ( dir == 'map' ) {
          this.checked = ( selected );
        }
        else if ( dir == 'form' && checked != selected ) {
          if ( checked ) {
            datamarket.mapselect.selectStation( id );
          }
          else {
            datamarket.mapselect.deselectStation( id );
            this.checked = false;
          }
        }
      }
    });
  }


  // enhanced selectionlists 
  $('.attributes fieldset :checkbox, .st :checkbox').multiselect({
    boundarysearch : false
  });


  // collapsable groups
  $('.attributes fieldset').each(function () {
    
    var container = $( this );
    var header    = $( ':header', this );
    var body      = $( 'ul.formcontrol:first', this );
    
    header
      .wrapInner( '<a href="#"></a>' )
      .find( 'a:first' ).click(function(e){
        var vis = body.is(':visible');
        body.slideToggle( 'fast' );
        if ( vis ) {
          container.addClass( 'closed' );
          container.find( 'div.filter' ).show().fadeOut( 'fast' );
        }
        else {
          container.removeClass( 'closed' );
          container.find( 'div.filter' ).hide().fadeIn( 'fast' );
        }
        return false;
      });
    
    // start open or closed?
    if ( container.hasClass('closed') ) {
      body.hide();
    }

  });

  // map selections
  if ( window.datamarket && datamarket.mapselect && datamarket.mapselect.init ) {
    
    ;;;log( 'map selections init' );
    
    // ajax fetch some weather stations 
    var dataurl = '/vedurtorg/stations.json';
    var defaultStart = $( 'input#fromdate' ).datepicker( 'getDate' ).getTime();
    var now = new Date().getTime();
    var orgh = $( '#map' ).height();
    $( 'body' ).addClass( 'map-loading' );
    $( '#map' ).animate({ 'height' : '400px' }, 400);

    // TODO: make sure that request overrides the 
    var startstations = {};
    $.each( (document.location.search + '').match( /[&?]st=[^&?]+/g )||[], function(i,n) {
      startstations[n.substr(4)] = true;
    })
    $(':checkbox[name=st]').each(function () {
      if ( this.checked ) {
        startstations[ this.value ] = true;
      }
      else if ( startstations[ this.value ] ) {
        this.checked = true;
      }
    });

    $.ajax({
       type: 'GET',
       url: dataurl,
       dataType: "json",
       error: function () {
         $( 'body' ).removeClass( 'map-loading' );
         $( '#map' ).css({ 'background' : '#f88' }).animate({ 'height' : orgh }, 400, function () {
           $( this ).css({ 'height' : '', 'background' : '#fff' });
         });
       },
       success: function ( data ) {
         ;;;log('stations.json arrives');
         $( '#map' ).html( '' ).animate({ 'height' : '400px' }, 400, function () {
           
           // convert dates, find oldest, hide stations out of default range
           var oldest = Infinity;
           for ( var k in data ) {
             var o = data[k];
             // convert timevalues to timestamps
             o.begin = (o.begin) ? new Date( o.begin[0], o.begin[1]-1, o.begin[2] ).getTime() : now;
             o.end   = (o.end) ? new Date( o.end[0], o.end[1]-1, o.end[2] ).getTime() : now;
             // find oldest timestamp
             if ( o.begin < oldest ) {
               oldest = o.begin;
             }
             // hide stations terminating before the default start
             if ( o.end < defaultStart ) {
               o.startHidden = true;
             }
             // 
             if ( startstations[k] ) {
               o.startSelected = true;
             }
           }
           
           if ( oldest < Infinity ) {
             // limit from-date to 1 day of the first found year
     			   var d = new Date( oldest );
             var currYear = new Date().getFullYear();
             $( 'input#fromdate, input#todate' )
                   .datepicker( 'option', 'minDate', d )
                   .datepicker( 'option', 'yearRange', d.getFullYear() + ':' + ( currYear + 1 ) );
           }

           $( 'body' ).removeClass( 'map-loading' ).addClass( 'map-active' );

           // run the map
           window.ST = data;
           datamarket.mapselect.init(data, {
             onImgUrl:  ( window.MEDIA_URL || '' ) + 'img/map/mm_20_yellow.png',
             onShdUrl:  ( window.MEDIA_URL || '' ) + 'img/map/mm_20_shadow.png',
             offImgUrl: ( window.MEDIA_URL || '' ) + 'img/map/mm_20_blue.png',
             offShdUrl: ( window.MEDIA_URL || '' ) + 'img/map/mm_20_shadow.png'
           });

           constrictSelection(
             $( 'input#fromdate' ).datepicker( 'getDate' ),
             $( 'input#todate' ).datepicker( 'getDate' )
           );

           // if a mark
           $('#map').bind('markerselect',function(e){
             ;;;log('markerselect');
             syncmarkers('map');
           });
           $('fieldset.st').bind('change click',function(e){
             ;;;log('station checked');
             syncmarkers('form');
           });
           
         }); // animate callback

       } // success
     });

  }

  // -- table paging --
  var table = $( 'table:has(.pager)' );
  if ( table.length ) {
    var query = ( document.location.search + '' );
    var RR = /[?&]startoffset=([^?&]*)/g;
    var offs = RR.test( query ) ? +RegExp.$1 : 0;
    var url = '/vedurtorg/timeseries.json' + query.replace( RR, '' );
    var last = /\s(\d+)\s*$/.test( table.find('.pager .status').text() ) ? +RegExp.$1 : 9999;
    table.pager({
      baseurl:  url + '&startoffset=%d',
      stepsize: 20,
      offset:   offs,
      last:     last,
      pager:    'pager',
      statusCallback: function ( d ) {
        // wrap status with a permalink  
        var url = query.replace( RR, '' ) + '&startoffset=' + this.config.offset;
        return '<a href="./' + url +'" title="Slóð á þessa stöðu" class="permalink">' + d + '</a>';
      }
    });
  }
  
  
  // -- permalink 
  var permalink = $( '<a href="#" class="permalink" id="formlink">Varanleg slóð á þessar stillingar</a>' );
  $( 'form#weatherquery' ).bind('click change', function () {
    var url = $( this ).serialize();
    url = url.replace( /[?&]auto_\d+=[^?&]*/g, '' );
    url += '&mode=form';
    permalink.attr( 'href', './?' + url );
  });
  $( '#weatherquery .buttons' ).append( permalink ).trigger('change');


  // form validation
  $( 'form#weatherquery' ).autovalidate();


});
