VIEWZI.view.news_view_wWidth	= YAHOO.util.Dom.getViewportWidth();
VIEWZI.view.NEWS_PER_ROW		= 4;
VIEWZI.view.NEWS_NO				= 10;
VIEWZI.view.PAGES_NO			= 10;
VIEWZI.view.RESULTS_PER_REQUEST	= 8;
VIEWZI.view.newsToBeAdded		= 0;
VIEWZI.view.topNewsAdded		= false;
VIEWZI.view.someDataAdded		= false;

VIEWZI.view.ERROR = {
	NO_MORE_DATA: -1,
	MORE_DATA_REQUESTED: -2
};

VIEWZI.view.currentPage = 1;
VIEWZI.view.multiPageSwitchTarget = -1;

VIEWZI.view.datasources = [
	{id: 'goog_news', results: [], resultsPage:0}
	
	];
	/*
	{id: 'yhoo_news', results: [], resultsPage: 0},
	{id: 'usatoday', results: [], resultsPage: 0},
	// {id: 'newsvine', results: [], resultsPage: 0},
	{id: 'reuters_news', results: [], resultsPage: 0},
	{id: 'cnn', results: [], resultsPage: 0},
	{id: 'nytimes', results: [], resultsPage: 0}
];*/

/**
 * Invoked to add more news to the results screen.
 * If there's no more datasources data, then more data is requested.
 */
VIEWZI.view.addMoreNews = function() {
	VIEWZI.view.newsToBeAdded = VIEWZI.view.newsToBeAdded || (VIEWZI.view.currentPage == 1 ? 2 * VIEWZI.view.NEWS_PER_ROW + 1 : 4 * VIEWZI.view.NEWS_PER_ROW);

	var elementsBeforeFirst = [];
	while (VIEWZI.view.newsToBeAdded > 0) {
		var nextNews = VIEWZI.view.getNextNews();
		if ('object' === typeof(nextNews)) {
			VIEWZI.view.newsToBeAdded--;
			VIEWZI.view.someDataAdded = true;

			if (!VIEWZI.view.topNewsAdded) {
				if(!nextNews.image){
					elementsBeforeFirst.push(nextNews);
					continue;
				}
				VIEWZI.view.topNewsAdded = true;
				VIEWZI.view.createTopNewsNode(nextNews);
				for(var i = 0; i < elementsBeforeFirst.length; i++){
					VIEWZI.view.createNewsNode(elementsBeforeFirst[i]);
				}
			} else {
				VIEWZI.view.createNewsNode(nextNews);
			}
		} else if (VIEWZI.view.ERROR.MORE_DATA_REQUESTED == nextNews) {
			return;
		} else if (VIEWZI.view.ERROR.NO_MORE_DATA == nextNews) {
			break;
		}
	}

	if (VIEWZI.view.multiPageSwitchTarget > 0) {
		VIEWZI.view.newsViewPage(VIEWZI.view.multiPageSwitchTarget);
		return;
	}

	VIEWZI.view.updateView();
};

/**
 * Updates view after data has been added.
 */
VIEWZI.view.updateView = function() {
	if (VIEWZI.view.someDataAdded) {
		// updating footer & news styles as data has been added.
		YAHOO.util.Dom.get('news_view_top_story').className = (VIEWZI.view.currentPage == 1 ? '' : 'hidden');
		YAHOO.util.Dom.removeClass('news_view_story_p' + VIEWZI.view.currentPage, 'hidden');
		YAHOO.util.Dom.removeClass('news_view_story_p' + VIEWZI.view.currentPage, 'loading');
		YAHOO.util.Dom.setStyle('news_view_story_p' + VIEWZI.view.currentPage, 'min-height', '0px');
		YAHOO.util.Dom.get('news_view_story_p' + VIEWZI.view.currentPage).innerHTML += "<div class=\"clear\"></div>";

		YAHOO.util.Dom.removeClass('news_view_footer', 'hidden');

		// if results screen hasn't been filled up completely then remove the next page links.
		if (VIEWZI.view.newsToBeAdded > 0) {
			var pageLinks = YAHOO.util.Dom.getElementsBy(function() {return true;}, 'li', 'news_view_pagelinks');
			for (var i = VIEWZI.view.currentPage; i < pageLinks.length; i++) {
				pageLinks[i].parentNode.removeChild(pageLinks[i]);
			}
		}
	} else {
		// showing no news message screen
		var firstPageNode = YAHOO.util.Dom.get('news_view_story_p' + VIEWZI.view.currentPage);
		YAHOO.util.Dom.removeClass(firstPageNode, 'loading');
		YAHOO.util.Dom.addClass(firstPageNode, 'error_message');
		firstPageNode.innerHTML = "<p>No news has been found.</p>";
		YAHOO.util.Dom.setStyle(firstPageNode, 'line-height', YAHOO.util.Dom.getStyle(firstPageNode, 'min-height'));
	}

	VIEWZI.view.newsViewResize();
};

/**
 * Gets next news from the datasources.
 * If no more data in the datasource then additional data is requested.
 */
VIEWZI.view.getNextNews = function() {
	var datasourceNo = -1;
	var newestData = null;

	for (var i = 0; i < VIEWZI.view.datasources.length; i++) {
		var current = VIEWZI.view.datasources[i].results[0];
		if (VIEWZI.view.datasources[i].results.length < 1) {
			VIEWZI.view.requestMoreData(i);
			return VIEWZI.view.ERROR.MORE_DATA_REQUESTED;
		}
		if (!VIEWZI.view.newsComparator(newestData, current)) {
			datasourceNo = i;
			newestData = current;
		}
	}

	return (datasourceNo == -1 ? VIEWZI.view.ERROR.NO_MORE_DATA : VIEWZI.view.datasources[datasourceNo].results.splice(0, 1)[0]);
};

/**
 * Compares two news by date.
 */
VIEWZI.view.newsComparator = function(news1, news2) {
	if (!news1) {
		return false;
	}

	var parts1 = news1.pubdate.split('-');
	var parts2 = news2.pubdate.split('-');
	var timestamp1 = new Date(parts1[0], parts1[1], parts1[2]).getTime();
	var timestamp2 = new Date(parts2[0], parts2[1], parts2[2]).getTime();

	return timestamp1 > timestamp2;
};

/**
 * Requests more data from the server side.
 */
VIEWZI.view.requestMoreData = function(datasourceNo) {
	var datasource = VIEWZI.view.datasources[datasourceNo];
	var startIndex = datasource.resultsPage * VIEWZI.view.RESULTS_PER_REQUEST + (datasource.resultsPage === 0 ? 0 : 1);
	var endIndex = startIndex + VIEWZI.view.RESULTS_PER_REQUEST;

	//console.log('Data pull: ' + datasource.id);
	VIEWZI.datapull.getData(VIEWZI.searchterm, datasource.id, '', startIndex, endIndex, 'datasource-' + datasourceNo);
};

/**
 * Processes query results by adding them to the apropriate datasource.
 */
VIEWZI.view.processQueryResults = function(evtId, evt) {
	//console.log(evt);
	if(evt[0].id == "GOOG--IMG") {
		VIEWZI.view.placeTopImage(evt[0].data[0].image);
		return;
	}

	if (evt[0].id.indexOf('datasource') < 0) {return;}

	var datasourceNo = parseInt(evt[0].id.split('-')[1], 10);

	if (evt[0].data.length > 0) {
		VIEWZI.view.datasources[datasourceNo].resultsPage++;
 		VIEWZI.view.addData(datasourceNo, evt[0].data);
	} else {
		// remove datasource if no more data has been found
		VIEWZI.view.datasources.splice(datasourceNo, 1);
	}
	VIEWZI.view.addMoreNews();
};

/**
 * Adds query data to the datasource.
 */
VIEWZI.view.addData = function(datasourceNo, data) {
	for (var i = 0; i < data.length; i++) {
		if (data[i].pubdate.length > 0)	{
			var d = data[i];
			var index = d.title.lastIndexOf(' - ');
			if(index){
				d.newsSource = d.title.substr(index + 3);
				d.title= d.title.substring(0, index);
			}
			VIEWZI.view.datasources[datasourceNo].results.push(data[i]);
		}
	}
};

/**
 * Updates news data after screen resize.
 */
VIEWZI.view.newsViewResize = function() {
	VIEWZI.view.news_view_wWidth 	= YAHOO.util.Dom.getViewportWidth();
	YAHOO.util.Dom.setStyle('news_view_top_story_summary','width', Math.floor((VIEWZI.view.news_view_wWidth * 0.75-55), 10) + 'px');//account for padding on body and div
	YAHOO.util.Dom.setStyle('news_view_top_story_credits','width', Math.floor((VIEWZI.view.news_view_wWidth * 0.25), 10) + 'px');

	YAHOO.util.Dom.getElementsByClassName('news_view_story', 'div','news_view_story_list', function()
	{
		YAHOO.util.Dom.setStyle(this,'width', Math.floor((VIEWZI.view.news_view_wWidth * 0.25-20), 10) + 'px');
		YAHOO.util.Dom.setStyle(this,'margin-left', 10 + 'px');
		YAHOO.util.Dom.setStyle(this,'margin-bottom', 10 + 'px');
	});

	YAHOO.util.Dom.getElementsByClassName('error_message', 'div','news_view_story_list', function() {
		var region = YAHOO.util.Dom.getRegion(this);
		var paragraph = YAHOO.util.Dom.getFirstChild(this);
		YAHOO.util.Dom.setStyle(paragraph, 'top', (region.bottom - region.top) * 0.4 + 'px');
		YAHOO.util.Dom.setStyle(paragraph, 'left', (region.right - region.left - parseInt(YAHOO.util.Dom.getStyle(paragraph, 'width'), 10)) / 2 + 'px');
	});
};

/**
 * Updates news container after screen resize.
 */
VIEWZI.view.newsContainerResize = function() {
	var pageDivs = YAHOO.util.Dom.getChildren('news_view_story_list');
	var offsetTop = YAHOO.util.Dom.getRegion('news_view_story_list').top;
	var offsetBottom = 0;

	if (YAHOO.util.Dom.get('viewziFooter'))
	{
		offsetBottom = (YAHOO.util.Dom.getRegion('viewziFooter').bottom - YAHOO.util.Dom.getRegion('viewziFooter').top) + VIEWZI.view.getVerticalInset('viewziFooter');
	}

	var selfMarginsAndPaddings = VIEWZI.view.getVerticalInset('news_view_story_list');

	var property = (YAHOO.env.ua.ie == 6 ? 'height' : 'min-height');
	YAHOO.util.Dom.setStyle(pageDivs, property, (YAHOO.util.Dom.getViewportHeight() - offsetTop - offsetBottom - selfMarginsAndPaddings) + 'px');
};

/**
 * Returns node's vertical inset (margin, padding, border) width.
 */
VIEWZI.view.getVerticalInset = function(node) {
	var getStyleValue = function(name) {
		var style = YAHOO.util.Dom.getStyle(node, name);
		return (style.indexOf('px') > 0 ? parseInt(style, 10) : 0);
	};

	return getStyleValue('margin-top') + getStyleValue('border-top-width') + getStyleValue('padding-top') + getStyleValue('padding-bottom') + getStyleValue('border-bottom-width') + getStyleValue('margin-bottom');
};

/**
 * Moves to the next/previous page.
 */
VIEWZI.view.newsViewPage = function(pageNum) {
	pageNum = parseInt(pageNum, 10);

	YAHOO.util.Dom.addClass('news_view_story_p' + VIEWZI.view.currentPage, 'hidden');
	YAHOO.util.Dom.addClass('news_view_footer', 'hidden');
	YAHOO.util.Dom.get('news_view_top_story').className = (pageNum == 1 ? '' : 'hidden');
	YAHOO.util.Dom.get('news_view_pagelink' + VIEWZI.view.currentPage).className = 'news_view_next_page';

	if (Math.abs(VIEWZI.view.currentPage - pageNum) == 1 || VIEWZI.view.currentPage > pageNum) {
		// going to next page
		VIEWZI.view.currentPage = pageNum;
		VIEWZI.view.multiPageSwitchTarget = -1;
		YAHOO.util.Dom.get('news_view_pagelink' + VIEWZI.view.currentPage).className = 'news_view_current_page';
	} else {
		// switching more than one page at once
		while ((VIEWZI.view.currentPage + 1) <= pageNum) {
			VIEWZI.view.currentPage++;
			if (YAHOO.util.Dom.get('news_view_story_p' + VIEWZI.view.currentPage).childNodes.length === 0) {
				break;
			}
		}
		VIEWZI.view.multiPageSwitchTarget = (VIEWZI.view.currentPage == pageNum ? -1 : pageNum);
		YAHOO.util.Dom.get('news_view_pagelink' + pageNum).className = 'news_view_current_page';
	}

	var currentPageNode = YAHOO.util.Dom.get('news_view_story_p' + VIEWZI.view.currentPage);
	YAHOO.util.Dom.removeClass('news_view_story_p' + pageNum, 'hidden');

	if (currentPageNode.childNodes.length === 0) {
		YAHOO.util.Dom.addClass('news_view_story_p' + pageNum, 'loading');
		VIEWZI.view.addMoreNews();
	} else {
		YAHOO.util.Dom.setStyle('news_view_story_p' + pageNum, 'min-height', '0px');
		YAHOO.util.Dom.removeClass('news_view_footer', 'hidden');
	}
};

/**
 * Creates top news node and fetches additional data if needed.
 */
VIEWZI.view.createTopNewsNode = function(newsData) {
	var source_name = newsData.newsSource || newsData.url.replace('www.', '').split('://')[1].split('/')[0];
	var summary = '';
	if(null != newsData.summary){
		summary = newsData.summary.replace(/\n/g, ' ') ;
	}
	var	html =		'';
		html +=		'<div id="news_view_top_story_summary">';
		html +=		'	<h1><a href="' + newsData.url + '">' + newsData.title + '</a></h1>';
		html +=		'	<p><strong class="caps">' + source_name + '</strong> &ndash;' + summary + ' <a href="' + newsData.url + '">Read&nbsp;More</a></p>';
		html +=		'</div>';
		html +=		'<div id="news_view_top_story_credits">';
		html +=		'	<img src="' + newsData.image + '" alt="" id="news_view_top_img" />';
		html +=		'	<h3>' + (newsData.author || ' ') + '</h3>';
		html +=		'	<p class="news_view_top_published_on"><strong class="caps">Published: ' + VIEWZI.util.formatDate(newsData.pubdate) + '</strong></p>';
		html +=		'</div>';
		html +=		'<br clear="all" />';

		YAHOO.util.Dom.get('news_view_top_story').innerHTML = html;
};

VIEWZI.view.placeTopImage = function(tUrl) {
	var imagePlaceholder = YAHOO.util.Dom.get('news_view_top_img');
	imagePlaceholder.src = tUrl;
};

/**
 * Creates ordinary news node.
 */
VIEWZI.view.newsNodesAdded = 0;
VIEWZI.view.createNewsNode = function(newsData) {
	var source_name = newsData.newsSource || newsData.url.replace('www.', '').split('://')[1].split('/')[0];

	var html =		'';
		html +=		'<div class="news_view_story">';
		html +=		'	<h2><a href="' + newsData.url + '">' + newsData.title + '</a></h2>';
		html +=		'	<h3>' + (newsData.author || ' ') + '</h3>';
		html +=		'	<p><em>Published: ' + VIEWZI.util.formatDate(newsData.pubdate) + '</em></p>';
		html +=		'	<p><strong class="caps">' + source_name + '</strong> &ndash; ' + newsData.summary + ' <a href="' + newsData.url + '">Read&nbsp;More</a></p>';
		html +=		'</div>';

		VIEWZI.view.newsNodesAdded++;
	if (VIEWZI.view.newsNodesAdded > 0 && VIEWZI.view.newsNodesAdded % VIEWZI.view.NEWS_PER_ROW === 0) {
		html += '<div class="news_view_story_divider"></div>';
	}

	YAHOO.util.Dom.get('news_view_story_p' + VIEWZI.view.currentPage).innerHTML += html;
};

VIEWZI.view.onResize = function() {
	VIEWZI.view.newsViewResize();
	VIEWZI.view.newsContainerResize();
};

VIEWZI.view.pageLoad = function() {	
	VIEWZI.dataresult.subscribe(VIEWZI.view.processQueryResults);
	VIEWZI.view.newsViewResize();
	VIEWZI.view.newsContainerResize();
	VIEWZI.view.addMoreNews();
};