﻿var _dataTable = null;
var _dataSource = null;
var _sortedBy = null;
var _rowsPerPage = 10;
var _startIndex = 0;
var _query = "";

var getQueryString = function(sort, dir) {
    // 'ie' param to get around IE's caching
    return "sort=" + sort + "&dir=" + dir + "&startIndex=" + _startIndex + "&results=" + _rowsPerPage + "&search=" + _query +
        "&ie=" + new Date().getTime();
};

var handlePagination = function(state) {
    _startIndex = state.recordOffset;
};

var generateRequest = function() {
    var sortedBy = _dataTable.getState().sortedBy;
    
    if (!sortedBy)
		sortedBy = "";
	
  
    try { var sortDir = sortedBy.dir == YAHOO.widget.DataTable.CLASS_ASC ? "asc" : "desc"; } 
    catch (ex) { var sortDir = "asc"; }   
    
	return getQueryString(sortedBy.key, sortDir);
};

var doSearch = function() {
    _sortedBy = _dataTable.getState().sortedBy;
    _startIndex = 0;
    _query = $("search").value;
    _dataSource.sendRequest(generateRequest(), _dataTable.onDataReturnInitializeTable, _dataTable);
};

// Parse json date
var stringToDate = function(sData) {
    var dateRegex = /-?\d+/;
    var millisecs = dateRegex.exec(sData);
    var d = new Date(0);
    d.setUTCMilliseconds(millisecs);
    return d;
};

YuiDataTable = function(myColumnDefs, dataSourceUrl, responseSchema, initialSortCol, rowsPerPage, postRenderCallback, initialSortDir) {

	if (!initialSortDir) initialSortDir = YAHOO.widget.DataTable.CLASS_ASC;

    _rowsPerPage = rowsPerPage;
    _query = $("search").value;

    // DataSource instance
    _dataSource = new YAHOO.util.DataSource(dataSourceUrl);
    _dataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
    _dataSource.connXhrMode = "queueRequests";
    _dataSource.responseSchema = responseSchema;

    // DataTable configuration
    var myConfigs = {
        initialRequest: getQueryString(initialSortCol, initialSortDir == YAHOO.widget.DataTable.CLASS_ASC ? "asc" : "desc"), // Initial request for first page of data
        dynamicData: true, // Enables dynamic server-driven data
        sortedBy: { key: initialSortCol, dir: initialSortDir }, // Sets UI initial sort arrow
        paginator: new YAHOO.widget.Paginator({ rowsPerPage: rowsPerPage, containers:'dt-paginator' }), // Enables pagination
        generateRequest: generateRequest,
        dateOptions : { format:"%d/%m/%Y" }
    };

    myConfigs.paginator.subscribe('changeRequest', handlePagination);

    // DataTable instance
    _dataTable = new YAHOO.widget.DataTable("dynamicdata", myColumnDefs, _dataSource, myConfigs);
    // Update totalRecords on the fly with value from server
    
    _dataTable.handleDataReturnPayload = function(oRequest, oResponse, oPayload) {
        //alert(Object.toJSON(oResponse));
        if (oPayload == undefined) {
            // MW: from doSearch() oPayload is undefined so we need to populate it
            oPayload = {
                totalRecords: oResponse.meta.totalRecords,
                //paginator: xxxxx, is this required?
                sortedBy: _sortedBy
            };
        }
        else {
            oPayload.totalRecords = oResponse.meta.totalRecords;
        }
        return oPayload;
    }

    // Subscribe to events for row selection
    _dataTable.subscribe("rowMouseoverEvent", _dataTable.onEventHighlightRow);
    _dataTable.subscribe("rowMouseoutEvent", _dataTable.onEventUnhighlightRow);
    
    if (postRenderCallback)
    {
		// This event happens after the table has been redrawn, e.g. because the data was refreshed.
		_dataTable.subscribe("postRenderEvent", postRenderCallback);
    }
}

// a better formatDate method, this one with hours and minutes
formatDate = function(elCell, oRecord, oColumn, oData) 
{
	var oDate = oData;

	if(oDate instanceof Date) 
	{
		var month = oDate.getMonth()+1;
		if (String(month).length == 1) month = "0" + month;
		
		var day = oDate.getDate();
		if (String(day).length == 1) day = "0" + day;
		
		var hour = oDate.getHours();
		if (String(hour).length == 1) hour = "0" + hour;
		
		var minute = oDate.getMinutes();
		if (String(minute).length == 1) minute = "0" + minute;

		elCell.innerHTML = day + "/" + month  + "/" + oDate.getFullYear() + " " + hour + ":" + minute;
	}
}
