/**
 * File:     pagination.js
 * Updated:  2008-10-01
 * Author:   jrudokas
 * Desc:     Pagination functionality currently used by events and invitations.
 */

var paginationCtrl = {

objects: null,

/**
 * renders product divs and paging controls
 */
separatorSpacing: 3,
renderPagination:
function() {
    var html = '';
    var numPages = 0;
    for (var i = 0; i < this.objects.length; i++) {
        if (i % this.perPageVal == 0) {
            var display;
            if (i > 0) {

                if (this.renderPaginationFooter) {
                    html += this.renderPaginationFooter();
                }

                html += '</div>';
                display = 'none';
            }
            else {
                display = 'block';
            }

            html += '<div id="productPage' + ((Math.floor(i/this.perPageVal)) + 1) + '" style="display:' + display + '">';

            if (this.renderPaginationHeader) {
                html += this.renderPaginationHeader();
            }

            numPages++;
        }

        if (this.renderPaginationSeparator && i % this.separatorSpacing == 0 && i % this.perPageVal != 0) {
            html += this.renderPaginationSeparator();
        }

        if (this.renderPaginationRow) {
            html += this.renderPaginationRow(this.objects[i]);
        }

    }

    if (this.renderPaginationSeparator) {
        html += this.renderPaginationSeparator();
    }

    html += '</div>';

    if($('paginationArea')) $('paginationArea').update(html);

    //render paging controls
    html = '';
    for (var i = 1; i <= numPages; i++) {
        html += '<a href="#" onclick="self.scrollTo(0, 0);paginationCtrl.pageCallback(' + i + ', ' + numPages + '); return false;"' + ' class="pageLink' + i + (i == 1 ? ' selected' : '') + '">' + i + '</a>';
    }

    $$('.pageListSpan').each(function(obj) {obj.update(html)});
},

/**
 * sets paging control selection states and product div visibility
 */
pageCallback:
function (pageNum, numPages) {
    for (var i = 1; i <= numPages; i++) {
        if (i == pageNum) {
            $$('.pageLink' + i).each(function(obj) {obj.addClassName('selected')});
            $('productPage' + i).show();
        }
        else {
            $$('.pageLink' + i).each(function(obj) {obj.removeClassName('selected')});
            $('productPage' + i).hide();
        }
    }
},

/**
 * Current sort index.
 * ipapas: added to make sort state accessible
 */
sortByIndex: 0,

/**
 * renders sort-by controls
 */
renderSortBy:
function (index) {
	this.sortByIndex = index;
    var sortByLabels = [
        '卖的最好',
        '价格从高到低',
        '价格从低到高'
    ];

    var html = '';
    for (var i = 0; i < sortByLabels.length; i++) {
        if (i > 0)
            html+= ' ';

        if (i == this.sortByIndex)
            html += '<span>' + sortByLabels[i] + '</span>';
        else
            html += '<a href="#" onclick="paginationCtrl.sortByCallback(' + i + '); return false;">' + sortByLabels[i] + '</a>';
    }
    $('sortBySpan').update(html);
    this.doSort();
},

doSort:
function() {
    switch (this.sortByIndex) {
        case 0:
            this.objects.sort(function(a, b) { return a.sortOrder - b.sortOrder; });
        break;
        case 1:
            this.objects.sort(function(a, b) {
                if(b.salePriceMax == a.salePriceMax) {
                    return a.sortOrder - b.sortOrder;
                } else {
                    return b.salePriceMax - a.salePriceMax;
                }
            });
        break;
        case 2:
            this.objects.sort(function(a, b) {
                if(b.salePriceMin == a.salePriceMin) {
                    return a.sortOrder - b.sortOrder;
                } else {
                    return a.salePriceMin - b.salePriceMin;
                }
            });
        break;
    }
},

/**
 * re-renders sort-by controls, sorts products, then re-renders products and paging controls
 */
sortByCallback:
function (selIndex) {
    this.renderSortBy(selIndex);
    this.renderPagination();
    createCookie('psort', selIndex);
},

perPageVal: 24,
perPageIndex: 0,
/**
 * renders per-page controls
 */
renderPerPage:
function (selIndex) {
    var perPageLabels = [
        '24 per page',
        '48 per page',
        'All'
    ];

    var html = '';
    for (var i = 0; i < perPageLabels.length; i++) {
        if (i > 0)
            html+= ' ';

        if (i == selIndex) {
            html += '<span>' + perPageLabels[i] + '</span>';
        }
        else {
            html += '<a href="#" onclick="paginationCtrl.perPageCallback(' + i + '); return false;">' + perPageLabels[i] + '</a>';
        }
    }
    $('perPageSpan').update(html);
    this.setPerPageFromIndex(selIndex);
    createCookie('ppg', selIndex);
},

/**
 * re-renders per-page controls, updates per-page state, then re-renders products and paging controls
 */
perPageCallback:
function (selIndex) {	
    this.renderPerPage(selIndex);
    this.renderPagination();
},

setPerPageFromIndex:
function (index) {
	this.perPageIndex = index;
	switch (this.perPageIndex) {
        case 0:
            this.perPageVal = 24;
        break;
        case 1:
            this.perPageVal = 48;
        break;
        case 2:
            this.perPageVal = Number.MAX_VALUE;
        break;
    }
},

/**
 * callback for column-sorting functionality
 */
paginationSortBy:
function (control, objects, field, sort) {

    var innerHTML = control.innerHTML;
    //used for comparisons at end of function
    var innerHTMLBase;

    //TODO: use prototype syntax
    if(innerHTML.slice(-1) == '\u25B2') {
        innerHTMLBase = innerHTML = innerHTML.substring(0, innerHTML.length - 1);
        innerHTML = innerHTML + '\u25BC';
        dir = 'desc';
    }
    else if(innerHTML.slice(-1) == '\u25BC') {
        innerHTMLBase = innerHTML = innerHTML.substring(0, innerHTML.length - 1);
        innerHTML = innerHTML + '\u25B2';
        dir = 'asc';
    }
    else {
        innerHTMLBase = innerHTML;

        if(sort=="date") {
            innerHTML = innerHTML + '\u25BC';
            dir = 'desc'
        }else {
            innerHTML = innerHTML + '\u25B2';
            dir = 'asc';
        }
    }

    var sortFunc = null;

    switch(sort) {
        case 'case-insensitive':
            sortFunc = function(a, b) {
                if (dir == 'desc') {
                    var tmp = a;
                    a = b;
                    b = tmp;
                }
				
				if(a[field] == null) {
					if(b[field] == null) {
						return 0;
					} else  {
						return -1;
					}
				} else if(b[field] == null) {
					return 1;
				}
				
                var aField = a[field].toLowerCase();
                var bField = b[field].toLowerCase();
				
                if (aField < bField)
                    return -1;
                else if (aField > bField)
                    return 1;
                else if (a[field] < b[field])
                    return -1;
                else if (a[field] > b[field])
                    return 1;
                else
                    return 0;
            };
        break;
        case 'date':
            sortFunc = function(a, b) {
                if (dir == 'desc') {
                    var tmp = a;
                    a = b;
                    b = tmp;
                }
                var aField = Date.parse(a[field]);
                var bField = Date.parse(b[field]);
                if (aField < bField)
                    return -1;
                else if (aField > bField)
                    return 1;
                else
                    return 0;
            };
        break;
        case 'numeric':
            sortFunc = function(a, b) {
                if (dir == 'desc') {
                    var tmp = a;
                    a = b;
                    b = tmp;
                }
				
				if(a[field] == null) {
					if(b[field] == null) {
						return 0;
					} else  {
						return -1;
					}
				} else if(b[field] == null) {
					return 1;
				}
				
				
                var aField = parseFloat(a[field]);
                var bField = parseFloat(b[field]);
                if (aField < bField)
                    return -1;
                else if (aField > bField)
                    return 1;
                else
                    return 0;
            };
        break;
        default: //ascii
            sortFunc = function(a, b) {
                if (dir == 'desc') {
                    var tmp = a;
                    a = b;
                    b = tmp;
                }
                if (a[field] < b[field])
                    return -1;
                else if (a[field] > b[field])
                    return 1;
                else
                    return 0;
            };
    }

    this.objects.sort(sortFunc);
    this.renderPagination();

    var elems = document.getElementsByClassName('paginationLink');
    for (var i = 0; i < elems.length; i++) {
        if (elems[i].innerHTML == innerHTMLBase)
        elems[i].innerHTML = innerHTML;
    }

}

} //end of object
