
var CLASS_NEWS_TAB = "tab";
var CLASS_NEWS_SELECTED = "selected";

// Serializes xml to a string
var serializer = new XMLSerializer();
// Parses xml text for 
var parser = new DOMParser();
// The DOM for the news xml file
var newsDom;
// A hash of the tab names with the tab elements (element) and the news page urls (url)
var tabUrls = {};
// The currently selected tab
var currentTab;
// Are the filter tabs initialized?
var areTabsInitialized = false;
// The news slider of type Control.Slider
var newsSlider;
// Is the news viewer enabled?
var isDisabled = false;
// The step value for the current slider
var sliderStepValue = 0;

/**
 * The onload function
 */
function doOnLoadNews() {
	/*
	 * Ready State Options
	 * 0 Uninitialized
	 * 1 Open
	 * 2 Sent
	 * 3 Receiving
	 * 4 Loaded
	 */

	new Ajax.Request( "news.xml", { method: 'get', asynchronous: true, contentType: 'text/xml', encoding: 'UTF-8', onComplete: parseNewsXML } );
}

/**
 * Refreshes the slider based on the updated news display
 */
function refreshSlider() {

	if ( isDisabled ) {
		return;
	}

	var wrapper = $('newsPanelWrap');

	if ( newsSlider != undefined ) {
		newsSlider.setValue( 0 );
		newsSlider.dispose();
	}

	// Set the slider step value
	sliderStepValue = wrapper.offsetHeight / wrapper.scrollHeight;

	// Set the variable handle height
	var handleHeight = wrapper.offsetHeight * sliderStepValue;
	handleHeight =  Math.min( Math.max( ( Math.floor( ( handleHeight - 24 ) / 4 ) * 4 ) + 24, 32 ), 164 );
	handleHeight = new String( handleHeight ) + "px";

	Element.setStyle( $( 'newsSliderHandle' ), { height: handleHeight } );
	Element.setStyle( $$( '#newsSliderHandle .bottom' )[ 0 ], { height: handleHeight } );	

	// vertical slider control
	newsSlider = new Control.Slider('newsSliderHandle', 'newsSliderTrack', {
		axis: 'vertical',
		onSlide: function(v) { scrollVertical(v, wrapper, newsSlider);  },
		onChange: function(v) { scrollVertical(v, wrapper, newsSlider); }
	});

	

	// disable horizontal scrolling if text doesn't overflow the div
	if (wrapper.scrollHeight <= wrapper.offsetHeight) {
		newsSlider.setDisabled();
	}
	wrapper.show();
}

/**
 * Parse the news xml file
 */
function parseNewsXML( xmlHttp ) {
	if ( xmlHttp.readyState != 4 ) {
		return;
	}

	newsDom = parser.parseFromString( xmlHttp.responseText, "text/xml" );
	var error = Sarissa.getParseErrorText( newsDom );
	if ( error != Sarissa.PARSED_OK ) {
		if ( error == Sarissa.PARSED_EMPTY ) {
			throw( "XML file is empty. (1)" );
		}
		else if ( error == Sarissa.PARSED_UNKNOWN_ERROR ) {
			throw( "Unkown error parsing xml file. (1)" );
		}
		else {
			throw( new String( error ) );
		}

		return;
	}

	refreshNews();
}

/**
 * The onload function
 */
function refreshNews( tabName ) {
	if ( newsDom == undefined || isDisabled ) {
		return;
	}

	var htmlString = "";

	var rootNode;
	var itemList;

	// Find the root node (x-browser)
	for ( var i = 0; i < newsDom.childNodes.length; i++ ) {
		var node = newsDom.childNodes[ i ];
		if ( node.nodeName == "news" ) {
			rootNode = node;
			break;
		}
	}
	
	if ( rootNode == undefined ) {
		throw( "Error: Unable to find valid news file." );
		return;
	}
		
	// Create the tabs for the viewer
	createNewsTabs( rootNode );


	// Make sure the tabName has a value
	if ( tabName == undefined || tabName == "" ) {
		for ( var t in tabUrls ) {
			if ( tabUrls[ t ][ "defaulttab" ] == true ) {
				tabName = t;
				break;
			}
		}
	}

	newsElement = $('newsPanel');

	var itemsDiv = "<div>";
	
	var xpathQuery = "/news/items[@tab='" + tabName + "']/a";
	
	var selectedItems = rootNode.selectNodes( xpathQuery );
	
	for ( var n = 0; n < selectedItems.length; n++ ) {
		itemsDiv += serializer.serializeToString( selectedItems[ n ] );
	}
	
	itemsDiv += "</div>"
	
	newsElement.innerHTML = itemsDiv;
	
	if ( currentTab == undefined ) {
		selectTab();
	}
}

/**
 * Create the tabs for the news viewer
 */
function createNewsTabs( rootNode ) {
	if ( areTabsInitialized ) {
		return;	
	}

	var linkNode, tabsList, titleText;
	
	for ( var i = 0; i < rootNode.childNodes.length; i++ ) {
		var node = rootNode.childNodes[ i ];
		switch( node.nodeName ) {
		case "tabs":
			tabsList = node.childNodes;
			break;
		case "link":
			linkNode = node;
			break;
		case "title":
			if ( node.childNodes.length == 1 ) {
				titleText = node.childNodes[ 0 ].nodeValue;
			}
			else {
				titleText = node.nodeValue;
			}
			break;
		}
	}
	
	// Update news title
	var header = $('newsHeader');
	header.innerHTML = '<span>' + titleText + '</span>';  // span used for CSS image replacement

	var tabbar = $('newsTabs');
	
	// Create tabs
	for ( var i = 0; i < tabsList.length; i++ ) {
		var node = tabsList[ i ];
		if ( node.nodeName != "tab" ) {
			continue;
		}

		var tabName, url, isDefault;
		for ( var j = 0; j < node.childNodes.length; j++ ) {
			var child = node.childNodes[ j ];
			switch( child.nodeName ) {
			case "name":
				if ( child.childNodes.length > 0 ) {
					tabName = child.childNodes[ 0 ].nodeValue;
				}
				else {
					tabName = child.nodeValue;
				}
				break;
			case "url":
				if ( child.childNodes.length > 0 ) {
					url = child.childNodes[ 0 ].nodeValue;
				}
				else {
					url = child.nodeValue;
				}
				break;
			}
		}
		
		isDefault = Boolean( ( node.getAttribute( "default" ) == null ) ? false : node.getAttribute( "default" ) );
		
		div = document.createElement( "div" );
		div.id = 'newsTabs_'+ tabName;
		
		var anchor = document.createElement( "a" );
		anchor.className = CLASS_NEWS_TAB;
		anchor.innerHTML = '<span>' + tabName + '</span>';
		anchor.href = "#";
		anchor.onclick = function() {
			return selectTab( this );
		};
	
		div.appendChild( anchor );
		tabbar.appendChild( div );
		
		tabUrls[ tabName ] = { element: div, url: url, defaulttab: isDefault };
	}

	areTabsInitialized = true;
}

/**
 * Select the tab to filter the news
 */
function selectTab( tabLink ) {

	var tabElement;
	var tabValue;
	// If no tab link, then get the first tab
	if ( tabLink == undefined ) {
		if ( tabUrls.length <= 0 ) {
			return false;
		}
		for ( var t in tabUrls ) {
			if ( tabUrls[ t ][ "defaulttab" ] == true ) {
				tabValue = t;
				tabElement = tabUrls[ t ][ "element" ];
				break;
			}
		}
		for ( var i = 0; i < tabElement.childNodes.length; i++ ) {
			if ( tabElement.childNodes[ i ].nodeName == "a" || tabElement.childNodes[ i ].nodeName == "A" ) {
				tabLink = tabElement.childNodes[ i ];
				break;
			}
		}
	}
	// Else get the parent div element
	else {
		tabElement = tabLink.parentNode;
		for ( var i = 0; i < tabLink.childNodes.length; i++ ) {
			if ( tabLink.childNodes[ i ].nodeName == "span" || tabLink.childNodes[ i ].nodeName == "SPAN" ) {
				tabValue = tabLink.childNodes[ i ].innerHTML;
				break;
			}
		}
		
		tabLink.blur();

		refreshNews( tabValue );
	}

	// Change style class
	if ( currentTab != tabElement ) {
		if ( currentTab != undefined ) {
			var currentTabLink;
			for ( var i = 0; i < currentTab.childNodes.length; i++ ) {
				if ( currentTab.childNodes[ i ].nodeName == "a" || currentTab.childNodes[ i ].nodeName == "A" ) {
					currentTabLink = currentTab.childNodes[ i ];
					break;
				}
			}
			if ( currentTabLink != undefined ) {
				currentTabLink.className = CLASS_NEWS_TAB;
			}
		}

		tabLink.className = CLASS_NEWS_SELECTED;
		currentTab = tabElement;
	}
	
	// Make sure the slider is refreshed
	refreshSlider()

	return false;
}

/**
 * Move the news up an item
 */
function newsSlideUp() {
	if ( newsSlider ) {
		newsSlider.setValueBy( -1 * sliderStepValue );
	}
	return false;
}

/**
 * Move the news down an item
 */
function newsSlideDown() {
	if ( newsSlider ) {
		newsSlider.setValueBy( sliderStepValue );
	}
	return false;
}

// Run the load news function on page load
addEvent(window,'load',doOnLoadNews);