
var Cookie = {
  build: function() {
    return $A(arguments).compact().join("; ");
  },
  secondsFromNow: function(seconds) {
    var d = new Date();
    d.setTime(d.getTime() + (seconds * 1000));
    return d.toGMTString();
  },
  set: function(name,value,seconds){
    var expiry = seconds ? 'expires=' + Cookie.secondsFromNow(seconds) : null;
    document.cookie = Cookie.build(name + "=" + value, expiry, "path=/");
  },
  get: function(name){
    var valueMatch = new RegExp(name + "=([^;]+)").exec(document.cookie);
    return valueMatch ? valueMatch[1] : null;
  },
  unset: function(name){
    Cookie.set(name,'',-1);
  }
};

var Caret = {
  classCurrent : 'highlight',
  
  getRows: function() {
    var table = $('news-items');
    return table ? table.getElementsByTagName('tbody')[0].getElementsByTagName('tr') : [];
  },
  
  init: function () {
    var feedItem = Cookie.get('current_item');

    if ($(feedItem)) {
      Caret.setCurrentRow($(feedItem));
    }
    else if (feedItem) {
      var rows = Caret.getRows();
      if (feedItem == 'top' || feedItem == 'bottom') {
        // Unterste Zeile ist noch der erweiterte Text, deswegen - 2
        Caret.setCurrentRow((feedItem == 'top' || rows.length == 0) ? rows[0] : rows[rows.length-2]);
      }
    }
        
    Event.observe(document, 'keydown', Caret.keypress);
  },
  
  keypress: function (e) {
    var src = Event.element(e);
    if (/input|select|textarea/.test(src.nodeName.toLowerCase())) {
        // don't do anything if key is pressed in input, select or textarea
      return;
    }
    if (e.ctrlKey || e.shiftKey) {
      return;
    }

    switch (e.keyCode) {
      case 74:       // user pressed "j" move down
          Caret.nextRow();
          Event.stop(e);
          break;
      case 75:      // user pressed "k" move up
          Caret.previousRow();
          Event.stop(e);
          break;
      case 79:     // user pressed "o" open item
          window.location = Caret.currentRow.getElementsByTagName('a')[0].href;
          Event.stop(e);
          break;
          
      case 66:  // user pressed "b" rate bad
        var itemId = Caret.currentRow.id.substr(Caret.currentRow.id.lastIndexOf('-') + 1);
        Feeds.rateBad(itemId);
        Event.stop(e);
        break;

      case 71:  // user pressed "g" rate good
        var itemId = Caret.currentRow.id.substr(Caret.currentRow.id.lastIndexOf('-') + 1);
        Feeds.rateGood(itemId);
        Event.stop(e);
        break;
    }
  },
  
  ensureVisible: function(element) {
    var topOffset = element.viewportOffset().top;
    var scrollOffsets = document.viewport.getScrollOffsets();
    
    // Damit auch der erweiterte Text angezeigt wird, 
    // müssen wir diesen in die Höhe mit einbeziehen
    var elementHeight = element.getHeight();
    var row = element;
    while (row = row.nextSibling) {
      if ('tr' == row.nodeName.toLowerCase() && row.hasClassName('news-item-body')) {
        elementHeight += row.getHeight();
        break;
      }
    }
    
    // Viewport - element.getHeight(), damit auch gescrollt wird, wenn nur ein
    // kleiner Teil des Elementes sichtbar ist
    if (topOffset > document.viewport.getHeight() - elementHeight) {
        window.scrollTo(scrollOffsets.left, scrollOffsets.top + topOffset - document.viewport.getHeight() + elementHeight);
    } else if (topOffset < 0) {
        window.scrollTo(scrollOffsets.left, scrollOffsets.top + topOffset);   
    }
  },
  
  setCurrentRow: function(row) {
    if (!row.getElementsByTagName('td')[0].onclick) return;
     
    row.addClassName(Caret.classCurrent);
    row.getElementsByTagName('td')[0].onclick();
    Caret.currentRow = row;
    Caret.ensureVisible(row); 
  },
  
  nextRow: function () {
    var row = Caret.currentRow;
    if (!row) {
        Caret.setCurrentRow(Caret.getRows()[0]);
        return;
    }
    
    while ((row = $(row.nextSibling))) {
      if ('tr' == row.nodeName.toLowerCase() && row.visible() && row.hasClassName('news-item-header')) {
        Element.removeClassName(Caret.currentRow, Caret.classCurrent);
        Caret.setCurrentRow(row); 
        return;
      }
    }
    // we've reached the bottom of the list
    if ($('next')) {
      Cookie.set('current_item','top');
      window.location = $('next').href;
      return;
    }
  },
  
  previousRow: function () {
    var row = Caret.currentRow;
    while ((row = $(row.previousSibling))) {
      if ('tr' == row.nodeName.toLowerCase() && row.visible() && row.hasClassName('news-item-header')) {
        Element.removeClassName(Caret.currentRow, Caret.classCurrent);
        Caret.setCurrentRow(row);
        return;
      }
    }
    // we've reached the top of the list
    if ($('previous')) {
      Cookie.set('current_item','bottom');
      window.location = $('previous').href;
      return;
    }
    
  }
};

var Feeds = {
    lastShownElement: null,
    
    rateGood: function(itemId, feedId)
    {
        var onclickBad = $('rate-bad-' + itemId).onclick;
        var onclickGood = $('rate-good-' + itemId).onclick;
        $('rate-bad-' + itemId).onclick = null;
        $('rate-good-' + itemId).onclick = null;
        
        $('rate-good-' + itemId).src = waitRatingUrl ;
        $('rate-bad-' + itemId).src = unratedBadUrl;
        
        new Ajax.Request(setRatingUrl, {
                         method: 'get', parameters: {feedItemId: itemId, rating : 1},
                         onSuccess : function() {
                           $('rate-good-' + itemId).src = rateGoodUrl;
                           $('rate-bad-' + itemId).onclick = onclickBad;
                           $('rate-good-' + itemId).onclick = onclickGood;
                           Feeds.markAsRead(itemId, feedId);
                         }
                         });
    },
    
    rateBad: function(itemId, feedId)
    {
        var onclickBad = $('rate-bad-' + itemId).onclick;
        var onclickGood = $('rate-good-' + itemId).onclick;
        $('rate-bad-' + itemId).onclick = null;
        $('rate-good-' + itemId).onclick = null;
        
        $('rate-bad-' + itemId).src = waitRatingUrl;
        $('rate-good-' + itemId).src = unratedGoodUrl;
        
        new Ajax.Request(setRatingUrl, {
                         method: 'get', parameters: {feedItemId: itemId, rating : 0},
                         onSuccess: function() {
                           $('rate-bad-' + itemId).src = rateBadUrl;
                           $('rate-bad-' + itemId).onclick = onclickBad;
                           $('rate-good-' + itemId).onclick = onclickGood;
                           Feeds.markAsRead(itemId, feedId);
                         }
                         });
    },
    
    markAsRead: function(itemId, feedId)
    {
      // Beiträge als gelesen markieren
      if ($('news-item-header-' + itemId).hasClassName('unread'))
      {
        $('news-item-header-' + itemId).removeClassName('unread');
        
        // Anzahl der ungelesenen Items (gesamt) verringern
        if ($('news-item-count-total')) {
          var totalCount = $('news-item-count-total').innerHTML;
          if (totalCount > 1) {
            $('news-item-count-total').update(totalCount - 1);
          } else {
            $('news-item-count-total').parentNode.hide();
          }
        }
        
        if ($('news-item-count-' + feedId)) {
          var feedCount = $('news-item-count-' + feedId).innerHTML;
          if (feedCount > 1) {
            $('news-item-count-' + feedId).update(feedCount - 1);
          } else {
            $('news-item-count-' + feedId).parentNode.hide();
          }
        }

        new Ajax.Request(markAsReadUrl, { method: 'get', parameters: {feedItemId: itemId} });
      }
    },
    
    expandItem: function(itemId, feedId)
    {
      // Bei Klick auch den Caret aktualisieren und speichern
      Cookie.set('current_item', 'news-item-header-' + itemId);
      if (Caret.currentRow) {
        Caret.currentRow.removeClassName('highlight');
      }
      Caret.currentRow = $('news-item-header-' + itemId);
      
      Feeds.markAsRead(itemId, feedId);
      
      // Wenn es keine erweiterte Beschreibung gibt, kein
      // ausklappen und als gelesen markieren ermöglichen
      if (!$('news-item-' + itemId)) {
        if (Feeds.lastShownElement) {
          Feeds.lastShownElement.hide();
        }
        Feeds.lastShownElement = null;
        return;
      }

      // Immer nur einen Beitrag geöffnet lassen
      if ($('news-item-' + itemId).visible()) {
        // Schon sichtbar, *nur* zuklappen nötig -> Beitrag nicht merken
        $('news-item-' + itemId).hide()
        Cookie.set('current_item', null);
        Feeds.lastShownElement = null;
        return;
      } else {
        $('news-item-' + itemId).show()
        if (Feeds.lastShownElement) {
          Feeds.lastShownElement.hide();
        }
        Feeds.lastShownElement = $('news-item-' + itemId);
      }
      
      new Ajax.Updater('duplicates-' + itemId, getDuplicatesUrl + itemId, {asynchronous:true, evalScripts:false});
    }
}

Event.observe(window,'load', function() { Caret.init() } );