YAHOO.util.Event.addListener(window, "load", function() {
    YAHOO.example.Basic = function() {
        var categoryId = 0;
        var producerId = 0;
        var ajAction = YAHOO.util.Dom.get('ajaction').value;
        var recordsPerPage = recordsPerPage = YAHOO.util.Dom.get('records_per_page').value;
        var searchString;
        var searchCategoryId;
        var query;
        var _sortKey;


		// PRODUCTS List Grid by rating - Dante
        if (ajAction == 'products' || ajAction == 'free_products')
        {
            categoryId   = YAHOO.util.Dom.get('category_id').value;
            producerId   = YAHOO.util.Dom.get('producer_id').value;
            freeItemTypeId = YAHOO.util.Dom.get('free_item_type_id').value;
            searchString = YAHOO.util.Dom.get('search_string').value;
            searchCategoryId  = YAHOO.util.Dom.get('search_category_id').value;

            query = "ajaction=" + (ajAction == 'free_products' ? 'free_' : '') + "products&search_string=" + escape(searchString) + "&search_category_id=" + searchCategoryId + "&category_id=" + categoryId + "&producer_id=" + producerId + '&';
            _sortKey = 'date';
            _sortDir = 'desc';
        }
		
		// Latest PRODUCTS List Grid by most recent date - Dante
        else if (ajAction == 'latest')
        {
            query = 'ajaction=latest&';
            _sortKey = 'date';
            _sortDir = 'desc';
        }

        var addslashes = function(str) {
            return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\u0000/g, "\\0");
        }


       var stringToDate = function(sData) {
            var regex = /^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
            var parts = sData.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
            return YAHOO.util.Date.format(new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]), {format:"%D"}).toString();
        }

        this.myPlayFormatter = function(el, oRecord, oColumn, oData) {
            el.innerHTML = '<a href="javascript:;" onFocus="wimpy_clearPlaylist();" onClick="wimpy_addTrack(true,\'track.php?download_product_id='
                           + oRecord.getData('item_id')
                           + "&download_count=0', '', '"
                           + addslashes(oRecord.getData('item_name'))
                           + '\', \'\', \'\');"><img border="0" alt="play beat" src="../../images/Oct09/btn_beats_play.gif" /></a>';
        };
        YAHOO.widget.DataTable.Formatter.myPlay = this.myPlayFormatter;

        this.myTitleFormatter = function(el, oRecord, oColumn, oData) {
            el.innerHTML = '<a class="product_title" href="' + oRecord.getData('product_url') + '">' + oData + '</a>';
        };
        YAHOO.widget.DataTable.Formatter.myTitle = this.myTitleFormatter;

        this.myReviewFormatter = function(el, oRecord, oColumn, oData) {
            el.innerHTML = '<a href="/reviews.php?item_id=' + oRecord.getData('item_id') + '"><img src="images/curved/' + oRecord.getData('rating_image') + '" alt="' + oRecord.getData('rating_alt') + '" align="top" border="0"></a>';
        };
        YAHOO.widget.DataTable.Formatter.myReview = this.myReviewFormatter;

        this.myAddToCartFormatter = function(el, oRecord, oColumn, oData) {            
            if (typeof(freeItemTypeId) != 'undefined' && oRecord.getData('item_type') == freeItemTypeId) {
                el.innerHTML  = (oRecord.getData('buy_href') ? '<a href="/download_free_beat.php?download_id=' + oRecord.getData('item_id') + '">' : '<a href="/user_login.php?return_page=%2Ffree-beats.php" onClick="javascript:return confirm(\'Oops! You have to be signed-in to do that.\')">') +
                '<img src="../../images/Oct09/btn_beats_download.gif" border="0" alt="Download Free Beat" /></a>';
            } else {
                el.innerHTML = '<a class="" id="add" href="' + oRecord.getData('buy_href') + '&ax=1&hash=' + escape(window.location.hash) + '"><img src="../../images/Oct09/btn_beats_buy.gif" border="0" alt="buy beat" /></a>';
            } 
        };
        YAHOO.widget.DataTable.Formatter.myAddToCart = this.myAddToCartFormatter;


        var myColumnDefs = [
            {key:"play", label:"Play", formatter:"myPlay"},
            {key:"item_name", label:"Title", sortable:true, formatter:"myTitle"},
            {key:"producer", label:"Producer", sortable:true, resizeable:false, formatter:YAHOO.widget.DataTable.formatLink, width:70},
            {key:"rating", label:"Rating", sortable:true, resizeable:false, formatter:"myReview" },
            {key:"price", label:"Price", sortable:true, resizeable:false, formatter:YAHOO.widget.DataTable.formatCurrency, width:50},
            {key:"date", label:"Released", sortable:true, resizeable:false, width:67},
            {key:"", formatter:"myAddToCart"}
        ];

        var myDataSource = new YAHOO.util.DataSource("ajax/products.php?" + query);
        myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
        myDataSource.responseSchema = {
            resultsList: "products",
            fields: [
                {key: "item_id", parser:"number"},
                {key: "item_type", parser:"number"},
                {key: "date", parser:stringToDate},
                {key: "producer"},
                {key: "item_name"},
                {key: "product_url"},
                {key: "price", parser:"number"},
                {key: "buy_href"},
                {key: "rating_image"},
                {key: "rating_alt"}
            ],
            metaFields: {
                totalRecords: "totalRecords",
                paginationRecordOffset : "startIndex",
                paginationRowsPerPage : "pageSize",
                sortKey: "sort",
                sortDir: "dir"
            }
        };

        var myPaginator = new YAHOO.widget.Paginator({
                    rowsPerPage           : recordsPerPage,
                    containers            : [ "pag-above", "pag-below" ],
                    template              : "\{CurrentPageReport\}\{PreviousPageLink\}\{PageLinks\}\{NextPageLink\}",
                    pageReportTemplate    : "Page \{currentPage\} of \{totalPages\}",
                    previousPageLinkLabel : "&laquo;",
                    nextPageLinkLabel     : "&raquo;"
        });

        var myConfigs = {
                dynamicData: true,
                paginator: myPaginator,
                initialLoad : false
        };

        var myDataTable = new YAHOO.widget.DataTable("products", myColumnDefs, myDataSource, myConfigs);

        myDataTable.showTableMessage(myDataTable.get("MSG_LOADING"), YAHOO.widget.DataTable.CLASS_LOADING);

        myDataTable.set("MSG_EMPTY", searchString ? "We've found 0 songs matching the term(s)..." : "Currently there are no songs listed in this category.");

        YAHOO.example.BHMIntegration = {
            myPaginator  : myPaginator,
            myDataSource : myDataSource,
            myDataTable  : myDataTable
        };

        var History = YAHOO.util.History;

        var handleSorting = function (oColumn) {
            var sDir = this.getColumnSortDir(oColumn);
            var newState = generateRequest(0, oColumn.key, sDir, this.get("paginator").getRowsPerPage());
            History.navigate("myDataTable", newState);
        };
        myDataTable.sortColumn = handleSorting;

        var handlePagination = function(state) {
            var sortedBy  = this.get("sortedBy"),
                newState = generateRequest(
                state.recordOffset, sortedBy.key, sortedBy.dir, state.rowsPerPage
            );
            History.navigate("myDataTable", newState);
        };
        myPaginator.unsubscribe("changeRequest", myDataTable.onPaginatorChangeRequest);
        myPaginator.subscribe("changeRequest", handlePagination, myDataTable, true);

        myDataTable.doBeforeLoadData = function(oRequest, oResponse, oPayload) {
            var meta = oResponse.meta;
            oPayload.totalRecords = meta.totalRecords || oPayload.totalRecords;
            oPayload.pagination = {
                rowsPerPage: meta.paginationRowsPerPage || recordsPerPage,
                recordOffset: meta.paginationRecordOffset || 0
            };
            oPayload.sortedBy = {
                key: meta.sortKey || _sortKey,
                dir: (meta.sortDir) ? "yui-dt-" + meta.sortDir : "yui-dt-" + _sortDir
            };
            return true;
        };

        var generateRequest = function(startIndex,sortKey,dir,results) {
            startIndex = startIndex || 0;
            sortKey   = sortKey || _sortKey;
            dir   = (dir) ? dir.substring(7) : _sortDir;
            results   = results || recordsPerPage;
            return "results="+results+"&startIndex="+startIndex+"&sort="+sortKey+"&dir="+dir;
        };

        var handleHistoryNavigation = function (request) {
            myDataSource.sendRequest(request,{
                success : myDataTable.onDataReturnSetRows,
                failure : myDataTable.onDataReturnSetRows,
                scope : myDataTable,
                argument : {}
            });
        };

        var initialRequest = History.getBookmarkedState("myDataTable") || generateRequest();

        History.register("myDataTable", initialRequest, handleHistoryNavigation);

        History.onReady(function() {
            var currentState = History.getCurrentState("myDataTable");
            handleHistoryNavigation(currentState);
        });

        YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");

    }();
});

YAHOO.widget.DataTable.prototype.getTdEl = function(cell) {
    var Dom = YAHOO.util.Dom,
    lang = YAHOO.lang,
    elCell,
    el = Dom.get(cell);

    // Validate HTML element
    if(el && (el.ownerDocument == document)) {
        // Validate TD element
        if(el.nodeName.toLowerCase() != "td") {
            // Traverse up the DOM to find the corresponding TR element
            elCell = Dom.getAncestorByTagName(el, "td");
        } else {
            elCell = el;
        }
        // Make sure the TD is in this TBODY
        if(elCell && (elCell.parentNode.parentNode == this._elTbody)) {
        // Now we can return the TD element
            return elCell;
        }
    } else if(cell) {
        var oRecord, nColKeyIndex;
        if(lang.isString(cell.columnKey) && lang.isString(cell.recordId)) {
            oRecord = this.getRecord(cell.recordId);
            var oColumn = this.getColumn(cell.columnKey);
            if(oColumn) {
                nColKeyIndex = oColumn.getKeyIndex();
            }
        }
        if(cell.record && cell.column && cell.column.getKeyIndex) {
            oRecord = cell.record;
            nColKeyIndex = cell.column.getKeyIndex();
        }
        var elRow = this.getTrEl(oRecord);
        if((nColKeyIndex !== null) && elRow && elRow.cells && elRow.cells.length > 0) {
            return elRow.cells[nColKeyIndex] || null;
        }
    }
    return null;
};