VIEWZI.view.filters = null;

var POSTS_NO = 10;
var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

function activateAndShowTabContents(tabId) {
	YAHOO.util.Dom.setStyle("techcrunch_tabphotos", 'display', tabId === "photos" ? 'block' : 'none');
	YAHOO.util.Dom.setStyle("techcrunch_tabcompany", 'display', tabId === "company" ? 'block' : 'none');
	YAHOO.util.Dom.setStyle("techcrunch_tabposts", 'display', tabId === "posts" ? 'block' : 'none');

	YAHOO.util.Dom.replaceClass('techcrunch_navtabphotos', tabId === "photos" ? "techcrunch_inactive" : "techcrunch_active", tabId === "photos" ? "techcrunch_active" : "techcrunch_inactive");
	YAHOO.util.Dom.replaceClass('techcrunch_navtabcompany', tabId === "company" ? "techcrunch_inactive" : "techcrunch_active", tabId === "company" ? "techcrunch_active" : "techcrunch_inactive");
	YAHOO.util.Dom.replaceClass('techcrunch_navtabposts', tabId === "posts" ? "techcrunch_inactive" : "techcrunch_active", tabId === "posts" ? "techcrunch_active" : "techcrunch_inactive");
}

function resizeCompanyCol() {
	var c = YAHOO.util.Dom.getViewportWidth() - 550;
	YAHOO.util.Dom.setStyle("techcrunch_col_companyinfo", 'width', c + 'px');
}

function changeTab(t) {
	switch (t) {
	case "photos":
		activateAndShowTabContents("photos");
		break;
	case "company":
		activateAndShowTabContents("company");
		resizeCompanyCol();
		break;
	default:
		activateAndShowTabContents("posts");
	}
}

function openFilter() {
	YAHOO.util.Dom.setStyle("techcrunch_datefilter", 'position', 'static');
}

function closeFilter() {
	YAHOO.util.Dom.setStyle("techcrunch_datefilter", 'position', 'absolute');
}

function showErrorMessage(whichTab) {
	switch (whichTab) {
	case "photos":
		YAHOO.util.Dom.setStyle("techcrunch_error_nophotos", 'position', 'static');
		break;
	case "company":
		YAHOO.util.Dom.setStyle("techcrunch_error_nocompany", 'position', 'static');
		break;
	default:
		YAHOO.util.Dom.setStyle("techcrunch_error_noposts", 'position', 'static');
	}
}

VIEWZI.view.stripZero = function(str) {
	return str.indexOf('0') === 0 ? str.substring(1) : str;
};

VIEWZI.view.daysInMonth = function(month, year) {
	return 32 - new Date(year, month, 32).getDate();
};

VIEWZI.view.localizeDate = function(time) {
	var date = new Date(time);
	return monthNames[date.getMonth()] + " " + date.getDate() + ", " + date.getFullYear();
};

VIEWZI.view.parseTime = function(year, month, day) {
	month = month.indexOf('0') === 0 ? month.substring(1) : month;
	return new Date(year, parseInt(month, 10) - 1, day).getTime();
};

VIEWZI.view.processTechcrunchResult = function(evtId, evt) {
	if (evt[0].id.indexOf('techcrunch_by') < 0) {
		return;
	}

	if (!evt[0].data.length)
	{
		document.getElementById('techcrunch_navtabposts').style.display = 'none';
		document.getElementById('techcrunch_columns').innerHTML = '<div id="techcrunch_no_results"><span>Sorry, no results were found.</span></div>';
		return;
	}

	var data = evt[0].data;
	var postsByDateContainer = YAHOO.util.Dom.get("techcrunch_leftleft");
	var postsByCommentContainer = YAHOO.util.Dom.get("techcrunch_right");
	var photosContainer = YAHOO.util.Dom.get('techcrunch_photos');

	YAHOO.util.Dom.addClass('techcrunch_loading', 'hidden');
	YAHOO.util.Dom.removeClass('techcrunch_tabposts_contents', 'hidden');

	for (var i = 0; i < data.length; i++) {
		var time = VIEWZI.view.parseTime.apply(this, data[i].pubdate.split('-'));
		var date = VIEWZI.view.localizeDate(time);
		var nodeHtml = "<div class=\"techcrunch_postitem\" id=\"techcrunch_datepost_" + (i + 1) + "\">";
		nodeHtml += "<p><a href=\"" + data[i].url + "\">" + data[i].title + "</a><span class=\"techcrunch_commentcount\"></span><br />";
		nodeHtml += "<span class=\"techcrunch_date\">" + date + "</span> <span class=\"techcrunch_author\"></span></p>";
		nodeHtml += "</div>";

		postsByDateContainer.innerHTML += nodeHtml;

		var node = document.getElementById('techcrunch_datepost_' + (i + 1));
		var childNodes = YAHOO.util.Dom.getElementsByClassName('techcrunch_postitem', 'div', postsByDateContainer);
		for (var i = 0; i < childNodes.length; i++) {
			var otherTime = parseInt(YAHOO.util.Dom.getElementsByClassName('techcrunch_date', 'span', childNodes[i])[0].title, 10);
			if (otherTime < time) {
				postsByDateContainer.insertBefore(node, childNodes[i]);
				break;
			}
		}

		VIEWZI.datapull.getData(data[i].metadata.key, "techcrunch_post", "", 0, 0, "techcrunch_post_" + (i + 1));
	}

	if (YAHOO.util.Dom.getElementsByClassName('techcrunch_postitem', 'div', postsByDateContainer).length < POSTS_NO) {
		VIEWZI.view.executeFilterQuery();
	} else if (VIEWZI.view.filters.length > 0) {
		VIEWZI.view.filters = null;
	}
};

VIEWZI.view.processCommentsAndAuthorsResults = function(evtId, evt) {
	if (evt[0].id.indexOf("techcrunch_post") < 0) {
		return;
	}

	var postsByDateContainer = YAHOO.util.Dom.get("techcrunch_leftleft");
	var postsByCommentContainer = YAHOO.util.Dom.get("techcrunch_right");
	var photosContainer = YAHOO.util.Dom.get('techcrunch_photos');

	var id = evt[0].id.split('_')[2];
	var postElement = document.getElementById('techcrunch_datepost_' + id);
	YAHOO.util.Dom.getElementsByClassName('techcrunch_author', 'span', postElement)[0].innerHTML = evt[0].data[0].metadata.author;
	YAHOO.util.Dom.getElementsByClassName('techcrunch_commentcount', 'span', postElement)[0].innerHTML = "(" +
		evt[0].data[0].metadata.no_of_comments + (parseInt(evt[0].data[0].metadata.no_of_comments, 10) !== 1 ? " comments" : " comment") + ")";

	var childNodes = YAHOO.util.Dom.getElementsByClassName('techcrunch_postitem', 'div', postsByCommentContainer);
	for (var i = 0; i < childNodes.length; i++) {
		var nodeCommentsNo = parseInt(YAHOO.util.Dom.getElementsByClassName('techcrunch_commentcount', 'span', childNodes[i])[0].innerHTML.substring(1), 10);
		var commentsNo = parseInt(evt[0].data[0].metadata.no_of_comments, 10);
		if (nodeCommentsNo < commentsNo) {
			break;
		}
	}
	if (i === childNodes.length) {
		postsByCommentContainer.appendChild(postElement.cloneNode(true));
	} else {
		var clone = postElement.cloneNode(true);
		clone.id = "techcrunch_commentpost_" + id;
		postsByCommentContainer.insertBefore(clone, childNodes[i]);
	}

	var clearDiv = YAHOO.util.Dom.getElementsByClassName('clear', 'div', photosContainer)[0];
	if (clearDiv) {
		clearDiv.parentNode.removeChild(clearDiv);
	}
	if (evt[0].data[0].metadata.images.length > 0) {
		YAHOO.util.Dom.removeClass(document.getElementById('techcrunch_navtabphotos'), 'hidden');
	}

	for (var i = 0; i < evt[0].data[0].metadata.images.length; i++) {
		photosContainer.innerHTML += "<img src=\"" + evt[0].data[0].metadata.images[i].split('\"')[0] + "\" alt=\"TechCrunchIMG" + i + "\" />";
	}
	photosContainer.innerHTML += "<div class=\"clear\"></div>";
};

VIEWZI.view.processCrunchBaseResult = function(evtId, evt) {
	if (evt[0].id !== 'crunchbase') {
		return;
	}

	var data = evt[0].data[0];
	if (!data) {
		return;
	}

	YAHOO.util.Dom.addClass('techcrunch_loading', 'hidden');
	YAHOO.util.Dom.removeClass('techcrunch_tabposts_contents', 'hidden');
	YAHOO.util.Dom.removeClass('techcrunch_navtabcompany', 'hidden');

	var container = document.getElementById("techcrunch_col_companyinfo");
	var container2 = document.getElementById("techcrunch_peoplecount");

	var summaryParts = data.summary.split('\n');

	var nodeHtml = "<div class=\"techcrunch_header\"><span>Company Info</span><div style=\"clear:both\"></div></div>";
	nodeHtml += "<img src=\"" + data.metadata.logo  + "\" alt=\"" + data.title + "\" id=\"techcrunch_companylogo\"/>";
	nodeHtml += "<div id=\"techcrunch_company_description\"><p>";
	for (var i = 0; i < summaryParts.length; i++) {
		nodeHtml += summaryParts[i] + ' ';
	}
	nodeHtml += "</p></div>";

	nodeHtml += "<div id=\"techcrunch_company_summary\"><ul>";
	for (var i = 0; i < data.metadata.general.length; i++) {
		nodeHtml += "<li><strong>" + data.metadata.general[i].title + ":</strong> ";
		
		if (data.metadata.general[i].desc)
		{
			nodeHtml += data.metadata.general[i].desc;
		}
		else
		{
			nodeHtml += 'N/A';
		}

		nodeHtml += '</li>';
	}
	nodeHtml += "</ul>";

	nodeHtml += "<ul>";
	for (var i = 0; i < data.metadata.people.length; i++) {
		nodeHtml += "<li><strong>" + data.metadata.people[i].name + ":</strong> ";
		
		if (data.metadata.people[i].title)
		{
			nodeHtml += data.metadata.people[i].title;
		}
		else
		{
			nodeHtml += 'N/A';
		}

		nodeHtml += '</li>';
	}
	nodeHtml += "</ul></div>";

	container.innerHTML = nodeHtml;

	/* filling container2 */
	container2.innerHTML = "<p><img src=\"" + data.metadata.compete_img + "\" alt=\"Compete.com people count\" /></p>";
};

VIEWZI.view.processTechcrunchPopularityResult = function(evtId, evt) {
	if (evt[0].id !== 'techcrunch_popularity') {
		return;
	}

	var data = evt[0].data;
	var postsByPopularityContainer = YAHOO.util.Dom.get("techcrunch_center");
	var photosContainer = YAHOO.util.Dom.get('techcrunch_photos');

	YAHOO.util.Dom.addClass('techcrunch_loading', 'hidden');
	YAHOO.util.Dom.removeClass('techcrunch_tabposts_contents', 'hidden');

	VIEWZI.dataresult.subscribe(function(evtId, evt) {
		if (evt[0].id.indexOf("techcrunch_popularity_post_") < 0) {
			return;
		}

		var id = evt[0].id.split('_')[3];
		var postElement = document.getElementById('techcrunch_poppost_' + id);
		YAHOO.util.Dom.getElementsByClassName('techcrunch_author', 'span', postElement)[0].innerHTML = evt[0].data[0].metadata.author;
		if (evt[0].data[0].metadata.no_of_comments.length > 0) {
			YAHOO.util.Dom.getElementsByClassName('techcrunch_commentcount', 'span', postElement)[0].innerHTML = "(" +
				evt[0].data[0].metadata.no_of_comments + (parseInt(evt[0].data[0].metadata.no_of_comments, 10) !== 1 ? " comments" : " comment") + ")";
		}

		var clearDiv = YAHOO.util.Dom.getElementsByClassName('clear', 'div', photosContainer)[0];
		if (clearDiv) {
			clearDiv.parentNode.removeChild(clearDiv);
		}
		if (evt[0].data[0].metadata.images.length > 0) {
			YAHOO.util.Dom.removeClass(document.getElementById('techcrunch_navtabphotos'), 'hidden');
		}

		for (var i = 0; i < evt[0].data[0].metadata.images.length; i++) {
			photosContainer.innerHTML += "<img src=\"" + evt[0].data[0].metadata.images[i].split('\"')[0] + "\" alt=\"TechCrunchIMG" + i + "\" />";
		}
		photosContainer.innerHTML += "<div class=\"clear\"></div>";
	});

	for (var i = 0; i < data.length; i++) {
		var urlParts = data[i].url.split('/');
		if(urlParts.length < 6){
			continue;
		}
		var time = VIEWZI.view.parseTime(urlParts[3], urlParts[4], urlParts[5]);
		if(null == time || time == NaN){
			continue;
		}
		if(data[i].url.indexOf('author') > 0){
			continue;
		}
		var date = (urlParts[3] !== 'tag' ? VIEWZI.view.localizeDate(time) : '');
		var nodeHtml = "<div class=\"techcrunch_postitem\" id=\"techcrunch_poppost_" + (i + 1) + "\">";
		nodeHtml += "<p><a href=\"" + data[i].url + "\">" + data[i].title + "</a><span class=\"techcrunch_commentcount\"></span><br />";
		nodeHtml += "<span class=\"techcrunch_date\">" + date + "</span> <span class=\"techcrunch_author\"></span></p>";
		nodeHtml += "</div>";

		postsByPopularityContainer.innerHTML += nodeHtml;

		if (urlParts[3] !== 'tag' && urlParts[3] !== 'archives') {
			VIEWZI.datapull.getData(data[i].url, "techcrunch_post", "", 0, 0, "techcrunch_popularity_post_" + (i+1));
		}
	}
};

VIEWZI.view.removeAllElements = function(elements) {
	for (var i = 0; i < elements.length; i++) {
		elements[i].parentNode.removeChild(elements[i]);
	}
};

VIEWZI.view.pullResults = function() {
	VIEWZI.view.removeAllElements(YAHOO.util.Dom.getElementsByClassName('techcrunch_postitem', 'div', 'techcrunch_leftleft'));
	VIEWZI.view.removeAllElements(YAHOO.util.Dom.getElementsByClassName('techcrunch_postitem', 'div', 'techcrunch_right'));

	VIEWZI.dataresult.subscribe(VIEWZI.view.processCommentsAndAuthorsResults);
	VIEWZI.dataresult.subscribe(VIEWZI.view.processTechcrunchResult);
	VIEWZI.dataresult.subscribe(VIEWZI.view.processTechcrunchPopularityResult);
	VIEWZI.dataresult.subscribe(VIEWZI.view.processCrunchBaseResult);
	
	VIEWZI.datapull.getData(VIEWZI.searchterm, "techcrunch", "", 0, POSTS_NO, "techcrunch_bydate");
	VIEWZI.datapull.getData(VIEWZI.searchterm + " site:www.techcrunch.com", "yhoo", "", 0, POSTS_NO, "techcrunch_popularity");
	VIEWZI.datapull.getData(VIEWZI.searchterm, "crunchbase", "", 0, POSTS_NO, "crunchbase");
};

VIEWZI.view.prepareFilterQuery = function(startDate, endDate, diff) {
	var createDateFilter = function(year, month, day) {
		var newFilter = [VIEWZI.searchterm, year];
		newFilter.push((month + 1 < 10 ? "0" : "") + (month + 1));
		if (day) {
			newFilter.push((day < 10 ? "0" : "") + day);
		}

		return newFilter;
	};

	if (!VIEWZI.view.filters) {
		VIEWZI.view.filters = [];
		var entry = null;

		if (diff.months > 0 && diff.days !== 0) {
			for (var i = endDate.getDate(); i > 0; i--) {
				entry = createDateFilter(endDate.getFullYear(), endDate.getMonth(), i);
				VIEWZI.view.filters.push(entry);
			}
		}
		if (diff.months > 0 || diff.years > 0) {
			var date = endDate;
			while (true && VIEWZI.view.filters.length < 100) {
				date = new Date(date.getFullYear(), date.getMonth() - 1);
				if (date.getTime() < startDate.getTime()) {
					break;
				}

				entry = createDateFilter(date.getFullYear(), date.getMonth());
				VIEWZI.view.filters.push(entry);
			}
		}
	}

};

VIEWZI.view.executeFilterQuery = function() {
	if (VIEWZI.view.filters.length > 0) {
		VIEWZI.datapull.getData(VIEWZI.view.filters.splice(0, 1).join('|'), "techcrunch_date", "", 0, POSTS_NO, "techcrunch_bydate");
	}
};

VIEWZI.view.submitFilter = function() {
	VIEWZI.view.filters = null;
	var inputs = document.getElementById('techcrunch_datefilter').getElementsByTagName('input');
	for (var i = 0; i < inputs.length; i++) {
		YAHOO.util.Dom.removeClass(inputs[i], 'error');
	}

	var els = {
		startDay: document.getElementById('techcrunch_startday'),
		startMonth: document.getElementById('techcrunch_startmonth'),
		startYear: document.getElementById('techcrunch_startyear'),
		endDay: document.getElementById('techcrunch_endday'),
		endMonth: document.getElementById('techcrunch_endmonth'),
		endYear: document.getElementById('techcrunch_endyear')
	};

	var values = {
		startYear: els.startYear.value,
		startMonth: parseInt(VIEWZI.view.stripZero(els.startMonth.value), 10),
		startDay: parseInt(VIEWZI.view.stripZero(els.startDay.value), 10),
		endYear: els.endYear.value,
		endMonth: parseInt(VIEWZI.view.stripZero(els.endMonth.value), 10),
		endDay: parseInt(VIEWZI.view.stripZero(els.endDay.value), 10)
	};

	for (var i in els) {els[i].value = !isNaN(values[i]) ? values[i] : '';}

	var hasErrors = false;
	if (values.startYear.length === 0 || values.endYear.length === 0) {
		if (values.startYear.length === 0) {
			YAHOO.util.Dom.addClass(els.startYear, 'error');
		}
		if (values.endYear.length === 0) {
			YAHOO.util.Dom.addClass(els.endYear, 'error');
		}
		hasErrors = true;
	}

	if (isNaN(values.startMonth) || isNaN(values.endMonth)) {
		if (isNaN(values.startMonth)) {
			YAHOO.util.Dom.addClass(els.startMonth, 'error');
		}
		if (isNaN(values.endMonth)) {
			YAHOO.util.Dom.addClass(els.endMonth, 'error');
		}
		hasErrors = true;
	}

	if (isNaN(values.startDay) ^ isNaN(values.endDay)) {
		if (isNaN(values.startDay)) {
			YAHOO.util.Dom.addClass(els.startDay, 'error');
		}
		if (isNaN(values.endDay)) {
			YAHOO.util.Dom.addClass(els.endDay, 'error');
		}
		hasErrors = true;
	}

	if (hasErrors) {
		return;
	}

	var startDate	= new Date(values.startYear, values.startMonth, isNaN(values.startDay) ? 1 : values.startDay);
	var endDate		= new Date(values.endYear, values.endMonth, isNaN(values.endDay) ? 1 : values.endDay);
	var currentDate	= new Date();

	if (endDate.getTime() > currentDate.getTime()) {
		endDate = currentDate;
	}

	if (endDate.getTime() < startDate.getTime()) {
		YAHOO.util.Dom.addClass(els.endMonth, "error");
		YAHOO.util.Dom.addClass(els.endYear, "error");
		return;
	}

	var diff = {
		years: endDate.getFullYear() - startDate.getFullYear(),
		months: endDate.getMonth() - startDate.getMonth(),
		days: endDate.getDate() - startDate.getDate()
	};

	if (diff.months < 0) {
		diff.years--;
		diff.months += 12;
	}

	if (diff.days < 0) {
		diff.months--;
		diff.days += VIEWZI.view.daysInMonth(values.startYear, values.startMonth);
	}

	VIEWZI.view.removeAllElements(YAHOO.util.Dom.getElementsByClassName('techcrunch_postitem', 'div', 'techcrunch_leftleft'));
	VIEWZI.view.removeAllElements(YAHOO.util.Dom.getElementsByClassName('techcrunch_postitem', 'div', 'techcrunch_right'));

	VIEWZI.view.prepareFilterQuery(startDate, endDate, diff);
	VIEWZI.view.executeFilterQuery();
};

VIEWZI.view.onResize = function() {
	resizeCompanyCol();
};

VIEWZI.view.pageLoad = function() {
	//changeTab("company");
	VIEWZI.view.pullResults();
};