var topLevelCats = new Array();
var catArray = new Array();
var itemsArray = new Array();
var aisleCat = new Array();

var aisleLock = new Object();

// SEEMEv -- TBD the no of items for display in standard mode (i.e. at least 3 top categories)
var maxItemsPerGridPage = 12;
var maxItemsPerListPage = 12;

var maxCachePage = 72;

// SEEMEv -- probably we should consider the seller/site and data/communication incapsulated into an object or smth
// with the UI functions calling methods and stuff ... but later ...
// for now - using global variables initialized via the init_currentcontext function from the main flow
var currentcontext = {
  'seller': null,
  'gid': null,
  'siteid': 1,
  'view': 'list'
};

// item types
var itemtypes = {
  'chinese': 1,
  'dutch': 2,
  'store': 7
};

// safe extract value for DOM-response 
function extractValueByTagName(node, tag_name, default_value) {
    var value;  
    try {
        value = node.getElementsByTagName(tag_name)[0].firstChild.nodeValue;
    } catch (err) {
        value = default_value;
    }
    return value;
}

// parse category DOM
function parseCatsDOM(cats) {
    var cnt = 0;
    var categories = new Array();
    
    for (var i=0; i<cats.length; i++) {
        if (extractValueByTagName(cats[i], 'Id', 0) != 0) {
            catObj = buildCategoryObject(cats[i]);

            categories[cnt] = catObj;
            cnt++;
        }
    }
    return categories;
}

// initialize category node-data
function buildCategoryObject(cat) {
    var catObj = new Object();

    catObj.Id    = extractValueByTagName(cat, 'Id', 0);
    catObj.Nam   = extractValueByTagName(cat, 'Nam', '');
    catObj.PId   = extractValueByTagName(cat, 'PId', 0);
    catObj.ItCnt = extractValueByTagName(cat, 'ItCnt', 0);
    
    return catObj;
}

// initialize item node-data
function buildItemObject(item) {
    var itemObj = new Object();

    itemObj.Bids = extractValueByTagName(item, 'Bids', 0);
    itemObj.Tit  = extractValueByTagName(item, 'Tit', '');
    itemObj.Typ  = extractValueByTagName(item, 'Typ', 0);
    itemObj.SId  = extractValueByTagName(item, 'SId', 1);
    itemObj.Img  = decode_image_url(extractValueByTagName(item,'Img', 0));
    itemObj.Cats = extractValueByTagName(item, 'Cats', 0);
    itemObj.Clo  = extractValueByTagName(item, 'Clo', null);
    itemObj.Cloux = get_uts_date(itemObj.Clo);
    itemObj.IId  = extractValueByTagName(item, 'IId', 0);
    itemObj.Pri  = locale_number_format(currentcontext.siteid, extractValueByTagName(item, 'Pri', 0));
    itemObj.Bin  = price_format(currentcontext.siteid, extractValueByTagName(item, 'Bin', 0));
    itemObj.Qty  = extractValueByTagName(item, 'Qty', 1);
    itemObj.Cur  = price_currency(currentcontext.siteid, extractValueByTagName(item, 'Cur', null));

    return itemObj;
}

// parse items DOM
function parseItemsDOM(aisleId, items) {
    for (var i = 0; i<items.length; i++) {
        itemObj = buildItemObject(items[i]);
        itemsArray[itemObj.IId] = itemObj;
        aisleCat[aisleId].items.push(itemObj.IId);
    }

    // no more items here 
    if (items.length < maxCachePage)
    {
        aisleCat[aisleId].done = 1;
    }
}


// sort categs - first by ItCnt and, if equal, by Nam
function sortCategories(a, b) {
    var xcmp = sortCategoriesByItCnt(a, b);
    if (xcmp == 0) { xcmp = sortCategoriesByNam(a, b); };
    return xcmp;
}

// category cnt sort 
function sortCategoriesByItCnt(a, b) {
    return b.ItCnt - a.ItCnt;
}

// category name sort
function sortCategoriesByNam(a, b) {
    return (a.Nam < b.Nam) ? -1 : ((a.Nam > b.Nam) ? 1 : 0);
}

// initialize current context (seller, site, etc)
function init_currentcontext(ctx)
{
    if (typeof(ctx) != "object") return;
    for (var p in ctx) 
    {
        currentcontext[p] = ctx[p];
    }
}

// main display trigger
function getCats() {

    var url='/galleryapi/' + currentcontext.seller + '/request.cgi?gid=' + currentcontext.gid + '&SId=' + currentcontext.siteid + '&m1=GetCats';

    new ajax (url, {method: 'get', onComplete: requestDone});
    

    function requestDone (req) {
        catArray = parseCatsDOM(req.responseXML.getElementsByTagName('Cat'));
        if (catArray.length < 1) {
            span = document.createElement('span');
            span.innerHTML = 'There are no items available';
            span = document.getElementById('main').appendChild(span);
        }
        //create categoryMenu ul
        menuList = document.createElement('ul');
        menuList = document.getElementById('categoryMenu').appendChild(menuList);
        
        catArray.sort(sortCategories);

        // in case of few top categories increase the no of items per page        
        // SEEMEv -- TBD the no of items for display
        if (catArray.length <= 2) {
            maxItemsPerGridPage = 24;
            maxItemsPerListPage = 24;
        }
        for(var i=0; i<catArray.length; i++) {

            initialize_aisle_data(catArray[i].Id);
            
            topLevelCats.push(catArray[i].Id);
            display_cat(i);

            /*** LOAD ITEMS ***/
            load_items(catArray[i].Id, aisleCat[catArray[i].Id].cat);

        }
    }
                                
}

// gen aisle unlock handler
function aisleUnlockHandler(idx)
{
  return function() { aisleLock[idx] = 0; };
}

// 
function myVoid(e) 
{
    clearBubble();
    
    if (e.parentNode.id) 
    {
        cat = e.parentNode.id;
        li = e.parentNode;
    } 
    else 
    {
        cat = e.parentNode.parentNode.parentNode.id.substring(5);
        li = document.getElementById(cat);
    }
  
    if (aisleLock[cat]) return;
    aisleLock[cat] = 1;

    if (li.className == 'menuDisabled') 
    {
        li.className = '';
    } 
    else 
    {
        li.className = 'menuDisabled'; 
    }
    fxHeight(cat);
}


// initialize the aisle data - clear/set default data 
// set display mode as on
function initialize_aisle_data(aisleId)
{
    aisleCat[aisleId] = { display: 1 };

    reset_aisle_data(aisleId, aisleId);
}

// reset aisle data - identified by the aisleId (top category) and 
// the current category (child of the aisleId)
function reset_aisle_data(aisleId, cat)
{
    aisleCat[aisleId].firstIndex = 0;
    aisleCat[aisleId].cat = cat;
    aisleCat[aisleId].page = 0;
    aisleCat[aisleId].lastRequestedPage = 0;
    aisleCat[aisleId].done = 0;
    aisleCat[aisleId].ItCnt = 0;
    aisleCat[aisleId].items = new Array();
}


// display category in left nav
function display_cat (key) {
    cat_id = catArray[key].Id;
                
                
    /*** MAIN DISPLAY ***/

    // TBD - is this required ? - on opera this conflicts with the main div element
    //create anchor link
    /*
    a = document.createElement('a');
    a.setAttribute('name', 'aisle' + cat_id);
    a = document.getElementById('main').appendChild(a);
    */

    //create containing div
    catDiv = document.createElement('div');
    catDiv.setAttribute('id', 'aisle' + cat_id);
    catDiv.className = 'aisle clearfix';
    catDiv = document.getElementById('main').appendChild(catDiv);

    //create category ul
    ul = document.createElement('ul');
    ul.className = 'nav clearfix';
    ul = catDiv.appendChild(ul);

    /*** CATEGORY MENU ***/
    //create li
    menuList = document.getElementById('categoryMenu').getElementsByTagName('ul')[0];
    li = document.createElement('li');
    li.setAttribute('id', cat_id);
    li = menuList.appendChild(li);

    // initialize lock-mutex 
    aisleLock[cat_id] = 0;

    //create void div
    div = document.createElement('div');
    div.className = 'voidIcon';
    div.onclick = function() { return myVoid(this) };
    div = li.appendChild(div);
               
    //create span 
    span = document.createElement('span');
    span.onclick = function() { return fxScroll(this.parentNode.id) };
    span.innerHTML = catArray[key].Nam.substring(0, catArray[key].Nam.length -2); 
    span = li.appendChild(span);

    //create count
    cite = document.createElement('cite');
    cite.innerHTML = '(' + catArray[key].ItCnt + ')';
    cite = li.appendChild(cite);

}


// extract the top categories from a list of categories (parent id 0)
// ignore the root category
function getTopCategories (categories) {
    var topCategories = new Array();
    if (categories.length >0) {
    
        for (var c=0; c<categories.length; c++) {
            if ((categories[c].PId == 0) && (categories[c].Id != 0)) {
                topCategories.push(categories[c]);
            }
        }
    }
    return topCategories;
}


// load items from cache server (async)
// in case of first request trigger also the display process
function load_items(aisleId, cat) {

    if (aisleCat[aisleId].display == 1) 
    {
        reset_aisle_data(aisleId, cat);
    }
    
    var url='/galleryapi/' + currentcontext.seller + '/request.cgi?gid=' + currentcontext.gid + '&SId=' + currentcontext.siteid + '&CId=' + aisleCat[aisleId].cat + '&m1=GetCats&Cus=0&Mod=subtree&m2=GetItems&Rul=vc&Pg=' + aisleCat[aisleId].page;

    if ((aisleCat[aisleId].lastRequestedPage == aisleCat[aisleId].page) && (aisleCat[aisleId].page != 0))
        return;
    else 
        aisleCat[aisleId].lastRequestedPage = aisleCat[aisleId].page;
    
    new ajax (url, {method: 'get', onComplete: itemsDone});

    function itemsDone(req) {
        catId = extractValueByTagName(req.responseXML, 'CId', 0);
        items = req.responseXML.getElementsByTagName('It');

        //determine aisle
        cats = parseCatsDOM(req.responseXML.getElementsByTagName('Cat'));
        var topCategories = getTopCategories(cats);
        
        if (topCategories.length > 0) {
            aisleId = topCategories[0].Id;
        }
        aisleCat[aisleId].page = aisleCat[aisleId].page + 1;
        
        parseItemsDOM(aisleId, items);        
        if (aisleCat[aisleId].display == 1) {
            nav = document.getElementById('aisle' + aisleId).getElementsByTagName('ul')[0];
            generate_category_tree(cats, nav, cat);  
            // determine ItCnt of the current category
            for (var c = 0; c < cats.length ; c++) {
                if (cats[c].Id == catId) {
                    aisleCat[aisleId].ItCnt = cats[c].ItCnt;
                }
            }
            if (currentcontext.view == 'grid') {
                render_grid(aisleId, aisleCat[aisleId].firstIndex);
            } else {
                render_list(aisleId, aisleCat[aisleId].firstIndex);
            }
        } else {
            if (document.getElementById('next' + aisleId).className == 'paginationRight disabled') {
                document.getElementById('next' + aisleId).className = 'paginationRight';
                document.getElementById('next' + aisleId).onclick = function() {return nextPage(this, currentcontext.view);};
            }
        }
        aisleCat[aisleId].display = 0;
    }
    
}

// clear aisle (delete DOM elements)
function clear_aisle(aisleId) {
    aisle = document.getElementById('aisle' + aisleId);
    if (aisle.getElementsByTagName('table')[0]) {
        aisle.removeChild(aisle.getElementsByTagName('table')[0]);
    } else if (aisle.getElementsByTagName('ul')[1]) {
        aisle.removeChild(aisle.getElementsByTagName('ul')[1]);
    }
    if (aisle.getElementsByTagName('div')[1]) {
        aisle.removeChild(aisle.getElementsByTagName('div')[1]);
    }
}


// render aisle data -- list mode
function render_list(aisleId, firstIndex) {
    
    clear_aisle(aisleId);
    aisleObj = aisleCat[aisleId];
    aisleObj.firstIndex = firstIndex;
    
    //create table
    table = document.createElement('table');
    table = document.getElementById('aisle' + aisleId).appendChild(table);

    tbody = document.createElement('tbody');
    tbody = table.appendChild(tbody);

    tr = document.createElement('tr');
    tr = tbody.appendChild(tr);

    //create column headers
    columnHeaders = new Array('Image', 'Title', 'Current Bid', 'Buy It Now', 'Bids', 'Ending');
    for (i=0; i<columnHeaders.length; i++) {
        th = document.createElement('th');
        th.innerHTML = columnHeaders[i];
        th = tr.appendChild(th);
    }
    
    //fill table
    for (j = firstIndex; j < firstIndex + maxItemsPerListPage; j++) {
    var itemObj = itemsArray[aisleCat[aisleId].items[j]];
    if (itemObj) {
        var type = itemObj.Typ;
        var bin = itemObj.Bin;
        var bids = itemObj.Bids;
        var price = itemObj.Pri;
        var currency = itemObj.Cur;
        var Nowux = get_uts_date();
        var remaining = computeTimeDifference(itemObj.Cloux, Nowux);

        var ebayId = itemObj.IId;
        
        //row
        tr = document.createElement('tr');
        tr = tbody.appendChild(tr);

        //image cell
        td = document.createElement('td');
        td.className = 'tableImg';
        td.innerHTML = '<a href="#" onclick="window.open(\'' + affiliatize_ebay(itemObj) + '\'); return false;"><img src="' + itemObj.Img + '" /></a>';
        td = tr.appendChild(td);

        //title cell
        td = document.createElement('td');
        td.className = 'title';
        td.innerHTML = '<a href="#" onclick="window.open(\'' + affiliatize_ebay(itemObj) + '\'); return false;">' + itemObj.Tit + '</a>';
        td = tr.appendChild(td);

        //current bid cell
        td = document.createElement('td');
        if (type == itemtypes.chinese || type == itemtypes.dutch) {
            td.innerHTML = currency + price;
        } else {
            td.innerHTML = '--';
        }
        td = tr.appendChild(td);

        //bin cell
        td = document.createElement('td');
        if (type == itemtypes.chinese || type == itemtypes.dutch) {
            if ((bin != null) && (bids <= 0)) {
                td.innerHTML = bin;
            } else {
                td.innerHTML = '--';
            }
        } else {
            td.innerHTML = currency + price;
        }
        td = tr.appendChild(td);

        //bids cell
        td = document.createElement('td');
        if (type == itemtypes.chinese || type == itemtypes.dutch) {
            td.innerHTML = bids;
        } else {
            td.innerHTML = '--';
        }
        td = tr.appendChild(td);

        //ending cell
        td = document.createElement('td');
        td.innerHTML = remaining;

        td = tr.appendChild(td);
    }
    }

    //create pagination
    pagdiv = document.createElement('div');
    pagdiv.className = 'pagination';
    pagdiv = document.getElementById('aisle' + aisleId).appendChild(pagdiv);

    div = document.createElement('div');
    div.setAttribute('id', 'next' + aisleId);
    if (firstIndex + maxItemsPerListPage < aisleObj.items.length) {
        div.className = 'paginationRight';
        div.onclick = function() {return nextPage(this, 'list');};
    } else {
        div.className = 'paginationRight disabled';
    }
    div = pagdiv.appendChild(div);

    div = document.createElement('div');
    if (firstIndex == 0) {
        div.className = 'paginationLeft disabled';
    } else {
        div.className = 'paginationLeft';
        div.onclick = function() {return prevPage(this, 'list');};
    }
    div = pagdiv.appendChild(div);
    
    span = document.createElement('span');
    pag = Math.floor(firstIndex/maxItemsPerListPage) + 1;
    span.innerHTML = 'Page ' + pag;
    span = pagdiv.appendChild(span);

    if (document.getElementById('aisle' + aisleId).offsetHeight > 0) document.getElementById('aisle' + aisleId).style.height = 'auto';

}

// render aisle data -- grid mode
function render_grid(aisleId, firstIndex) {
    
    clear_aisle(aisleId);
    aisleObj = aisleCat[aisleId];
    aisleObj.firstIndex = firstIndex;
    
    //create grid ul
    ul = document.createElement('ul');
    ul.className = 'grid clearfix';
    grid = document.getElementById('aisle' + aisleId).appendChild(ul);
            
    //fill grid
    for (j = firstIndex; j < firstIndex+maxItemsPerGridPage; j++) {
        if (itemsArray[aisleCat[aisleId].items[j]]) {
            //create li
            img = itemsArray[aisleCat[aisleId].items[j]].Img;
                    
            li = document.createElement('li');
            li.style.backgroundImage = "url(" + img + ")";
            li.onmouseover = function(event) { return gridHover(this, event) };
            li.onmouseout = function(event) { return gridHover(this, event) };
            li.onclick = function() { return gridClick(this) };
            li= grid.appendChild(li);
        }
    }


    //create pagination
    pagdiv = document.createElement('div');
    pagdiv.className = 'pagination';
    pagdiv = document.getElementById('aisle' + aisleId).appendChild(pagdiv);

    div = document.createElement('div');
    div.setAttribute('id', 'next' + aisleId);
    if (firstIndex+maxItemsPerGridPage < aisleObj.items.length) {
        div.className = 'paginationRight';
        div.onclick = function() {return nextPage(this, 'grid');};
    } else {
        div.className = 'paginationRight disabled';
    }
    div = pagdiv.appendChild(div);

    div = document.createElement('div');
    if (firstIndex == 0) {
        div.className = 'paginationLeft disabled';
    } else {
        div.className = 'paginationLeft';
        div.onclick = function() {return prevPage(this, 'grid');};
    }
    div = pagdiv.appendChild(div);

    span = document.createElement('span');
    var  pag = Math.floor(firstIndex / maxItemsPerGridPage) + 1;
    span.innerHTML = 'Page ' + pag;
    span = pagdiv.appendChild(span);

    if (document.getElementById('aisle' + aisleId).offsetHeight > 0) document.getElementById('aisle' + aisleId).style.height = 'auto';
}

// generate category browsing tree (aislee top)
function generate_category_tree(cats, nav, cat) {
    
    for(i=0; i<cats.length; i++) {
        if (cats[i].PId == 0) {
            var top = i;
        }
    }
    
    //clear category nav
    while(nav.firstChild) {
        nav.removeChild(nav.firstChild);
    }
    
    //void icon
    li = document.createElement('li');
    li.className = 'voidLi';
    li = nav.appendChild(li);
    
    div = document.createElement('div');
    div.className= 'voidIcon';
    div.onclick = function() { return myVoid(this) };
    div = li.appendChild(div);
    
    //generate backward links    
    for(i=top; i>0; i--) {
        li = document.createElement('li');
        li.innerHTML = '<span onclick="clearBubble();aisleCat['+cats[top].Id +'].display = 1;load_items(' + cats[top].Id + ', ' + cats[i].Id + ');">' + cats[i].Nam + '</span> <b>&gt;</b>';
        li = nav.appendChild(li);
    }

    //generate current category
    li = document.createElement('li');
    if (top + 1 == cats.length) {
        li.innerHTML = '<b>' + cats[0].Nam + '</b>';
    } else {
        li.innerHTML = '<b>' + cats[0].Nam + ' &gt;</b>';
    }
    li = nav.appendChild(li);
    
    //generate select menu
    if (top + 1 < cats.length) {
        //create containing li
        li = document.createElement('li');
        li = nav.appendChild(li);
        
        //create select menu
        select = document.createElement('select');
        select.onchange = function() {clearBubble(); var aisleId = this.parentNode.parentNode.parentNode.id.substring(5); aisleCat[aisleId].display = 1 ;return load_items(aisleId, this.parentNode.getElementsByTagName('select')[0].options[this.selectedIndex].value); };
        
        select = li.appendChild(select);
        
        //create options
        option = document.createElement('option');
        option.innerHTML = 'Select Category...';
        option = select.appendChild(option);
        for(i=top + 1; i<cats.length; i++) {
            option = document.createElement('option');
            option.setAttribute('value', cats[i].Id);
            option.innerHTML = cats[i].Nam;
            option = select.appendChild(option);
        }
    } 
}

// determine the index of the current pointed element
function get_index(element) {
    for(i=0; i<element.parentNode.childNodes.length; i++) {
        if (element == element.parentNode.childNodes[i]) {
            var aisleId = element.parentNode.parentNode.id.substring(5); 
            return (aisleCat[aisleId].firstIndex + i);
        }
    }
}

// handle grid event (mouseover and mouseout)
function gridHover(element, event) {
    if (!event) var event = window.event;
    var index = get_index(element);
   
    var aisleId = element.parentNode.parentNode.id.substring(5);
    var itemObj = itemsArray[aisleCat[aisleId].items[index]];
    if (typeof(itemObj) == "undefined") return;


    var myBubble = document.getElementById('bubble');
    var myBubbleSlug = document.getElementById('bubbleSlug');

    if (event.type == 'mouseover') {
        
        //render bubble information
        myBubble.getElementsByTagName('div')[0].innerHTML = itemObj.Tit;
    
        type = itemObj.Typ;
        currency = itemObj.Cur;
        if (type == itemtypes.chinese || type == itemtypes.dutch) { //auction
            document.getElementById('bubbleCurrent').innerHTML = 'Current Bid: <b>' + currency + itemObj.Pri + '</b>';
            document.getElementById('bubbleBids').innerHTML = 'Bids: <b>' + itemObj.Bids + '</b>';
            document.getElementById('bubbleBIN').innerHTML = ((itemObj.Bin != null) && (itemObj.Bids <= 0)) ? 
                   'Buy It Now: <b>' + currency + itemObj.Bin + '</b>' : "<br>";
        } else {
            document.getElementById('bubbleBIN').innerHTML = 'Buy It Now: <b>' + currency + itemObj.Pri + '</b>';
            document.getElementById('bubbleBids').innerHTML = '';
            document.getElementById('bubbleCurrent').innerHTML = '';
        }
        
        var Nowux = get_uts_date();
        document.getElementById('bubbleEnds').innerHTML = 'Ending: <b>' + computeTimeDifference(itemObj.Cloux, Nowux) + '</b>';

        //position bubble
        containerTop = element.parentNode.parentNode.offsetTop;
        var content = document.getElementById('content');    
        fullTopOffset = containerTop + element.offsetTop - document.getElementById('content').scrollTop + 25 + 'px';
        myBubble.style.top = fullTopOffset;
        myBubbleSlug.style.top = fullTopOffset;
    if (content.offsetWidth - element.offsetLeft > 600) {
            myBubble.style.left = element.offsetLeft + 311 + 'px';
            myBubbleSlug.style.left = element.offsetLeft + 333 + 'px';
            myBubble.className = 'bubbleRight';
        } else {
            myBubble.style.left = element.offsetLeft - 57 + 'px';
            myBubbleSlug.style.left = element.offsetLeft - 35 + 'px';
            myBubble.className = 'bubbleLeft';
        }
        myBubble.style.display = 'block';
        myBubbleSlug.style.display = 'block';
    } else if (event.type == 'mouseout') {
        var reltg = (event.relatedTarget) ? event.relatedTarget : event.toElement;
        if (reltg) {
            if (reltg.id == 'bubble') return;
            clearBubble();
        }
    }
}


function clearBubble() {
    var myBubble = document.getElementById('bubble');
    var myBubbleSlug = document.getElementById('bubbleSlug');

    myBubble.style.display = 'none';
    myBubbleSlug.style.display = 'none';
}


// prev page 
function prevPage(element, type) {
    var aisleId = element.parentNode.parentNode.id.substring(5);
    
    clearBubble();

    if (type == 'grid') {
       render_grid(aisleId, aisleCat[aisleId].firstIndex - maxItemsPerGridPage);
    } else {
       render_list(aisleId, aisleCat[aisleId].firstIndex - maxItemsPerListPage);
    }
}

// next page
function nextPage(element, type) {
    var aisleId = element.parentNode.parentNode.id.substring(5);
    var maxItemsPerPage;

    clearBubble();

    if (type == 'grid') {
        maxItemsPerPage = maxItemsPerGridPage;
        render_grid(aisleId, aisleCat[aisleId].firstIndex + maxItemsPerGridPage);
    } else {   
        maxItemsPerPage = maxItemsPerListPage;
        render_list(aisleId, aisleCat[aisleId].firstIndex + maxItemsPerListPage);
    }
    if (!aisleCat[aisleId].done && (aisleCat[aisleId].items.length - aisleCat[aisleId].firstIndex <= 2 * maxItemsPerPage)) {
        load_items(aisleId, aisleCat[aisleId].cat);
    }    
}

// handle grid click (open new window targeting to the item)
function gridClick(element) {
    var index = get_index(element);
    var aisleId = element.parentNode.parentNode.id.substring(5);
    
    var itemObj = itemsArray[aisleCat[aisleId].items[index]];
    window.open(affiliatize_ebay(itemObj));

}

// change view mode
function changeView(choice) {
    clearBubble();
    currentcontext.view = choice;
    gridButton = document.getElementById('view_grid');
    listButton = document.getElementById('view_list');
   
    if (currentcontext.view == 'grid') {
        for (x=0; x<topLevelCats.length; x++) {
            aisleCat[topLevelCats[x]].firstIndex = Math.floor(aisleCat[topLevelCats[x]].firstIndex/maxItemsPerGridPage) * maxItemsPerGridPage;
            render_grid(topLevelCats[x], aisleCat[topLevelCats[x]].firstIndex); 
        }
    gridButton.className = '';
    listButton.className = 'disabled';
    } else {
        for (x=0; x<topLevelCats.length; x++) {
            aisleCat[topLevelCats[x]].firstIndex = Math.floor(aisleCat[topLevelCats[x]].firstIndex/maxItemsPerListPage) * maxItemsPerListPage;
            render_list(topLevelCats[x], aisleCat[topLevelCats[x]].firstIndex); 
        }
    gridButton.className = 'disabled';
    listButton.className = '';
    }
}

// build affiliate context
function get_affiliate_context(ebayObj)
{
    var ctx = 0;
    if (ebayObj.Typ == itemtypes.store) { ctx |= 1; }; // store item

    return ctx;
}

// view item URL
function affiliatize_ebay(ebayObj) {
    var iid = ebayObj.IId;
    var sid = ebayObj.SId;
    var ctx = get_affiliate_context(ebayObj);

    var url = '/bin/viewitem.x/';
    if (can_affiliatize_items(_ts, _disable_eBay_aff_Tdelta)) {
      url = '/bin/viewitemaff.x/';
    }
    return url + iid + '/' + sid + '?source=gallery' + (typeof(gsrc) != 'undefined' ? '&vint=1' : '') + '&ctx=' + ctx;
}

function can_affiliatize_items(ts, delta)
{
  if (typeof(ts) == 'undefined' || !ts) {
    return 1;
  }
  if (typeof(delta) == 'undefined' || !delta) {
    return 0;
  }

  var now = Math.round(get_uts_date() / 1000);

  if (now < ts + delta) {
    return 0;
  }
  
  return 1;
}
