/*
 * news.js - 79th Oscar for MSN
 * Copyright (C) 2007 CINEMATODAY.JP. All rights reserved.
 */

CT = new Object();
CT.News = {
  _listPos: 0,
  _listCount: 5,
  _newsList: false,
  _pageNo: 0,
  _afterList: null,
  listAndDetail: function(num) {
    CT.News._pageNo = CT.News.getPageNo();
    CT.News._afterList = CT.News.doDetail;
    CT.News.list(num);
  },
  list: function(num) {
    CT.News._listCount = num;
    CT.News.addEvent(window, "load", CT.News.doListNews);
  },
  doListNews: function() {
    CT.News.updatePrevNext(null, 0, 0);
    CT.News.Ajax.request("news/index.xml", CT.News.listHandler);
  },
  listHandler: function(doc) {
    if (doc == null) {
      var elm = document.getElementById("news-list-none");
      if (elm) elm.style.display = "block";
      return;
    }
    var items = doc.getElementsByTagName("entry");
    CT.News._newsList = items;
    var startPos = 0;
    if (!CT.News._afterList && items.length > 0) {
      startPos = CT.News.getPageNo();
      if (startPos >= items.length) {
        startPos = items.length - 1;
      }
    }
    var cnt = CT.News._listCount;
    if (items.length - startPos < cnt) {
      cnt = items.length - startPos;
    }
    var html = "";
    var title;
    for (var i = startPos; i < startPos + cnt; i++) {
      id = CT.News.elementVal(items.item(i), "id");
      title = CT.News.elementVal(items.item(i), "title");
      if (id && title) {
        html += '<li><a href="detail.htm?p=' + i + '">'
              + CT.News.text(title) + '</a></li>\n';
      }
    }
    var elm = document.getElementById("news-list");
    if (elm) elm.innerHTML = html;
    if (CT.News._afterList) {
      CT.News._afterList();
    } else {
      CT.News.updatePrevNext(
        "news.htm?p=", CT.News._newsList.length, startPos, CT.News._listCount);
    }
  },
  doDetail: function() {
      var items = CT.News._newsList;
      var pageNo = CT.News._pageNo;
      if (pageNo < 0) {
        pageNo = 0;
      } else if (pageNo >= items.length) {
        pageNo = items.length - 1;
      }
      CT.News._pageNo = pageNo;
      if (pageNo >= 0 && pageNo < items.length) {
        var id = CT.News.elementVal(items[pageNo], "id");
        CT.News.Ajax.request("news/" + id, CT.News.detailHandler);
      }
      CT.News.updatePrevNext(
        "detail.htm?p=", CT.News._newsList.length, pageNo, 1);
  },
  detailHandler: function(doc) {
    if (doc == null) {
      var elm = document.getElementById("news-detail-none");
      if (elm) elm.style.display = "block";
      return;
    }
    var items = doc.getElementsByTagName("content");
    var html = CT.News.elementVal(doc, "content");
    if (html != null) {
      var elm = document.getElementById("news-detail");
      if (elm) elm.innerHTML = html;
    }
  },
  getPageNo: function() {
    var pageNo = 0;
    var  url = window.location.href;
    var at = url.indexOf("?p=");
    if (m = url.match(/\?p=\d+/)) {
      var n = parseInt(m[0].substring(3));
      if (n >= 0) {
        pageNo = n;
      }
    }
    return pageNo;
  },
  updatePrevNext: function(url, total, pos, rows) {
    var prev = -1;
    var next = -1;
    if (total > 0) {
      if (pos > 0) {
        prev = pos - rows;
        if (prev < 0) prev = 0;
      }
      if (pos < total - rows) {
        next = pos + rows;
        if (next >= total) next = total - 1;
      }
    }
    var items = document.getElementsByTagName("a");
    var cls;
    for (i = 0; i < items.length; i++) {
      cls = items[i].className;
      if (cls.length > 0) {
        if (cls.indexOf("news-prev") >= 0) {
          if (prev >= 0) {
            items[i].href = url + prev;
            items[i].style.visibility = "visible";
          } else {
            items[i].style.visibility = "hidden";
          }
        }
        if (cls.indexOf("news-next") >= 0) {
          if (next >= 0) {
            items[i].href = url + next;
            items[i].style.visibility = "visible";
          } else {
            items[i].style.visibility = "hidden";
          }
        }
      }
    }
  },
  Ajax: {
    _handler: function() {},
    _transport: false,
    request: function(url, fn) {
      req = CT.News.Ajax.getTransport();
      if (req) {
        try {
          CT.News.Ajax._transport = req;
          CT.News.Ajax._handler = fn;
          req.open('GET', url, true);
          req.onreadystatechange = CT.News.Ajax._onStateChanged;
          req.send("");
          return true;
        } catch (e) {
        }
      }
      return false;
    },
    getTransport: function() {
      try { return new XMLHttpRequest(); } catch (e) {}
      try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) {}
      try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {}
      return false;
    },
    _onStateChanged: function() {
      var req = CT.News.Ajax._transport;
      if (req.readyState == 4) {
        if (req.status == 200) {
          CT.News.Ajax._handler(req.responseXML);
        } else {
          CT.News.Ajax._handler(null);
        }
      }
    }
  },
  elementVal: function(node, tagname) {
    var n = node.getElementsByTagName(tagname);
    if (n) {
      if (n[0].childNodes.length > 1) {
        return n[0].childNodes[1].nodeValue;
      } else {
        return n[0].firstChild.nodeValue;
      }
    } else {
      return null;
    }
  },
  text: function(str) {
    if (str != null) {
      str = str.replace(/&/, "&amp;");
      str = str.replace(/</, "&lt;");
      str = str.replace(/>/, "&gt;");
      str = str.replace(/"/, "&quot;");
    }
    return str;
  },
  addEvent: function(obj, type, fn) {
    if (obj.addEventListener) {
      obj.addEventListener(type, fn, false);
      return true;
    } else if (obj.attachEvent) {
      return obj.attachEvent("on"+type, fn);
    } else {
      return false;
    }
  }
}
