// Copyright 2005 Softcentral
// Licensed under the GNU General Public License
// No Warranty of any kind implied, use at your own risk
// Author: Brian Tabone
// $Id: Slashdash.js,v 1.3 2005/05/18 04:48:24 briant Exp $

// global request and XML document objects
var req;	// The XMLHttp opbject
var minutes = 60000;	// The javascript timer runs in milliseconds
var seconds = 1000;	
var firstLoad = true;	// Only run the resize code on first load
var updateFrequency = 30 * minutes; // every 30 minutes 
var refreshInterval;

// BE: changed server to slashdot
//var slashURL = "http://www.softcentral.com/slashdash/slashdot_test.xml";
var slashURL = "http://slashdot.org/index.rss";

function setRefreshTimer() {	 
    if (refreshInterval == null)
    	var launch_string = "loadXMLDoc('" + slashURL + "')";
        refreshInterval = setInterval(launch_string, updateFrequency);	 
}	 
 	 
function clearRefreshTimer() {	 
    if (refreshInterval != null) {	 
        clearInterval(refreshInterval);	 
        refreshInterval = null;
    }
}

function getURL(url)
	{
	if (widget)
        	{
		widget.openURL(url);
		}
	}

// retrieve XML document (reusable generic function);
// parameter is URL string (relative or complete) to
// an .xml file whose Content-Type is a valid XML
// type, such as text/xml; XML source must be from
// same domain as HTML file
function loadXMLDoc(url) {
	if (null == req)
		{
		req = new XMLHttpRequest();
		req.overrideMimeType("text/xml");
		req.onreadystatechange = processReqChange;
		}
	else
		{
		req.abort();
		}

        req.open("GET", url);
	req.setRequestHeader("Cache-Control", "no-cache");
        req.send(null);
}

// handle onreadystatechange event of req object
function processReqChange() {
    // only if req shows "loaded"
    //alert("Processing Request");
    if (req.readyState == 4) {
    	//alert("Ready state is 4");
        // only if "OK"
        if (req.status == 200) {
            clearTitles();
            buildContent();
         }
    }
}

// retrieve text of an XML document element, including
// elements using namespaces
function getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
        // the namespace versions of this method 
        // (getElementsByTagNameNS()) operate
        // differently in Safari and Mozilla, but both
        // return value with just local name, provided 
        // there aren't conflicts with non-namespace element
        // names
	//alert(parentElem.getElementsByTagName("description").length);
// BE: changing server to slashdot.org broke this line -- had to modify
//        result = parentElem.getElementsByTagName(local)[index];
    result = parentElem.getElementsByTagNameNS("*", local)[index];
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes 
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;    		
        }
    } else {
        return "n/a";
    }
}

// empty Topics select list content
function clearTitles() {
	//alert("Clearing Titles");
    var currentTitle;
    
    currentTitle = document.getElementById("title_1");
    currentTitle.innerHTML = "";
    currentTitle = document.getElementById("title_2");
    currentTitle.innerHTML = "";
    currentTitle = document.getElementById("title_3");
    currentTitle.innerHTML = "";
    currentTitle = document.getElementById("title_4");
    currentTitle.innerHTML = "";
    currentTitle = document.getElementById("title_5");
    currentTitle.innerHTML = "";
    
}

function clearContents() {
	//alert("Clearing Contents");
    var currentContent;
    
    currentContent = document.getElementById("content_1");
    currentContent.innerHTML = "";
    currentContent = document.getElementById("content_2");
    currentContent.innerHTML = "";
    currentContent = document.getElementById("content_3");
    currentContent.innerHTML = "";
    currentContent = document.getElementById("content_4");
    currentContent.innerHTML = "";
    currentContent = document.getElementById("content_5");
    currentContent.innerHTML = "";
    
}


// fill Topics select list with items from
// the current XML document
function buildContent() {
	//alert("Building contents");
    var select = document.getElementById("topics");
    var items = req.responseXML.getElementsByTagName("item");
    // loop through <item> elements, and add each nested
    // <title> element to Topics select element
    var title_list = new Array(	document.getElementById("title_1"),
    				document.getElementById("title_2"),
				document.getElementById("title_3"),
				document.getElementById("title_4"),
				document.getElementById("title_5"));

    var content_list = new Array(document.getElementById("content_1"),
    				document.getElementById("content_2"),
				document.getElementById("content_3"),
				document.getElementById("content_4"),
				document.getElementById("content_5"));
    var content;
    var html_string;
    var link_string;
    
    for (var i = 0; i < title_list.length; i++) {
    	link_string = document.createTextNode(getElementTextNS("", "link", items[i], 0)).nodeValue;
    	html_string = document.createTextNode(getElementTextNS("", "title", items[i], 0)).nodeValue;
	if (html_string.length > 55)
		{
		html_string = html_string.substring(0, 55) + "...";
		}
	html_string = "<div onclick=javascript:getURL('" + link_string + "\"');>" +
			html_string + "</div>";
    	title_list[i].innerHTML = html_string; 

	html_string = document.createTextNode(getElementTextNS("", "description", items[i], 0)).nodeValue;
	if (html_string.length > 76)
		{
		html_string = html_string.substring(0, 76) + "...";
		}
	content_list[i].innerHTML = html_string;
    }
}

function onshow()
	{
	if (true == firstLoad)
		{
		firstLoad = false;
		window.resizeTo(250, 310);
		setRefreshTimer();
		loadXMLDoc(slashURL);
		}
	}

function onhide() {
	// Since our timer is only once per 30 minutes
	// We keep running, loading fresh pages in the background
	// clearRefreshTimer();
}

function onremove() { // when widget discarded 
            clearRefreshTimer();	 
}

function initialize() { // when widget is loaded
    // Call the support function in System/Library/WidgetResources/button/genericButton.js
    // to create the "Done" button on backside
    createGenericButton (document.getElementById('doneButton'), 'Done', hideBack, 67);

    if (window.widget)
    {
        widget.onshow = onshow;
        widget.onhide = onhide;
        widget.onremove = onremove;
        
//        window.resizeTo(250, 320);
    }
    onshow();
}
