MV = MV || {};

MV.DataTable = (function() {
    var _dt;    // will store reference to this

    var RESULT_ROWS_TOKEN = '{result_rows_token}';  // used for replacing adding the rows to the table

    var supplant = function supplant(s, o) {
        return s.replace(/{([^{}]*)}/g,
	        function(a, b) {
	            var r = o[b];
	            return typeof r === 'string' || typeof r === 'number' ? r : a;
	        }
	    );
    };

    var createResults = function createResults(data, transform, cols, dataTableProfile, isNationalSearch) {
        cols = cols.split(',');
        var resultRowTemplate = $('<div>').append(_dt.templates.resultRow.clone());  // need to get the entire element
        var disclaimerRowTemplate = $('<div>').append(_dt.templates.resultRowDisclaimer.clone());  // need to get the entire element
        var resultTable = $('<div>').append(_dt.templates.resultTable.attr('id', 'providerResultTable').removeAttr('class').addClass(dataTableProfile).find('tbody').html(RESULT_ROWS_TOKEN).end()); // replacing the content of the tbody in the template with a token for later replacing
        var resultSetDisclaimer = $('<div>').append(_dt.templates.resultSetDisclaimer.clone());
        if (cols.length > 0) {
            var col;
            var thead = $('#providerResultHeadTable');
            resultRowTemplate.find('td').removeAttr('display').end();

            // loop through the available cols setting the table header and template td's to display or not display
            for (var i = 0; i < cols.length; i++) {
                col = cols[i];
                resultRowTemplate.find('td.' + col).attr('display', 'true');
                thead.find('td.' + col).attr('display', 'true');
            };

            // loop through all the template td's and check to see whether or not they should be displayed
            resultRowTemplate.find('td').each(function(index) {
                var $this = $(this);
                if (!$this.attr('display')) {
                    this.parentNode.removeChild(this);  //$this.remove() is causing problems with the form events for some reason
                    thead.find('th:eq(' + index + ')').hide();
                } else {
                    thead.find('th:eq(' + index + ')').show();
                }
            });
        }

        var tbl = '';
        var rowData = '';
        var resultTableString = resultTable.html().toString();
        var disclaimerRowString = disclaimerRowTemplate.find('td').attr('colspan', cols.length).end().html().toString();
        var resultsRowString = resultRowTemplate.html().toString();
        var resultSetDisclaimerString = resultSetDisclaimer.find('td').attr('colspan', cols.length).end().html().toString();
        var compositeRowString = '';
        var str = '';
        var d = '';
        var counter = 1;
        if (data && data.length > 0 && data[0]) {
            for (i = 0; i < data.length; i++) {
                compositeRowString = '';
                d = transform(data[i]);
                d.zebra = (counter % 2 == 0) ? 'even' : 'odd';
                compositeRowString = (d.disclaimer) ? resultsRowString + '' + disclaimerRowString : resultsRowString;
                str += supplant(compositeRowString, d);
                counter += 1;
            }

            // add in the disclaimer if any if this is a national search
            if (isNationalSearch) {
                str += supplant(resultSetDisclaimerString, _dt.settings.disclaimers);
            }
        }

        return resultTableString.replace(RESULT_ROWS_TOKEN, str);
    };

    return {
        settings: {
            resultColsProfile: '',
            resultCols: [],
            disclaimers: {},
            dataTransform: function() { }
        },
        init: function(dataTableTemplates) {
            _dt = this;
            this.templates = dataTableTemplates;
            return this;
        },
        createResults: function(data, transform, cols, resultColumnProfile, isNationalSearch) {
            return createResults(data, transform, cols, resultColumnProfile, isNationalSearch);
        }
    };

    // module end
})();