var isOdd = false;
var resultsCache = new Object();
var queryField = null;
var RESULT_SIZE_LIMIT = 25;
var count;

function createTable(data) {
    isOdd = true;
    count = 0;
    var table = TABLE({'id':'data','cellspacing':'0','cellpadding': '0'},
            THEAD(null, TR(null, map(partial(TH, null), ["Description", "Code"]))),
            TBODY(null, map(rowDisplay, data)));
    displayMessage(count >= RESULT_SIZE_LIMIT ? 'Your query matched more than ' + RESULT_SIZE_LIMIT + ' diagnoses. Can you be more specific?' : '');
    return table;
}

function rowDisplay(row) {
    var domRow =  TR({'class': isOdd ? 'odd-row' : 'even-row', 'id': 'data-row-' + count},
            TD({'class': 'data-cell'}, moreInfoIcon(row[2]), row[0]), TD({'class': 'data-cell'}, row[1]));
    connect(domRow, 'onclick', function() { document.location = "/" + codeSystem + "/code/" + row[1]; });
    connect(domRow, 'onmouseover', function() {addElementClass(this, "highlight");});
    connect(domRow, 'onmouseout', function() {removeElementClass(this, "highlight");});
    isOdd = !isOdd;
    count += 1;
    return domRow;
}

function moreInfoIcon(shouldDisplay) {
    if (shouldDisplay) {
        return IMG({'src': '/images/exclamation.png', 'height': '16', 'width': '16','class': 'row-icon', 'title': 'More Info...'});
    }
    return IMG({'src': '/images/blank.gif', 'height': '16', 'width': '16','class': 'row-icon'});
}

function matches(description, query) {
    return description.toUpperCase().indexOf(query.toUpperCase()) != -1;
}

function clearTable() {
    swapDOM(getElement('data'), emptyTable());
    displayMessage('');
}

function displayMessage(message) {
    var attrs = {'id': 'warning-message'};
    if (message.length > 0) {
        attrs['class'] = 'warning';
    }
    return swapDOM(getElement('warning-message'), DIV(attrs, message));
}

function emptyTable() {
    return TABLE({'id':'data','cellspacing':'0','cellpadding':'0'});
}

function doOnLoad() {
	queryField = getElement('query');
	connect(queryField, 'onkeyup', doQuery);
	queryField.focus();
    doQuery(null);
}

function doQuery(event) {
	var query = queryField.value;
	if (query.length < MIN_QUERY_LENGTH) {
        clearTable();
		return;
	}
    queryServer(query);
}

function filterResults(query) {
	var filteredData = filter(
            function(tuple) {
                return matches(tuple[0], query) || matches(tuple[1], query) || (tuple.length > 3 && matches(tuple[3], query));
            }
            , results(query));

	swapDOM(getElement('data'), createTable(filteredData));
}

function queryServer(query) {
	if (results(query) == null || results(query).length >= RESULT_SIZE_LIMIT) {
		var deferred = loadJSONDoc("/search/" + codeSystem + "/" + query);
		deferred.addCallback(function(json) {
            resultsCache[query] = json;
            filterResults(queryField.value);
        });
		deferred.addErrback(logError);
	} else {
        filterResults(query);
    }
}

function results(query) {
	return resultsCache[query];
}

addLoadEvent(doOnLoad);
