(function() {

    /**
     * SkuImageTable
     *
     * @namespace YAHOO.COGEN.tables
     */

    /**
     *
     * @namespace YAHOO.COGEN.tables
     * @class SkuImageTable
     */
    function Table(columnDefs, responseSchema, containerID, requestUrl, initialRequest, filterColumns, defaultSortColumn, defaultSortDirection) {
        var myDataSource = null,
        myDataTable = null;

        myDataSource = new YAHOO.util.DataSource(requestUrl);
        myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
        myDataSource.connXhrMode = "queueRequests";
        myDataSource.responseSchema = responseSchema;

        var requestBuilder = function (oState, oSelf) {
            var sort, dir, startIndex, results;

            oState = oState || {
                pagination: null,
                sortedBy: {key: null, dir: null}
            };

            oState.sortedBy = oState.sortedBy ||  {key:null, dir: null};

            oState.sortedBy.key || (oState.sortedBy.key = defaultSortColumn);
            oState.sortedBy.key || (oState.sortedBy.key = oSelf.getColumnSet().keys[0].getKey());

            if(defaultSortDirection && !oState.sortedBy.dir ){
                    oState.sortedBy.dir = defaultSortDirection=='desc' ? YAHOO.widget.DataTable.CLASS_DESC : YAHOO.widget.DataTable.CLASS_ASC;
            }
            else{
                oState.sortedBy.dir || (oState.sortedBy.dir = YAHOO.widget.DataTable.CLASS_ASC);
            }

            if(oState.sortedBy.dir==YAHOO.widget.DataTable.CLASS_DESC){
                dir='desc';
            }else{
                dir='asc';
            }

            //sort = (oState.sortedBy) ? oState.sortedBy.key : oSelf.getColumnSet().keys[0].getKey();
            //dir = (oState.sortedBy && oState.sortedBy.dir === YAHOO.widget.DataTable.CLASS_DESC) ? "desc" : "asc";

            startIndex = (oState.pagination) ? oState.pagination.recordOffset : 0;
            results = (oState.pagination) ? oState.pagination.rowsPerPage : null;

            var url = "&results=" 	+ results +
            "&startIndex=" 	+ startIndex +
            "&sort=" 		+ oState.sortedBy.key +
            "&dir=" 		+ dir;

            for(var i in filterColumns){
                url += "&" + filterColumns[i]+"="+ YAHOO.util.Dom.get(filterColumns[i]).value;
            }

            return url;
        };

        var requery = function() {
            var oState = myDataTable.getState(),
            request,
            oCallback;
            oState.pagination.recordOffset = 0;

            oCallback = {
                success : myDataTable.onDataReturnSetRows,
                failure : myDataTable.onDataReturnSetRows,
                argument : oState,
                scope : myDataTable
            };

            // Generate a query string
            request = myDataTable.get("generateRequest")(oState, myDataTable);

            // Fire off a request for new data.
            myDataSource.sendRequest(request, oCallback);
        }

        YAHOO.util.Event.addListener("clear","click", function(){
            for(var i in filterColumns){
                YAHOO.util.Dom.get(filterColumns[i]).value='';
            }
            requery();
        });
        
        YAHOO.util.Event.addListener("save_to_csv","click", function(){
        	var oState = myDataTable.getState(),
	            request,
	            oCallback;
	            oState.pagination.recordOffset = 0;
	       oState.pagination.rowsPerPage = 10000;
            // Generate a query string
            request = myDataTable.get("generateRequest")(oState, myDataTable);
            window.location.href=requestUrl+request+"&output=csv";
        });
        
        YAHOO.util.Event.addListener("save_to_xml","click", function(){
        	var oState = myDataTable.getState(),
	            request,
	            oCallback;
	            oState.pagination.recordOffset = 0;
	       oState.pagination.rowsPerPage = 10000;
            // Generate a query string
            request = myDataTable.get("generateRequest")(oState, myDataTable);
            window.location.href=requestUrl+request+"&output=xml";
        });

        YAHOO.util.Event.addListener("search","click", requery);


        var myConf = {
            initialRequest: initialRequest,
            dynamicData: true, // Enables dynamic server-driven data
            generateRequest: requestBuilder,
            paginator: new YAHOO.widget.Paginator({
                rowsPerPage: 15,
                containers: containerID + '-paginator'
            })
        } ;

        if(defaultSortColumn){
            myConf.sortedBy={key: defaultSortColumn, dir: defaultSortDirection? defaultSortDirection : 'asc'};
        }

        myDataTable = new YAHOO.widget.DataTable(containerID, columnDefs,
            myDataSource, myConf);

        myDataTable.handleDataReturnPayload = function(oRequest, oResponse, oPayload) {
            oPayload.totalRecords = oResponse.meta.totalRecords;
            var totalContainer = document.getElementById(containerID+'-total-count');
            if(totalContainer){
                totalContainer.innerHTML = oResponse.meta.totalRecords;
            }
            return oPayload;
        }

        this.requery=requery;
    }


    YAHOO.namespace("COGEN.tables");
    YAHOO.COGEN.tables.Table = Table;
})();
