/////////////////////////////////
/////////////////////////////////
//CALENDARIO/////////////////////

// var mesi;
// var dow;
// nowViewing è la data attuale, dipende dall'indirizzo o da oggi


var animDurationPerStep = 160;
var singleDataHeight = 55;
var steps;
var moving = false;
var timeoutColonne;
var timeoutTable;

$(document).ready( function() {

  $scrolldate = $('div.palinsesto div.col.calendario .scroll-date');

  // elimino attributo href dai link del calendario e dalle freccette
  $scrolldate.children('div').each( function() {
    $(this).children('a').attr('href', 'javascript:void(0)');
  });

  $scrolldate.siblings('.go.back').children('a').attr('href', 'javascript:stepBack();');
  $scrolldate.siblings('.go.fw').children('a').attr('href', 'javascript:stepFw()');

  addClicListeners();
});

function addClicListeners() {
  $scrolldate.children('div').each( function() {
    $(this).children('a').unbind('click');
    $(this).children('a').click(handleClick);
  });
}

function handleClick() {
  if (moving) return;
  var dataToGo = convertIdDataToDate($(this).parent('.data').attr('id'));
  var oneDay = 1000*60*60*24;
  
  if (dataToGo > nowViewing) {
    // data nel futuro, stepFw con steps
    var differenza = (dataToGo.getTime() - nowViewing.getTime()) / oneDay;
    stepFw(differenza);
  } else if (dataToGo.getTime() < nowViewing.getTime()){
    // data nel passato, semplice stepBack
    stepBack();
  } else {
    return;
  }
}


// step back può andare indietro solo di uno.
function stepBack() {
  moving = true;
  // le date vanno verso il basso
  $('div.palinsesto div.col.calendario .data.selected').removeClass('selected');
  steps = 1;
  nowViewing.setDate(nowViewing.getDate() - steps);
  var newDiv = buildDateDiv(convertIdDataToDate($scrolldate.children('.data:first').attr('id'), -1));
  $scrolldate.prepend(newDiv);
  $scrolldate.scrollTo(buildAnimationString(true));
  $scrolldate.scrollTo(buildAnimationString(false), animDurationPerStep * steps, {
    onAfter: removeFromEnd
  });
}

function stepFw(step) {
  moving = true;
  // le date vanno verso il basso
  $('div.palinsesto div.col.calendario .data.selected').removeClass('selected');
  if (step == null) {
    steps = 1;
  } else {
    steps = step;
  }
  nowViewing.setDate(nowViewing.getDate() + steps);
  for (var i = 1; i <= steps; i++) {
    var newDiv = buildDateDiv(convertIdDataToDate($scrolldate.children('.data:last').attr('id'), 1));
    $scrolldate.append(newDiv);
  }
  $scrolldate.scrollTo(buildAnimationString(true), animDurationPerStep * steps, {
    onAfter: removeFromStart,
    easing: 'easeInOutQuart'
  });
}

function removeFromEnd() {
  for (var i = 1; i <= steps; i++) {
    $scrolldate.children('.data:last').remove();
  }
  setTodaySelected();
  moving = false;
}

function removeFromStart() {
  for (var i = 1; i <= steps; i++) {
    $scrolldate.children('.data:first').remove();
  }
  $scrolldate.scrollTo(buildAnimationString(false));
  setTodaySelected();
  moving = false;
}

function buildAnimationString(forward) {
  var strOut;
  strOut = forward ? '+' : '-';
  strOut += '=' + (singleDataHeight * steps) + 'px';
  return strOut;
}


function setTodaySelected() {
  
  $newSelected =  $scrolldate.children('#' + convertDateToIdDate(nowViewing));
  $newSelected.addClass('selected');

  $('#debug').html(Math.round(nowViewing.getTime() / 1000));

  // se colonne esiste allora ci sono le colonne da aggiornare
  if (window.colonne !== undefined) {
    clearTimeout(timeoutColonne);
    timeoutColonne = setTimeout(updateColonne, 500);
  }

  // se table esiste sono nella pagina table
  if (window.table !== undefined) {
    clearTimeout(timeoutTable);
    timeoutTable = setTimeout(updateTable, 500);
  }
}

function buildDateDiv(data) {
  //alert(data);
  $newDiv = $('<div id="' + convertDateToIdDate(data) + '" class="data">');
  $newDiv.append('<p>' + dow[data.getDay()] + '</p>');
  $newDiv.append('<a href="javascript:void(0)">' + (data.getDate().toString().length == 1 ? '0' + data.getDate().toString() : data.getDate().toString()) + '</a>');
  $newDiv.append('<p>' + mesi[data.getMonth() + 1] + '</p>');
  $newDiv.children('a').click(handleClick);
  return $newDiv;
}

function convertIdDataToDate(dataIso, addDay) {
  if (addDay == null) {
    addDay = 0;
  }
  
  var year = dataIso.substr(0, 4);
  var month = dataIso.substr(5, 2);
  var day = dataIso.substr(8, 2);
  
  var dateOut = new Date(year, month - 1, day, 0, 0, 0, 0);
  dateOut.setDate(dateOut.getDate() + addDay);

  return dateOut;
}

function convertDateToIdDate(data) {
  var year = data.getFullYear();
  var month = data.getMonth() + 1;
  var mon = month.toString().length == 1 ? '0' + month.toString() : month.toString();
  var day = data.getDate().toString().length == 1 ? '0' + data.getDate() : data.getDate();
  return year + '-' + mon + '-' + day;
}


// ristituisce la da attualemente selezionata nel calendario come array[anno, mese, giorno]
function getSpliceData() {
  var anno = nowViewing.getFullYear().toString();
  var mese = nowViewing.getMonth() + 1;
  if (mese.toString().length == 1) {
    mese = '0' + mese.toString();
  }
  var giorno = nowViewing.getDate();
  if (giorno.toString().length == 1) {
    giorno = '0' + giorno.toString();
  }
  return new Array(anno, mese, giorno);
}


// funzione chiamata anche dai sotto js colonne e table
// prende il pane lo opacizza e mostra il loader
function isLoading(pane, loader) {
  if (pane.attr('id') == 'the-table') {
    pane.children('tbody').css('color', '#DDD');
    //pane.children('a').each( function() { $(this).css('color', '#DDD'); });
  } else {
    pane.animate({
      opacity: 0.5
    }, 200);
  }  
  loader.fadeIn('fast');
}

// funzione chiamata anche dai sotto js colonne e table
// prende il pane lo rende dinuovo visibile e nasconde il loader
function loaded(pane, loader) {
  if (pane.attr('id') == 'the-table') {
    pane.children('tbody').css('color', 'inherit');
  } else {
    pane.animate({
      opacity: 1
    }, 500);
  }
  
  loader.fadeOut('normal');
}




