﻿// -------- extjs grid panel helper functions -------- //

// create a store
function extJsStore_createStore(store, url, sortField, sortDirection, baseParams) {

    // create a new store if necessary
    if (store === null) {
        // create new store
        store = new Ext.data.Store({
        restful: false,
        proxy: new Ext.data.HttpProxy(
                new Ext.data.Connection({
                    url: url,
                    autoAbort: true, // see http://www.yui-ext.com/forum/showthread.php?t=81401 for more info
                    timeout: g_ajaxTimeoutMilliseconds
                })),
            baseParams: baseParams,
            reader: new Ext.data.JsonReader(),
            remoteSort: true,
            sortInfo: { field: sortField, direction: sortDirection }
        });
        
        // catch the exception. we don't appear to be able to prevent it bubbling up though
        store.on('exception', function(dp, type, action, options, response) {
        });
    }
    else {
        // update existing store / connection
        // seems to insist on using the urls defined in api so we'll keep it happy by setting them
        store.proxy.setUrl(url, true);
        store.proxy.setApi({
            read: url,
            create: url,
            update: url,
            destroy: url
        });
        
        store.setBaseParam(baseParams); // use our neat override
        store.setDefaultSort(sortField, sortDirection); // reconfigures store.sortInfo
    }

    return store;
}

// create a paging bar
function extJsPagingBar_createPagingBar(pagingBar, pagingBarId, pagingHtmlElement, store, gridContentType) {

    var displayMsg = '{2} ' + gridContentType + 's';
    
    // create new paging toolbar if necessary
    if (pagingBar === null) {
        // create a new paging toolbar
        pagingBar = new Ext.PagingToolbar({
            id: pagingBarId,
            pageSize: g_gridPageSize,
            store: store,
            displayInfo: true,
            displayMsg: displayMsg,
            emptyMsg: '',
            height: 10,
            renderTo: pagingHtmlElement // don't have to call render() if we set this
        });
    }
    else {
        // update existing paging toolbar
        pagingBar.displayMsg = displayMsg;
    }

    // have to bind even when creating or pagingBar.onLoad
    // doesn't get called when store loads data the first time
    pagingBar.bind(store);

    return pagingBar;
}

// hook up store event handlers
function extJsStore_hookUpStoreEventHandlers(store) {

    // hook up error handlers
    store.on('requestexception', extJs_ajaxRequestFailed);
    store.on('loadexception', extJs_ajaxLoadFailed);
}

// hook up grid event handlers
function extJsGrid_hookUpStoreEventHandlers(gridPanel, store) {

    // hook up error handlers
    store.on('requestexception', gridPanel.hideLoadMask.createDelegate(gridPanel));
    store.on('loadexception', gridPanel.hideLoadMask.createDelegate(gridPanel));

    // see http://extjs.com/forum/showthread.php?t=583
    // and http://extjs.com/forum/showthread.php?t=329
    // for more info on creating delegates
    store.on('beforeload', gridPanel.onBeforeLoad.createDelegate(gridPanel));
    store.on('load', gridPanel.onLoad.createDelegate(gridPanel));
    store.on('metachange', gridPanel.onMetaChange.createDelegate(gridPanel));
}

// load the store data
function extJsStore_loadData(store) {
    
    // initiate the process. defer to give the loadMask time to show
    store.load.defer(100, store, [{ params: { start: 0, limit: g_gridPageSize}}]);
}