var myDataTable = null;
var origRecordSet = null;
var origRecords = null;
var origRecordData = null;
var showingCategory = null;

function unfilter()
{
	origRecordSet.replaceRecords(origRecordData);
	document.getElementById("filter").value = '';
	document.getElementById("filter").focus();
	showingCategory = null;
	filterHeadlines();
}

function toggleCategory(catName)
{
	if (showingCategory == null) {
		var filterRecs = new Array();
		for (var i=0; i<origRecords.length; i++) {
			if (origRecords[i].getData('category') == catName) {
				filterRecs.push(origRecords[i].getData());
			}
		}
		origRecordSet.replaceRecords(filterRecs);
		var showLink = "Showing " + filterRecs.length + " headlines in " + catName;
		showLink += ' [<a href="javascript:unfilter();">Show All</a>]';
		document.getElementById("matchCount").innerHTML = showLink;
		document.getElementById("filter").value = '';
		showingCategory = catName;
	} else {
		unfilter();
	}

	myDataTable.refreshView();
}

function filterHeadlines()
{
	if (origRecords == null) {
		origRecordSet = myDataTable.getRecordSet();
		origRecords = origRecordSet.getRecords();
		origRecordData = new Array();
		for (var i=0; i<origRecords.length; i++) {
			origRecordData.push(origRecords[i].getData());
		}
	}
	
	var filter = document.getElementById("filter").value;
	// trim leading & trailing whitespace
	filter = filter.replace(/^\s*|\s*$/, "");
	// remove periods 
	filter = filter.replace(/\./, "");
	// convert commas to spaces
	filter = filter.replace(/,/, " ");
	// convert non-alphanumeric characters to dashes
	filter = filter.replace(/[^\sA-Za-z0-9]/, "-");
	// remove extraneous whitespace
	filter = filter.replace(/\s+/, " ");
	// filter text is always lowercase to allow case insensitivity
	filter = filter.toLowerCase();
	
	if (filter != "") {
		filterVars = filter.split(" ");
		var filterRecs = new Array();
		for (var i=0; i<origRecords.length; i++) {
			var filterText = origRecords[i].getData('filterText');
		
			if (filterText.indexOf(filterVars[0]) != -1) {
				filterRecs.push(origRecords[i].getData());
			}
		}
	
		for (var i=1; i<filterVars.length; i++) {
			if (filterVars[i] != "") {
				for (var f=filterRecs.length-1; f>=0; f--) {
					var filterText = filterRecs[f].filterText;
					if (filterText.indexOf(filterVars[i]) == -1) {
						filterRecs.splice(f, 1);
					}
				}
			}
		}
		
		var showLink = filterRecs.length + " match" + (filterRecs.length == 1 ? "" : "es") + " out of " + origRecords.length + " headlines";
		showLink += ' [<a href="javascript:unfilter();">Show All</a>]';
		document.getElementById("matchCount").innerHTML = showLink;
		origRecordSet.replaceRecords(filterRecs);
	} else {
		document.getElementById("matchCount").innerHTML = "Showing all " + origRecords.length + " headlines";
		origRecordSet.replaceRecords(origRecordData);
	}

	myDataTable.refreshView();
	document.getElementById("filter").focus();
}

var sortAge = function(a, b, desc) {
    // Deal with empty values
    if(!YAHOO.lang.isValue(a)) {
        return (!YAHOO.lang.isValue(b)) ? 0 : 1;
    }
    else if(!YAHOO.lang.isValue(b)) {
        return -1;
    }

    var comp = YAHOO.util.Sort.compare;
    return comp(a.getData("age"), b.getData("age"), desc);
}

var formatCenteredField = function(elCell, oRecord, oColumn, oData) {
	var field = '<center>';
	field += oData;
	field += '</center>';
	elCell.innerHTML = field;
}

var formatHeadlineLink = function(elCell, oRecord, oColumn, oData) {
	var headlineLink = '<a href="' + oRecord.getData('link');
	headlineLink += '" title="' + oRecord.getData('preview') + '">';
	headlineLink += oRecord.getData('headline') + '</a>';
	elCell.innerHTML = headlineLink;
}

var formatCategoryLink = function(elCell, oRecord, oColumn, oData) {
	var catLink = '<center><a href="javascript:toggleCategory(';
	catLink += "'" + oData + "');" + '">' + oData + "</a></center>";
	elCell.innerHTML = catLink;
}

var tableDoneCallback = function() {
	document.getElementById("filter").value = '';
	filterHeadlines();
}

function loadTable()
{
	document.getElementById("filter").focus();

	var myDataSource = new YAHOO.util.DataSource("/screener/headline-json.php");
	myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
	myDataSource.responseSchema = {
	    resultsList: "Headlines", 
	    fields: ["category", "headline", "filterText", "link", "preview", "updated", "age", "order" ]
	};

	var myColumnDefs = [
    	{key:"order", label:"Order", width:40, sortable:true, resizeable:true, formatter:formatCenteredField},
	    {key:"category", label:"Category", width:125, sortable:true, resizeable:true, formatter:formatCategoryLink},
	    {key:"headline", label:"Headline", width:450, sortable:true, resizeable:true, formatter:formatHeadlineLink},
	    {key:"updated", label:"Updated", width:125, sortable:true, sortOptions:{sortFunction:sortAge}, resizeable:true, formatter:formatCenteredField}
	];
	var myColumnSet = new YAHOO.widget.ColumnSet(myColumnDefs); 

	myDataTable = new YAHOO.widget.DataTable("myContainer", myColumnSet, myDataSource);
	myDataTable.subscribe('initEvent', tableDoneCallback);
}
