var dsItems;
var dsItemsDetail;

function initNews () {
	
	dsSites.setColumnType("items", "number");
	dsSites.setColumnType("lastFeedRaw", "number");

	dsSites.addObserver(addLoadUrl);
	dsSites.addObserver(SetInitialSite);

	//loadUrl is added to the dsSites object at startup
	//loadUrl is a name/value pair, though it can also take 'search', 'recent' and 'hits'
	// 	followed by an argument (the search term, or the url, or just 'true')
	// 	'%21%21' delimits the name and value

	// eventually I'd like to do this to speed up the initial load but that's a future
	//if (focusFeed != null) { 
	//	dsItems = new Spry.Data.XMLDataSet("/news/xml_feed_items.jsp","feedItems/feedItem",{distinctOnLoad: true, method: "POST", postData: "load=" + encodeURIComponent("site!!" + focusFeed)});
	//} else {

//	dsItems = new Spry.Data.XMLDataSet("/news/xml_feed_items.jsp","feedItems/feedItem",{distinctOnLoad: true, method: "POST", postData: "load={dsSites::loadUrl}&start={dsSites::start}"});
	dsItems = new Spry.Data.XMLDataSet("/news/xml_feed_items_with_cacheing.jsp","feedItems/feedItem",{distinctOnLoad: true, method: "POST", postData: "load={dsSites::loadUrl}&start={dsSites::start}"});

	dsItemsDetail = new Spry.Data.XMLDataSet("/news/xml_feed_items_detail_with_cacheing.jsp","feedItems/feedItem",{method: "POST", postData: "feeditemid={dsItems::@id}"});
	dsItems.setColumnType("feedItemRaw", "number");
	dsItems.addObserver(DecodeTitleColumn);
	dsItems.addObserver(addHighlightObserver);
	dsItemsDetail.addObserver(setItemNavContent);
	dsItemsDetail.addObserver(DecodeAbstractColumn);
//	dsItemsDetail.addObserver(fixAbstractLinks);
}

function addHighlightObserver (notificationType, notifier, data) {
	if (notificationType != "onPostLoad" )
		return;
	if (dsItems.getRowCount() < 1)
		return;
	dsItemsDetail.addObserver(setItemHighlight);
}

var doOnce = 1;
function setItemHighlight (notificationType, notifier, data) {
	if (notificationType != "onDataChanged" )
		return;
	if (dsItems.getRowCount() < 1)
		return;
	var nodeIndex = 1;
	if (is_ie6up) {
		nodeIndex = 0;
	}
	var itemsListElem = document.getElementById('itemsListings');
	document.scrollTop = 0;

	// and while wer're here, we're gonna walk the items, inspect the links for visited, and then set the style to gray for anything we've been to
	if (doOnce) {
		var c = document.createElement('div');
		c.id='nicked';
		document.body.appendChild(c)
		doOnce--;
	}	

	var rows = dsItems.getData();
	var numRows = rows.length;

	for (var i = 0; i < numRows; i++) {
		var row = rows[i];
		// leave this here in case an abstact does slip through
		// which could happen if a site has only one feed item
		if (row.url) {
		         var link = document.createElement("a");       
			 link.id = "id" + i;       
			 link.href = row.url;       
			 link.innerHTML = "nicked";              
			 var c = document.getElementById('nicked');
			 c.appendChild(link);       
			 if(link.offsetHeight==1) {
			 	itemClick(itemsListElem.childNodes[i + nodeIndex]);
			 	// setItemSeen(itemsListElem.childNodes[i + nodeIndex]);
			 }
			 c.removeChild(link);      
		}

	}

	// and finally load the item at the top of the list
	itemClick(itemsListElem.childNodes[nodeIndex]);

	dsItemsDetail.removeObserver(setItemHighlight);
}


var itemsLimitGlob = 8;

function setItemNavContent (notificationType, notifier, data) {
	var itemsLimit = itemsLimitGlob;
	if (notificationType != "onPostLoad" )
		return;
	if (dsSites.getRowCount() < 1)
		return;
	var content = "";
	var i = dsSites.getCurrentRowNumber();
	var rows = dsSites.getData();
	if (rows[i].siteName == 'recent items') {
            // recent items has 20 items, an exception that must be handled
	    itemsLimit = rows[i].items;
	}
	if (rows[i].items > itemsLimit) {
		if (rows[i].start > 0) {
			content += "<span class=\"navClick\" onclick=\"setStartAndReload("+ Math.max(rows[i].start - itemsLimit,0) +");return true;\"><</span>";
		}
		content += (rows[i].start + 1) + " to " + Math.min(rows[i].start + itemsLimit,rows[i].items);
		if (rows[i].start + itemsLimit < rows[i].items) {
			content += "<span class=\"navClick\" onclick=\"setStartAndReload("+ (rows[i].start + itemsLimit) +");return true;\">></span>";
		} else {
			content += "<span class=\"navClickHolder\">></span>";
		}
		" of ";
		content += "of ";
	}
	if (rows[i].items > 1) {
		content += rows[i].items + " items";
	}
	document.getElementById('itemsNav').innerHTML = content;

}

function setStartAndReload (start) {
	var i = dsSites.getCurrentRowNumber();
	var rows = dsSites.getData();
	rows[i].start = start;
	dsItems.loadData();
}


function SetInitialSite(notificationType, notifier, data)
{
	if (notificationType != "onPostLoad" )
		return;
	dm("SetInitialSite called");
	//if (focusFeed == null)
	//	dsSites.removeObserver(SetInitialSite);
	//	return;


	dm("SetInitialSite passed with focusFeed: " + focusFeed);
	// don't need to come back here again
	dsSites.removeObserver(SetInitialSite);
	window.setTimeout("setItemFocus('"+focusFeed+"');",1000);

}

function addLoadUrl(notificationType, notifier, data) {
	if (notificationType != "onPostLoad" )
		return;
	if (dsSites.getRowCount() < 1)
		return;

	var rows = dsSites.getData();
	var numRows = rows.length;
	for (var i = 0; i < numRows; i++) {
		var row = rows[i];
		if (row.url && !row.loadUrl) {
			row.loadUrl = encodeURIComponent("uuid!!" + row.uuid);
		}
		row.start = 0;
		//if (row.siteName) {
			//row.siteName = Spry.Utils.decodeEntities(row.siteName);
		//}
	}
	dsSites.removeObserver(addLoadUrl);
}


function setItemFocus (inparam,start) {
	// searches through the dsSites and finds the desired sites
	// 
	if (dsSites.getRowCount() < 1) {
	//if (dsItems.getRowCount() < 1) {
		dm("siteFocus sites not loaded, waiting: " + inparam);
		window.setTimeout("setItemFocus('"+inparam+"');",1000);
		return;
	}
	if (inparam == null || inparam == '') {
		dm("siteFocus aborted, no sitek highlighting first element");
		feedClick(document.getElementById("feed0"));
		return;
	} else {
		dm("setItemFocus: loading site: " + inparam);
	}

	var emSize = 12 //getFontsize(sitesElem);
	var scrollWindowSize = 560;

	var rows = dsSites.getData();
	var numRows = rows.length;
	for (var i = 0; i < numRows; i++)
	{
		var row = rows[i];
		if (row.url) {
			//dm("setting loadUrl: " + row.loadUrl,1);
			if (row.uuid == inparam || row.url == inparam) {
				if (start != null) {
					row.start = start;
				}
				dm("SetInitialSite found match for " + inparam);
				var holder = rows[0];
				rows[0] = row;
				rows[row["ds_RowID"]] = holder;
				//dsSites.loadData();
				dsSites.setCurrentRow(rows[0]["ds_RowID"]);		//dsSites.sort("ds_RowID");
				var boundingElem = document.getElementById("feed" + row["ds_RowID"]);;
				//feedClick(boundingElem.childNodes[i + modifier]);
				feedClick(boundingElem);
				if (emSize * i > scrollWindowSize) {
					var sitesElem = document.getElementById("sites");
					sitesElem.scrollTop = i * emSize;
					dm("emSize: " + emSize + " scrollTop: " + sitesElem.scrollTop);
				}
				return;
			}
		}
		
	}
	window.location.href="/news/?uuid=" + inparam;
	//dsSites.loadData();
	//dsSites.sort("ds_RowID");
	//updateTrackingCookie();
}


function DecodeAbstractColumn(notificationType, notifier, data) {
	if (notificationType != "onPostLoad" || dsItemsDetail.getRowCount() < 1)
		return;
		
	var rows = dsItemsDetail.getData();
	var numRows = rows.length;
	for (var i = 0; i < numRows; i++) {
		var row = rows[i];
		if (row.abstract) {
			row.abstract = Spry.Utils.decodeEntities(row.abstract);
		}
		if (row.title)
			row.title = Spry.Utils.decodeEntities(row.title);
	}
	updateTrackingCookie();
	
}

/* couldn't get this to work with the Spry event model
function fixAbstractLinks(notificationType, notifier, data) {
	if (notificationType != "onPostLoad" || dsItemsDetail.getRowCount() < 1)
		return;
		
	var rows = dsItemsDetail.getData();
	var numRows = rows.length;
	for (var i = 0; i < numRows; i++) {
		var row = rows[i];
		if (row.abstract) {
			try {
			    dm("looking for such ", 1);
			    var nodes = document.getElementById("abstractDetailAbstract").getElementsByTagName('a');
			    for (var i = 0; i < nodes.length; i++) {
				nodes[i].setAttribute("target","_blank");
				dm("adjusted target for node ", 1);
			    }			    
			} catch (r) {
			   dm("that didn't work " + r, 1);
			}
		} else {
			   dm(" no abstract ", 1);
		}		
	}
}
*/

function fixAbstractLinks() {
	try {
	    dm("looking for such ");
	    var nodes = document.getElementById("abstractDetailAbstract").getElementsByTagName('a');
	    for (var i = 0; i < nodes.length; i++) {
		nodes[i].setAttribute("target","_blank");
		dm("adjusted target for node ");
	    }			    
	} catch (r) {
	   dm("that didn't work " + r);
	}
}


function DecodeTitleColumn(notificationType, notifier, data) {
	if (notificationType != "onPostLoad" || dsItems.getRowCount() < 1)
		return;
		
	var rows = dsItems.getData();
	var numRows = rows.length;
	for (var i = 0; i < numRows; i++) {
		var row = rows[i];
		// leave this here in case an abstact does slip through
		// which could happen if a site has only one feed item
		if (row.abstract)
			row.abstract = Spry.Utils.decodeEntities(row.abstract);
		if (row.title)
			row.title = Spry.Utils.decodeEntities(row.title);
	}
	updateTrackingCookie();
}





function updateTrackingCookie (notificationType, notifier, data) {

	var cookie = getCookie("newstracker");
	if (cookie != null
	    && !setItem	) {
		return;
	}

	if (notificationType != "onCurrentRowChanged")
		return;
	
	var siteid = dsSites.getCurrentRowNumber();
	var itemid = dsItems.getCurrentRowNumber();		
	dm("updating cookie to " + siteid + " " + itemid);
	setCookie("newstracker",siteid+"|"+itemid);
}

function updateTrackingCookieSiteIDDirect (siteid) {

	var cookie = readCookie("newstracker");
	if (cookie != null
	    && !setItem	) {
		return;
	}

	//var siteid = dsSites.getCurrentRowNumber();
	var itemid = dsItems.getCurrentRowNumber();		
	dm("updating cookie directly to " + siteid + " " + itemid);
	setCookie("newstracker",siteid+"|"+itemid);
}


var setSite = false;
var setItem = false;

function setCurrentFromTrackingCookie (notificationType, notifier, data) {

	if (setSite && setItem)
		return;

	if (notificationType != "onPostLoad" )
		return;
	
	dm("trying to set CurrentRows");

	var cookie = getCookie("newstracker");
	if (cookie == null) {
		return;
	}
	var ids = cookie.split('|');
	dm("cookie: " + cookie + " 1: "+ ids[0] + " 2: "+ ids[1]);

	if (!setSite && (ids[0] != null || ids[0] != 'undefined')) {
		dsSites.setCurrentRowNumber(ids[0]);
		setSite = true;
	}

	if (dsItems.getRowCount() < 1) 
		return;
	if (ids[0] != null && ids[0] != 'undefined') {
		dsItems.setCurrentRowNumber(ids[1]);	
		setItem = true;
	}
}

/*

property 	description
nodeName 	name of the node
nodeValue 	value of node (only applicable to text nodes)
nodeType 	type of node - see below
parentNode 	parent, if one exists
childNodes 	list (array) of child nodes
firstChild 	first child
lastChild 	last child
previousSibling 	previous sibling
nextSibling 	next sibling
attributes 	list of attributes of an element
ownerDocument 	document containing the element

Here are the node types:
number 	description
1 	an HTML element
2 	an element attribute
3 	text
8 	an HTML comment
9 	a document
10 	a document type definition

*/

var selectedElement = new Array();
function setColorSelected (selectColor,deselectColor,newSelectElement,seCount) {
	if (selectedElement[seCount] != null) {		
		selectedElement[seCount].style.background = deselectColor;
	}
	newSelectElement.style.background = selectColor;
	selectedElement[seCount] = newSelectElement;
}


function selectedClass (selectClass,deselectClass,newSelectElement,indexSE) {
	if (selectedElement[indexSE] != null) {
		if (selectClass == null || selectClass == '') {
		//then set the class to what it used to be
			selectedElement[indexSE] = classWas[indexSE];
		} else {
			selectedElement[indexSE].className = deselectClass;
		}
	}
	//hoverClass (selectClass,newSelectElement,indexSE); //sync hover and click
	// store this for later
	classWas[indexSE] = newSelectElement.className;
	newSelectElement.className = selectClass;
	selectedElement[indexSE] = newSelectElement;
}

var childIndex = 1;
if (is_ie6up) {
	childIndex = 0;
}

function setItemSeen (elem) {
	 elem.classname = 'itemSeen';
}


function feedMouseOver (elem) {
	if (elem == selectedElement[0]) {
		return;
	}
	hoverClass('feedHover',elem,0);
	hoverClass('feedDateHover',elem.childNodes[childIndex],1);
}

function feedMouseOut (elem) {
	if (elem == selectedElement[0]) {
		return;
	}
	hoverClass('',elem,0);
	hoverClass('',elem.childNodes[childIndex],1);
}

function feedClick (elem) {
	selectedClass('feedSelect','feedSeen',elem,0);
	selectedClass('feedDateSelect','feedDate',elem.childNodes[childIndex],1);
}


function itemMouseOver (elem) {
	if (elem == selectedElement[2]) {
		return;
	}
	hoverClass('itemHover',elem,2);
	hoverClass('itemDateHover',elem.childNodes[childIndex],3);
}

function itemMouseOut (elem) {
	if (elem == selectedElement[2]) {
		return;
	}
	hoverClass('',elem,2);
	hoverClass('',elem.childNodes[childIndex],3);
}

function itemClick (elem) {
	selectedClass('itemSelect','itemSeen',elem,2);
	selectedClass('itemDateSelect','itemDate',elem.childNodes[childIndex],3);
}



function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

var newsJSLoaded = true;
