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

var zIndexValues = new Array( 4, 3, 2, 1, 2, 3, 2, 1, 1, 2, 3, 2, 1, 2, 3, 4 );

// 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;
// The tab data
var tabData;
var tabHash = {};
// The currently selected tab
var currentTab;
// 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;

/**
 * loadNewsTabs
 * Gets the data for the news tabs and 
 */
function loadNewsTabs( hostPath ) {

	dojo.xhrGet( {
		url: hostPath + "content/updates/updates.json",
		handleAs: "json",
		handle: function( responseJSON ) {
			tabData = responseJSON.tabs;

			createNewsTabs();

			selectTab( window.currentUpdatesKey );
		},
		error: function( response ) {
			console.debug( response );
		}
	} );
}


/**
 * createNewsTabs
 * Create the tabs for the news viewer
 */
function createNewsTabs() {

	var tabbar = dojo.byId( "newsTabs" );
	
	// Create the tabs
	for ( var i = tabData.length - 1; i >= 0; i-- ) {
		var tab = tabData[ i ];
		tabHash[ tab.key ] = tab;

		var div = document.createElement( "div" );
		div.id = 'newsTabs_'+ tab.key;
		div.className = CLASS_NEWS_TAB + " " + CLASS_NEWS_TAB + tab.number;

		if ( tab.enabled ) {
			var anchor = document.createElement( "a" );
			anchor.innerHTML = '<span>' + tab.name + '</span>';
			anchor.href = "javascript: void(0);";
			anchor.onclick = (function ( key ) { return function() { return selectTab( key ) } } )( tab.key );
			dojo.attr( anchor, "title", tab.toolTip );

			div.appendChild( anchor );
		}
		else {
			var disabledDiv = document.createElement( "div" );
			disabledDiv.innerHTML = '<span>' + tab.name + '</span>';
			disabledDiv.title = tab.toolTip;
			
			div.appendChild( disabledDiv );
		}

		tabbar.appendChild( div );
	}
}

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

	if ( tabKey == undefined ) {
		tabKey = window.currentUpdatesKey;
	}

	var tab = tabHash[ tabKey ];
	if ( !tab.loaded ) {
		loadNews( tab.key );
	}

	var tabElement = dojo.byId( "newsTabs_" + tabKey );

	// Change style class
	if ( currentTab != tabElement ) {
		if ( currentTab != undefined && dojo.hasClass( currentTab, CLASS_NEWS_SELECTED ) ) {
			dojo.removeClass( currentTab, CLASS_NEWS_SELECTED );
		}

		dojo.addClass( tabElement, CLASS_NEWS_SELECTED );
		currentTab = tabElement;
	}

	// Set the z-indices to the correct value
	var arrayIndex = 4 * ( tab.number - 1 );
	var tabDivs = $$( "#newsTabs .tab a" );

	for ( var i = 0; i < tabDivs.length ; i++ ) {
		var tabDiv = $$( "#newsTabs .tab" + ( i + 1 ) );
		tabDiv[ 0 ].setStyle( { "z-index": ( 100 + ( 5 * zIndexValues[ arrayIndex + i ] ) ) } );
	}
	
	// Make sure the slider is refreshed
	if ( tab.xmlDom != undefined ) {
		refreshSlider();
	}

	return true;
}

/**
 * The onload function
 */
function loadNews( tabKey ) {

	dojo.xhrGet( {
		url: "content/updates/" + tabKey + "/updates.xml" ,
		handleAs: "xml",
		handle: function( responseXML ) {
			tabHash[ tabKey ].xmlDom = responseXML;
			refreshNews( tabKey );
		},
		error: function( response ) {
			console.debug( response );
		}
	} );
}


/**
 * refreshNews
 * Refreshes a particular tab
 */
function refreshNews( tabKey ) {

	if ( tabKey == undefined ) {
		tabKey = window.currentUpdatesKey;
	}

	var tab = tabHash[ tabKey ];
	if ( tab.xmlDom == undefined || !tab.enabled ) {
		return;
	}

	newsElement = dojo.byId( "newsPanel" );

	var rootNode = null;
	for ( var i = 0; i < tab.xmlDom.childNodes.length; i++ ) {
		var n = tab.xmlDom.childNodes[ i ];
		if ( n.nodeName == "items" ) {
			rootNode = n;
			break;
		}
	}

	if ( rootNode == null ) {
		return;
	}

	var itemsDiv = "<div>";
	for ( var n = 0; n < rootNode.childNodes.length; n++ ) {
		var node = rootNode.childNodes[ n ];
		if ( node.nodeName != "a" ) {
			continue;
		}
		itemsDiv += serializer.serializeToString( node );
	}
	itemsDiv += "</div>"
	
	newsElement.innerHTML = itemsDiv;
	
	refreshSlider();
}

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

	if ( isDisabled ) {
		return;
	}

	var wrapper = dojo.byId( "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();
	}

	if ( dojo.exists( "wrapper.show" ) ) {
		wrapper.show();
	}
}

/**
 * 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;
}