/* This code is copyright (c) Lars Magne Ingebrigtsen <larsi@gnus.org>.
   It is distributed under the GNU General Public License. */

//document.onkeypress = loom_keypress;

if (document.all) {
  //document.onkeypress = loom_keypress;
  //document.attachEvent("onkeydown", loom_keypress);
  document.attachEvent("onkeypress", loom_keypress);
} else {
  document.onkeypress = loom_keypress;
  //window.addEventListener("keydown", loom_keypress, true);
} 

var LoomStatus = new Array();
var loom_line_height = 17;

keymap = new Array();
keymap[110] = loom_next_unread_article;  /* n */
keymap[112] = loom_prev_unread_article;  /* p */
keymap[78] = loom_next_article;  /* N */
keymap[80] = loom_prev_article;  /* P */
keymap[32] = loom_page_down;  /* SPC */
keymap[8] = loom_page_up;  /* DEL */
keymap[60] = loom_first_article;  /* < */
keymap[62] = loom_last_article;  /* > */
keymap[43] = loom_next_page;  /* + */
keymap[45] = loom_prev_page;  /* - */
keymap[102] = loom_first_page;  /* f */
keymap[108] = loom_last_page;  /* l */
keymap[99] = loom_catchup;  /* c */
keymap[67] = loom_clear_old;  /* C */
keymap[113] = loom_quit;  /* q */
keymap[46] = loom_goto_first_displayed_article;  /* . */
keymap[68] = loom_disable;  /* D */
keymap[38] = loom_prev_subject;  /* up */
keymap[40] = loom_next_subject;  /* down */
keymap[82] = loom_refresh;  /* R */
keymap[84] = loom_taller;  /* T */
keymap[83] = loom_spam;  /* S */
keymap[70] = loom_followup;  /* F */
/* keymap[33] = loom_page_up; */  /* PgUp */
/* keymap[34] = loom_page_down; */  /* PgDown */

var LoomDom = 0;
var LoomDisabled = 0;

var LoomSelectedId = 0;

var Last = 0;

function loom_keypress (e) {
  var key, func;

  if (LoomDisabled == 1)
    return;

  if (e && e.target) { // Netscape
    key = e.which;
    event = e;
    id = e.target.id;
    LoomDom = 2;
    if (key == 0)
      key = e.keyCode;
  } else { // non-Netscape
    e = window.event;
    key = e.keyCode;
    id = e.srcElement.id;
    LoomDom = 0;
  }

  id = id.substring(1);
  //parent.document.title = id;

  func = keymap[key];
  if (func && e.ctrlKey == 0 && e.metaKey == 0) {
    if (key != 33 && key != 34) {
      /* Don't stop propagation for PgUp/PgDown. */
      if (LoomDom == 2) {
	e.stopPropagation();
	e.preventDefault();
      } else {
	e.cancelBubble = true;
	e.returnValue = false;
      }
    }
    func(Math.round(id));
  } else {
    return 0;
  }
}

function setPage (page, focus_last) {
  document.location = '/group/' + GroupName + '/page=' +
    page + '/force_load=very/focus_last=' + focus_last;
}

function loom_next_subject (id) {
  var next = get_next_article(id);
  if (next != -1)
    loom_set_focus(next);
}

function loom_prev_subject (id) {
  var prev = get_prev_article(id);
  if (prev != -1)
    loom_set_focus(prev);
}

function loom_next_article (id) {
  var next = get_next_article(id);
  if (next != -1)
    setArticle(next);
  else 
    loom_next_page(id);
}

function loom_prev_article (id) {
  var prev = get_prev_article(id);
  if (prev != -1)
    setArticle(prev);
  else if (CurrentPage > 0)
    setPage(CurrentPage - 1, "t");
}

function loom_next_unread_article (id) {
  var next = get_next_unread_article(id);
  if (next != -1)
    setArticle(next);
  else 
    loom_next_page(id);
}

function loom_prev_unread_article (id) {
  var prev = get_prev_unread_article(id);
  if (prev != -1)
    setArticle(prev);
  else if (CurrentPage > 0)
    setPage(CurrentPage - 1, "t");
}

function loom_next_page (id) {
  if (CurrentPage < TotalPages - 1)
    setPage(CurrentPage + 1, "");
}

function loom_prev_page (id) {
  if (CurrentPage > 0)
    setPage(CurrentPage - 1, "");
}

function loom_first_page (id) {
  setPage(0, "");
}

function loom_last_page (id) {
  setPage(TotalPages - 1, "");
}

function loom_first_article (id) {
  setArticle(0);
}

function loom_last_article (id) {
  setArticle(Articles.length - 1);
}

function loom_page_down (id) {
  var next = get_next_article(id);
  var content, window, offset; 

  /* The article might not be loaded yet. */
  if (! parent.article.document.body)
    return;

  content = parent.article.document.body.scrollHeight;

  if (LoomDom == 2) {
    offset = parent.article.pageYOffset;
    window = parent.article.innerHeight;
  } else {
    offset = parent.article.document.body.scrollTop;
    window = parent.article.document.body.clientHeight;
  }

  if (content <= window ||
      content - offset <= window) 
    loom_next_article(id);
  else
    parent.article.scroll(0, offset + window - 3 * loom_line_height);
}

function loom_page_up (id) {
  var content, window, offset; 

  /* The article might not be loaded yet. */
  if (! parent.article.document.body)
    return;

  content = parent.article.document.body.scrollHeight;

  if (LoomDom == 2) {
    offset = parent.article.pageYOffset;
    window = parent.article.innerHeight;
  } else {
    offset = parent.article.document.body.scrollTop;
    window = parent.article.document.body.clientHeight;
  }

  if (content <= window ||
      offset > 0) 
    parent.article.scroll(0, offset - window + 3 * loom_line_height);
}

function get_next_article (id) {
  return get_next(id, 0);
}

function get_next_unread_article (id) {
  return get_next(id, "unread");
}

function get_next (id, status) {
  var i, next = 0, found = 0;

  if (id >= LoomStatus.length)
    return -1;

  for (i = id + 1; i < LoomStatus.length; i++) {
    istatus = LoomStatus[i];

    if (status == 0 || istatus[1] == "unread") {
      return i;
    }
  }
  return -1;
}

function loom_set_status (id, status) {
  var i;

  istatus = LoomStatus[id];
  istatus[1] = status;
}

function get_prev_article (id) {
  return get_prev(id, 0);
}

function get_prev_unread_article (id) {
  return get_prev(id, "unread");
}

function get_prev (id, status) {
  var i, prev = 0, found = 0;

  if (id < 1)
    return -1;

  for (i = id - 1; i >= 0; i--) {
    istatus = LoomStatus[i];
    if (status == 0 || istatus[1] == "unread") {
      return i;
    }
  }
  return -1;
}

PrevTR = 0;
PrevTRClass = 0;

function loom_set_focus (id) {
  elem = document.getElementById("w" + id);
  if (elem)
    elem.focus();
}

function loom_focus (id) {
  loom_set_focus(id);

  loom_recenter(id);

  if (PrevTR != 0) {
    if (PrevTRClass == "unread")
      PrevTR.className = "read";
    else
      PrevTR.className = PrevTRClass;
  }

  elem = document.getElementById("t" + id);
  if (elem) {
    PrevTRClass = elem.className;
    elem.className = "focused";
    PrevTR = elem;
    loom_set_status(id, "read");
  }
}

function groupArticle (id) {
  var group = GroupName;

  if (Groups.length > 0 && id != -1 && id <= Groups.length)
    group = Groups[id];

  return group;
}

function setArticle (id) {
  var group = GroupName;

  if (Groups.length > 0 && id != -1 && id <= Groups.length)
    group = Groups[id];

  setGroupArticle(id, group);
}

function setGroupArticle (id, group) {
  var article = Articles[id];
  LoomSelectedId = id;
  loom_add_to_range(article);
  parent.article.location = 'http://article.gmane.org/' +
    group + '/' + article;
  setNavbar(id);
  loom_set_title(id);
}

function setArticleNavbar (article) {
  return setNavbar(loom_article_to_id(article));
}

function setNavbar (id) {
  return setGroupNavbar(id, groupArticle(id));
}

function setGroupNavbar (id, group) {
  var article = Articles[id];
  var prev = get_prev_article(id), 
    next = get_next_article(id);
  var loc, line;
  
  loom_focus(id);

  if (next == -1)
    next = "";
  else
    next = Articles[next];

  if (prev == -1)
    prev = "";
  else
    prev = Articles[prev];

  loc = '/navbar.php?group=' + group + '&article=' + 
    article + '&next=' + next + '&prev=' + prev + 
    '&newsrc=' + loom_range_to_newsrc();

  parent.navigation.location = loc;

  return 0;
}

var LoomRange = new Array();

function loom_create_range (newsrc) {
  var rrange = newsrc.split(',');
  var i, elem;
  for (i = 0; i<rrange.length; i++) {
    elem = rrange[i];
    if (elem.indexOf('-') != -1) {
      nelem = elem.split('-');
      LoomRange[i] = nelem;
    } else {
      LoomRange[i] = new Array(elem, elem);
    }
  }
}

function loom_range_to_newsrc () {
  var newsrc = new Array();
  var i;
  for (i = 0; i<LoomRange.length; i++) {
    elem = LoomRange[i];
    if (elem[0] == elem[1])
      newsrc[i] = elem[0];
    else
      newsrc[i] = elem[0] + "-" + elem[1];
  }
  return newsrc.join(",");
}

function loom_add_to_range (article) {
  var i;
  var rlength = LoomRange.length;

  if (rlength == 0) {
    LoomRange[0] = new Array(article, article);
    return;
  }

  for (i = 0; i<rlength; i++) {
    elem = LoomRange[i];
    low = elem[0];
    high = elem[1];
    if (article >= low && article <= high) 
      break;
    else if (article == low - 1) {
      elem[0] = article;
      break;
    } else if (article == high + 1) {
      elem[1] = article;
      break;
    } else if (article < low) {
      LoomRange.splice(i, 0, new Array(article, article));
      break;
    } else if (i == LoomRange.length - 1) {
      LoomRange.splice(i + 1, 0, new Array(article, article));
    }
  }
}

function loom_setup () {
  var i;
  for (i = 0; i < Articles.length; i++) {
    LoomStatus[i] = new Array(Articles[i], "read");
    if (Articles[i] > Last)
      Last = Articles[i];
  }
  for (i = 0; i < NewArticles.length; i++) {
    if (NewArticles[i])
      LoomStatus[i] = new Array(NewArticles[i], "unread");
  }
  loom_create_range(Newsrc);
}

function loom_catchup (id) {
  LoomRange = new Array(new Array(1, Last));
  loom_alter_all("read");
  setArticle(id);
}

function loom_clear_old (id) {
  LoomRange = new Array();
  loom_alter_all("unread");
  setArticle(id);
}

function loom_alter_all (status) {
  var i;
  PrevTR = 0;
  for (id = 0; id < Articles.length; id++) {
    elem = document.getElementById("t" + id);
    if (elem) {
      elem.className = status;
      loom_set_status(id, status);
    }
  }
}

function loom_article_to_id (article) {
  var i;

  for (i = 0; i < Articles.length; i++) {
    if (article == Articles[i])
      return i;
  }
  return -1;
}

function loom_line_number (article) {
  var i;
  for (i = 0; i < Articles.length; i++) {
    if (article == Articles[i])
      return i;
  }
  return -1;
}

function loom_recenter (id) {
  var line = id;

  if (line > 2)
    window.scroll(0, (line - 2) * loom_line_height);
}

function loom_quit (id) {
  parent.document.location = '/index.php?prefix=' + ParentName;
}

function loom_disable (id) {
  if (LoomDisabled == 0)
    LoomDisabled = 1;
  else 
    LoomDisabled = 0;
}

function loom_goto_first_displayed_article (id) {
  var offset;

  if (LoomDom == 2) {
    offset = window.pageYOffset;
  } else {
    if (document.documentElement && document.documentElement.scrollTop)
      offset = document.documentElement.scrollTop;
    else if (document.body)
      offset = document.body.scrollTop;

    offset1 = document.documentElement.scrollTop;
    offset2 = document.body.scrollTop;
    //parent.document.title = offset1 + " " + offset2;
  }

  id = Math.round(offset/loom_line_height);
  setArticle(id);
}

function possiblySetArticle (id) {
  try {
    if (parent.navigation.document && parent.navigation.document.title) {
      loom_focus(id);
    } else {
      setArticle(id);
    }
  }
  catch (exception) {
    setArticle(id);
  }
}

function loom_set_title (id) {
  elem = document.getElementById("w" + id);
  if (elem) {
    for (var i=0; i < elem.childNodes.length; i++) {
      if (elem.childNodes[i].nodeType == 3)
	// Text Node - extract contents
	parent.document.title = elem.childNodes[i].data;
    }
  }
}

function loom_refresh (id) {
  parent.document.location = '/' + GroupName;
}

function loom_taller (id) {
  if (LoomDom == 2) {
    win = window.innerHeight;
  } else {
    win = window.document.body.clientHeight;
  }

  win = win + 20;

  top.document.getElementById("theFrameset").rows = win + ",*,35";
  setArticle(id);
}

function loom_spam (id) {
  var group = groupArticle(id);
  var article = Articles[id];

  parent.article.document.location = 'http://spam.gmane.org/' + group +
    ':' + article + ":unconfirmed";
}

function loom_followup (id) {
  var group = groupArticle(id);
  var article = Articles[id];

  parent.document.location = 'http://post.gmane.org/post.php?group=' + group +
    '&followup=' + article;
}

function loom_post (id) {
  var group = groupArticle(id);

  parent.document.location = 'http://post.gmane.org/post.php?group=' + group;
}

function loom_menu_action (menu) {
    var sel = menu.selectedIndex;
    var id = LoomSelectedId;

    if (sel == 1) 
      parent.document.location = 'http://gmane.org/loom-help.php';
    else if (sel == 2) 
      loom_refresh(id);
    else if (sel == 3) 
      loom_followup(id);
    else if (sel == 4) 
      loom_post(id);
    else if (sel == 5) 
      loom_disable(id);
    else if (sel == 6) 
      loom_spam(id);
    else if (sel == 7) 
      parent.document.location = 'http://dir.gmane.org/' +
	GroupName;
    else if (sel == 8) 
      parent.document.location = 'http://blog.gmane.org/' +
	GroupName;
    
}    


loom_setup();

