/*global $, jQuery, setNielsen, FB, MyRaiTV */
/*jslint indent:2 */
function defaultGlobal(varName, defaultValue) {
  if (typeof(window[varName]) == 'undefined') {
    window[varName] = defaultValue;
  }
}
defaultGlobal('commentsDomain', 'http://www.rai.tv');
defaultGlobal('commentsDisabled', false);

function initBoxCommenti() {
  $('.boxCommenti').filter(function() {
    return $(this).data('commenti') == null;
  }).each(function() {
    var uniquename, self, loc,
        uuidRegExp, matches, typePriorities,
        cleanUrl, commenti;

    uniquename = false;
    self = $(this);
    loc = String(document.location);
    uuidRegExp =
        /((ContentItem|ContentSet|PublishingBlock|Page)-[\w\d]{8}-[\w\d]{4}-[\w\d]{4}-[\w\d]{4}-[\w\d]{12})/gi;
    typePriorities = {
      'ContentItem': 1,
      'ContentSet': 2,
      'PublishingBlock': 3,
      'Page': 4
    }; // lower = better

    if (window.commentsDisabled == true) {
      self.hide();
      self.data('commenti', 'disabled');
    }

    if (self.attr('data-uniquename') != '') {
      uniquename = self.attr('data-uniquename');
    }
    if (!uniquename) {
      uniquename = window.uniquename;
    }
    if (!uniquename) {
      // cerco di estrarre lo uniquename dalla url
      // nel caso in cui siano presenti piu' uuid nella url, estrae quello con
      // priorita' piu' alta, come definito in typePriorities
      // (priorita' all'item piuttosto che al block)
      // es: www.radio1.rai.it/dl/radio1/2010/programmi/archivio/\
      // PublishingBlock-fe26ac22-d982-42f4-9079-465f3bf2acd6.html?\
      // ContentSet-e8f6b143-9aa3-49ec-9b66-2c33d15631df-P-0.html
      matches = loc.match(uuidRegExp);
      if (matches != null && matches.length > 0) {
        matches = matches.sort(function(a, b) {
          var aa, bb;
          aa = typePriorities[a.substring(0, a.indexOf('-'))] || 10;
          bb = typePriorities[b.substring(0, b.indexOf('-'))] || 10;
          return aa - bb;
        });
        uniquename = matches[0];
      }
    }

    if (self.attr('data-url') != '') {
      cleanUrl = self.attr('data-url');
    }
    if (!cleanUrl) {
      cleanUrl = loc;
      if (/\/dl\/RaiTV\//.test(cleanUrl)) {
        cleanUrl = document.location.protocol +
            '//www.rai.tv' + document.location.pathname +
            (document.location.search || '');
        // (document.location.hash || ''); // l'hash e' di troppo
      }
      cleanUrl = cleanUrl.replace(/[&?]refresh_ce/, '');
      cleanUrl = cleanUrl.replace(/[&?#]p=\d+/, '');
    }

    commenti = new Commenti({
      uniquename: uniquename,
      url: cleanUrl,
      container: self,
      commentsPerPage: 10
    });
    self.data('commenti', commenti);
    if (!!uniquename) {
      $('.Player[data-id=' + uniquename + ']').
          parent().
          find('ul.opzVod li.Comm').click(function() {
            $('body').animate({
                scrollTop: self.offset().top
              }, 500);
            return false;
          }).show();
    }
  });
}
$(initBoxCommenti);


var Commenti = function(options) {
  var defaults, opts, mid,
      tabbar, allTabs, tabMyRaiTV, tabFacebook,
      btnMyRaiTV, btnFacebook,
      urlAddComment, urlGetComments,
      myraitvIsAvailable,
      commentsList,
      messages,
      dateThresholds, dateFormatValues,
      currCommentPage,
      eventStatsLoaded;

  eventStatsLoaded = 'StatsLoaded';

  defaults = {
    url: null,
    uniquename: null,
    container: null,
    commentsPerPage: 10
  };
  opts = $.extend({}, defaults, options);

  // controllo i parametri
  // if (!opts.uniquename) {
  //   throw 'No uniquename defined!';
  // }
  if (!opts.container) {
    throw 'No uniquename defined!';
  }


  urlAddComment = '/MyRaiTv/addComment.do';
  urlGetComments = '/StatisticheProxy/proxy.jsp?action=getContent' +
      '&domain=RaiTv' +
      '&xsl=rai_tv-statistiche-content-json' +
      '&localId=' +
      opts.uniquename;

  messages = {
    'commentOk': 'Commento inserito correttamente.\n' +
        'I commenti sono moderati: il tuo messaggio non sarà visibile ' +
        'fino a quando non sarà approvato dalla redazione.',
    'commentError': 'Si è verificato un errore durante l\'inserimento ' +
        'del commento.\nRiprovare più tardi.'
  };



  // permetto di accedere alle opzioni, in sola lettura
  this.getOptions = function() {
    return $.extend({}, opts);
  };



  tabbar = opts.container.find('>.mid>.tabCommenti');
  allTabs = opts.container.find('>.mid>.page');
  tabMyRaiTV = opts.container.find('>.mid>.page.myraitv');
  tabFacebook = opts.container.find('>.mid>.page.facebook');

  allTabs.hide();

  // Commenti facebook
  btnFacebook = tabbar.find('>li.Facebook a').click(function() {
    if (!tabFacebook.is(':visible')) {
      tabbar.find('>li').removeClass('selected');
      $(this).parent().addClass('selected');
      allTabs.hide();
      tabFacebook.show();
      createFBCommentsWidget();
      setNielsen();
    }
    return false;
  });
  this.btnFacebook = btnFacebook;
  function createFBCommentsWidget() {
    if (!opts.url) {
      // tabbar.find('>li.Facebook').hide();
      tabFacebook.html('<h3 class="error" data-err="no-url">' +
                       'I commenti tramite Facebook non ' +
                       'sono attualmente disponibili</h3>');
    } else if (typeof(FB) == 'undefined') {
      tabFacebook.html('<h3 class="error" data-err="no-FB">' +
                       'I commenti tramite Facebook non ' +
                       'sono attualmente disponibili</h3>');
      window.fbAsyncInit = (function(f) {
        return function() {
          createFBCommentsWidget();
          if (typeof(f) == 'function') {
            return f();
          } else {
            return null;
          }
        };
      })(window.fbAsyncInit);
    } else {
      tabFacebook.html('<div class="fb-comments" ' +
                       'data-href="' + opts.url + '" ' +
                       'data-num-posts="10" ' +
                       'data-width="648" ' +
                       'data-colorscheme="dark"></div>');
      FB.XFBML.parse();
    }
  }

  // Commenti MyRaiTV

  // controllo che statisticheproxy risponda:
  // se non e' raggiungibile, niente commenti myraitv

  /*
  $.ajax({
    url: urlGetComments,
    type: 'HEAD',
    dataType: 'json',
    cache: false,
    async: false,
    error: function() {
      myraitvIsAvailable = false;
    },
    success: function(data, status, xhr) {
      myraitvIsAvailable = true;
    }
  });
  */
  myraitvIsAvailable = MyRaiTV.isAvailable;

  btnMyRaiTV = tabbar.find('>li.Commenta a').click(function() {
    if (!tabMyRaiTV.is(':visible')) {
      tabbar.find('>li').removeClass('selected');
      $(this).parent().addClass('selected');
      allTabs.hide();
      tabMyRaiTV.show();
      setNielsen();
    }
    return false;
  });
  this.btnMyRaiTV = btnMyRaiTV;

  window.skipNextNielsen = true;
  if (tabbar.find('>li.selected a').length > 0) {
    tabbar.find('>li.selected a').click();
  } else {
    tabbar.find('>li:first a').click();
  }
  window.skipNextNielsen = false;


  if (myraitvIsAvailable && !!opts.uniquename) {

    function myRaiTVLoginStatusChanged() {
      if (MyRaiTV.getUser() == null) {
        tabMyRaiTV.find('.Form.sendComment').hide();
        tabMyRaiTV.find('.Form.login').show();
      } else {
        tabMyRaiTV.find('.Form.sendComment').show();
        tabMyRaiTV.find('.Form.login').hide();
      }
    }

    if (typeof($.fn.placeholder) == 'function') {
      tabMyRaiTV.find(':input').placeholder();
    }

    $(document).bind(MyRaiTV.events.userLoggedIn + ' ' +
                     MyRaiTV.events.userLoggedOut,
                     myRaiTVLoginStatusChanged);
    myRaiTVLoginStatusChanged();
    this.myRaiTVLoginStatusChanged = myRaiTVLoginStatusChanged;

    // funzione per disattivare i link
    function retFalse() {
      return false;
    }

    // barra opzioni: numero commenti e tasto "commenta"
    function initOptions() {
      $(document).bind('StatsLoaded', function(e, data) {
        if (data.localId == opts.uniquename) {
          tabMyRaiTV.
              find('.Opzioni a.Commenti strong span').
              text(data.commentsCount);
        }
      });
      tabMyRaiTV.find('.Opzioni a.Commenta').click(function() {
        var user, formComment;
        user = MyRaiTV.getUser();
        formComment = tabMyRaiTV.find('.Form.sendComment');
        if (user != null && !formComment.is(':visible')) {
          formComment.slideDown(1000);
        }
        return false;
      });
    }
    initOptions();

    // gestione form di login
    function initLoginForm() {
      var form, user, pass, fldUser, fldPass, divFeedback;
      form = tabMyRaiTV.find('.Form.login');
      fldUser = form.find('input[name="username"]');
      fldPass = form.find('input[name="password"]');
      function sendLogin() {
        user = fldUser.val() || '';
        pass = fldPass.val() || '';
        if (user != fldUser[0].defaultValue &&
            pass != fldPass[0].defaultValue) {
          divFeedback = $('<div class="feedback loading" />');
          form.append(divFeedback);
          MyRaiTV.sendLogin(user, pass, function() {
            divFeedback.remove();
          });
        }
        return false;
      }
      form.wrapInner('<form action="#" method="post"></form>');
      form.find('form').bind('submit', sendLogin);
    }
    initLoginForm();

    // gestione form di invio commento
    function initCommentForm() {
      var container, form, user, fldUser, fldComment, divFeedback,
          feedbackDelay, feedbackAnimationDuration;

      feedbackDelay = 5000;
      feedbackAnimationDuration = 500;

      container = tabMyRaiTV.find('.Form.sendComment');
      // form.find('.Submit ').click(sendLogin);
      container.wrapInner('<form action="#" method="post"></form>');
      form = container.find('>form');
      fldComment = form.find(':input[name="content"]');
      fldUser = form.find(':input[name="username"]');

      function setUser() {
        user = MyRaiTV.getUser();
        if (user != null) {
          fldUser.val(user.username);
          fldUser.prop('defaultValue', user.username);
        }
      }
      setUser();
      $(document).bind(MyRaiTV.events.userLoggedIn, setUser);


      function resetComment() {
        fldComment.val(fldComment[0].defaultValue);
      }
      function commentKo() {
        var msg;
        divFeedback.removeClass('loading');
        msg = messages.commentError || 'Errore';
        msg = msg.replace('\n', '<br />');
        divFeedback.html(msg);
        divFeedback.delay(feedbackDelay).
            fadeOut(feedbackAnimationDuration, function() {
              divFeedback.remove();
            });
      }
      function commentOk(result) {
        var res, msg;
        res = result.split('-');
        if (/^ok$/i.test(res[0])) {
          divFeedback.removeClass('loading');
          msg = messages.commentOk || 'Ok';
          msg = msg.replace('\n', '<br />');
          divFeedback.html(msg);
          container.delay(feedbackDelay).
              slideUp(feedbackAnimationDuration, function() {
                form[0].reset();
                divFeedback.remove();
              });
          // divFeedback.delay(feedbackDelay).
          //   fadeOut(feedbackAnimationDuration, function() {
          //     form[0].reset();
          //   });
        } else {
          commentKo();
        }
      }
      function sendComment() {
        var content, postData;
        content = fldComment.val() || '';
        if (content != fldComment[0].defaultValue &&
            !container.is('.loading')) {
          // toglie il focus a tutti i campi e sovrappone un div per il feedback
          form.find(':input').blur();
          divFeedback = $('<div class="feedback loading" />');
          container.append(divFeedback);
          user = MyRaiTV.getUser();
          // post comment
          postData = {
            username: user.username,
            confirmKey: user.confirmKey,
            domain: 'RaiTv',
            localId: opts.uniquename,
            textBody: content
          };

          $.ajax({
            type: 'POST',
            url: urlAddComment,
            contentType: 'application/x-www-form-urlencoded; charset=utf-8',
            data: postData,
            dataType: 'text',
            success: commentOk,
            error: commentKo
          });
        }
        return false;
      }

      form.bind('submit', sendComment);
    }
    initCommentForm();

    // caricamento commenti e paginazione

    dateThresholds = {
      days: 3 * 24 * 60 * 60 * 1000, // oltre 3 giorni: stampo la data completa
      day: 24 * 60 * 60 * 1000, // oltre 1 giorno: n giorni fa
      hours: 60 * 60 * 1000, // oggi: n ore fa
      minutes: 60 * 1000, // minuti: n minuti fa
      seconds: 1000 // secondi: n secondi fa
    };
    dateFormatValues = {
      day: 24 * 60 * 60 * 1000, // 1 giorno
      hour: 60 * 60 * 1000, // 1 ora
      minute: 60 * 1000, // 1 minuto
      second: 1000 // 1 secondo
    };
    function formatDate(dateString) {
      // 09/10/2009 13:27:07
      var res =
          dateString.replace(/(\d\d)\/(\d\d)\/(\d\d\d\d) (\d\d:\d\d:\d\d)/,
                             '$3/$2/$1 $4');
      var d = new Date(res);
      var now = getServerTime();
      var delta = now - d;

      if (delta < 0) {
        // non dovrebbe succedere... ma non si sa mai...
        res = '1 secondo fa';
      } else if (delta < dateThresholds.minutes) {
        delta = Math.floor(delta / dateFormatValues.second);
        res = delta + ' second' + (delta == 1 ? 'o' : 'i') + ' fa';
      } else if (delta < dateThresholds.hours) {
        delta = Math.floor(delta / dateFormatValues.minute);
        res = delta + ' minut' + (delta == 1 ? 'o' : 'i') + ' fa';
      } else if (delta < dateThresholds.day) {
        delta = Math.floor(delta / dateFormatValues.hour);
        res = delta + ' or' + (delta == 1 ? 'a' : 'e') + ' fa';
      } else if (delta < dateThresholds.days) {
        delta = Math.floor(delta / dateFormatValues.day);
        if (delta == 1) {
          res = 'ieri';
        } else {
          res = delta + ' giorni fa';
        }
      } else {
        res = dateString.replace(/(\d\d)\/(\d\d)\/(\d\d\d\d) (\d\d:\d\d):\d\d/,
                                 '$1/$2/$3 $4');
      }

      return res;
    };

    function renderComment(comment) {
      var li, id, n, d, b;
      id = comment.author + ' - ' + comment.commentDate;
      id = id.replace(/\W/g, '_');
      li = $('<li />');
      li.attr('id', id);
      li.data('comment', comment);

      n = $('<strong />').text(comment.author);
      li.append(n);
      li.append(' - ');
      d = $('<span />').text(formatDate(comment.commentDate));
      li.append(d);
      b = $('<p />').text(comment.textBody);
      li.append(b);
      return li;
    };

    function loadCommentsFromIndex(startIndex, insertAtTop) {
      var url;
      url = urlGetComments;

      url = url +
          '&beginningIndexForComments=' + (startIndex) +
          '&endIndexForComments=' + (startIndex + opts.commentsPerPage - 1);

      setNielsen(url);

      $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        cache: false,
        error: function() {
          console.log('Error getting comments...');
        },
        success: function(data) {
          var i, li, addedCount, firstItem, commentsShown, msg, delta, id;
          data = data.items[0];
          data.commentsCount = parseInt(data.commentsCount || '0');
          $(document).trigger(eventStatsLoaded, data);
          addedCount = 0;
          firstItem = commentsList.find('>li:first');
          for (i = 0; i < data.comments.length; i++) {
            li = renderComment(data.comments[i]);
            id = li.attr('id');
            if (commentsList.find('li#' + id).length == 0) {
              if (!insertAtTop) {
                commentsList.append(li);
              } else {
                firstItem.before(li);
              }
              // li.css({backgroundColor: '#3E80C8'}).
              li.css({backgroundColor: '#1F4064'}).
                  hide().
                  fadeIn(1000, function() {
                    $(this).css({backgroundColor: '', display: ''});
                  });
              addedCount++;
            }
          }
          if (!insertAtTop) {
            // se ho saltato l'inserimento di qualche commento, significa che
            // e' arrivato un nuovo commento.
            // Es: un caricamento precedente mi aveva
            // mandato il commento C come terzo, se mi e' arrivato di nuovo
            // come commento in quinta posizione
            // vuol dire che e' stato "spinto giu'" da due commenti nuovi
            if (addedCount != data.comments.length) {
              // sono arrivati nuovi commenti: caricali all'inizio!
              window.skipNextNielsen = true;
              loadCommentsFromIndex(0, true);
            }
          }
          commentsShown = commentsList.find('>li').length;
          // aggiorna il link "mostra altri"
          delta = data.commentsCount - commentsShown;
          if (delta > 0) {
            msg = 'Mostra gli altri ' + delta + ' commenti';
            btnAllComments.removeClass('loading').find('span').text(msg);
            btnAllComments.unbind('click').bind('click', function() {
              btnAllComments.addClass('loading');
              loadCommentsFromIndex(commentsShown + 1, false);
              btnAllComments.unbind('click').bind(retFalse);
              return false;
            });
            btnAllComments.show();
          } else {
            btnAllComments.hide();
          }
        }
      });

    }
    commentsList = $('<ul class="listaCommenti" />').appendTo(tabMyRaiTV);
    btnAllComments = $('<a href="#" class="btnAllComm" />').
        hide().
        appendTo(tabMyRaiTV);
    btnAllComments.append('<span />');
    window.skipNextNielsen = true;
    loadCommentsFromIndex(1, false);
    this.loadCommentsFromIndex = loadCommentsFromIndex;
  } else {
    tabMyRaiTV.html('<h3 class="error">MyRaiTv non è al ' +
                    'momento raggiungibile.</h3>');
  }

  return this;
};

