/**
 * copyright (C) 2009 COC
 */


// ---- Config ----

// Namespace to bind vars.
var coc = { isIE6: ( jQuery.browser.msie && jQuery.browser.version < 7.0 )
             };


(function($)
{
  var themePath = '';

// ---- Init ----

if( window.jQuery )
{
  // Attach init function
  $(document).ready( OnDomReady );
  
  // Tell CSS that JavaScript is enabled.
  $(document.documentElement).addClass("jsenabled");
}

function OnDomReady()
{
  // Workarround missing li:hover support.
  if( coc.isIE6 )
  {
    var addHover    = function() { $(this).addClass("hover"); }
      , removeHover = function() { $(this).removeClass("hover"); };
    $("#menu li").hover( addHover, removeHover );

    // Special effect for striped logo
    $("#headerpart1 > .stripedlogo").hover( function() { $(this).addClass("stripedlogo-hover") }
                                          , function() { $(this).removeClass("stripedlogo-hover") }
                                          );
  }
  
  var scriptUrl = jQuery("script[src$='coc.js']").attr('src');
  themePath = scriptUrl.substring(0, scriptUrl.lastIndexOf('/coc.js'));
  

  initOverlabels();
  initCalendar();
}


// ---- Overlabels ----

function initOverlabels()
{
  // Activate 'overlabels' for compact forms
  var labelsMap = {};
  var inputs = [];
  var overlabels = $('label.overlabel');
  for( var i = 0, len = overlabels.length; i < len; i++ )
  {
    var label = overlabels.eq( i );
    var id    = label.attr("for");
    var input = null;
    if( ! id || ! ( input = document.getElementById( id ) ) ) return;

    // Track for setTimeout() below.
    labelsMap[ id ] = label;
    inputs.push( input );

    (function(input, label)  // freeze closure variables
      {
        // Implement show/hide effect
        $(input).focus( function() { label.hide(); } )
                .blur ( function() { this.value === '' && label.show(); } );

        // Also for mouse click
        label.mousedown( function() { setTimeout( function() { input.focus(); }, 10 ); } );   // IE requires setTimeout()

      }
    )(input, label);
  }

  // Hide overlabels after the form is auto-filled in by the browser.
  setTimeout( function()
  {
    for( var i = 0; i < inputs.length; i++ )
    {
      var input = inputs[ i ];
      if( input.value !== '' ) labelsMap[ input.id ].hide();
    }
  }, 50 );
}


// ---- Calendar ----

var _calendarMonths = {}
var _processingResponse = false;
var _extrafilter = '';

function initCalendar()
{
  var calendar = $("#calendar");
  if( ! calendar.length ) return;
 
  var defaultDate = new Date();
  var year  = parseInt(calendar.data('year'));
  var month = parseInt(calendar.data('month')) - 1;
  var day   = parseInt(calendar.data('day'));
  var add_popular_tags = parseInt(calendar.data('add_popular_tags') || '0');
  var categories       = calendar.data('categories') || '';
  if( year )
  {
    defaultDate.setFullYear(year, month || 0, day || 1);
  }
  
  if( add_popular_tags ) _extrafilter += '&add_popular_tags=' + encodeURIComponent(add_popular_tags);
  if( categories )       _extrafilter += '&categories=' + encodeURIComponent(categories);

  var calendar = calendar.datepicker({
    defaultDate: defaultDate
  , onSelect: onCalendarSelect
  , onChangeMonthYear: onCalendarMonthYearChanged
  , beforeShowDay: getCalendarDayData
  });
  
  
  // Fetch data for current month
  onCalendarMonthYearChanged( defaultDate.getFullYear(), defaultDate.getMonth() + 1, null );
}


function getCalendarDayData( date )
{
  var myKey = ( date.getMonth() + 1 ) + "-" + date.getFullYear();
  var monthData = _calendarMonths[ myKey ];
  var extraClass = '';
  if( monthData )
  {
    var day = date.getDate();
    if( monthData.days[ day ] != null )
    { 
      extraClass = "day-agenda";
    }
  }

  return [ extraClass != '', extraClass, "" ]; // [ enabled, extraClass, tooltip ]
}


function onCalendarSelect( value, control )
{
  var year  = control.selectedYear;
  var month = control.selectedMonth + 1;
  var day   = control.selectedDay;
  var link = _calendarMonths[ month + "-" + year ].days[ day ];
  
  if( link )
  {
    location.href = link;
  }
  else
  {
    if( month < 10 ) month = "0" + month;
    if( day < 10 )   day = "0" + day;
  
    location.href = '/' + year + '/' + month + '/' + day + '/';
  }   
}


function onCalendarMonthYearChanged( year, month, control )
{
  // Check if the data needs to be requested.
  var myKey = month + "-" + year;
  if( _calendarMonths.hasOwnProperty( myKey ) || _processingResponse )  // has data, or null
    return;

  $.get( themePath + '/calendar-api.php?date=' + encodeURIComponent(myKey) + _extrafilter, function(data)
  {
    _processingResponse = true;
    _calendarMonths[ data.monthYear ] = data.value;

    if( data.value )
      $("#calendar").datepicker('refresh');

    _processingResponse = false;
  });
}


})(window.jQuery);

