/// <reference path="jquery-1.6.4.min.js" />

function global() {

    $('#menu .ui-state-highlight').removeClass('ui-state-highlight').addClass('ui-state-default');
    $('#menu li a[href="' + _cp + '"]').parent('li').addClass('ui-state-highlight').removeClass('ui-state-default');
    $('#menu li.ui-corner-all')
		.mouseenter(function () {
		    $(this).addClass('ui-state-hover');
		})
		.mouseleave(function () {
		    $(this).removeClass("ui-state-hover");
		});

    $('button').button();
    $('#home :submit').button('option', 'icons', { primary: 'ui-icon-search' });
}

function search(p1, p2, c1, c2) {
    //price filter
    $('#more').click(function () {
        $(this).hide();
        $('#loading').show();

        $.post(document.location, { id: $(this).data('iid') }, function (r) {
            if (r && r.Items && r.Items.length > 0) {
                populateItems(r.Items);
                populateBrands(r.Brands);
                updateHL($('#price-range'), $('#price'), r.hp, r.lp);
                updateHL($('#change-range'), $('#change'), r.hc, r.lc);
                applyFilters();
                $('#more').data('iid', r.id).show();
                $('#loading').hide();
            }
            else {
                $('#loading').text('no more data is available.');

            }
        }).error(function () {
            $('#loading').text('no more data is available.');
        });
    });

    function updateHL($t, $lbl, h, l) {
        var max = $t.slider('option', 'max');
        var min = $t.slider('option', 'min');
        if (max < h) {
            max = h;
        }
        if (min > l) {
            min=l;
        }
        $t.slider('option', 'min', min);
        $t.slider('option', 'max', max);
        $lbl.val('$' + min + " to $" + max);
        $t.slider("value", $t.slider("value"));
    }

    function populateBrands(brands) {
        for (var b in brands) {
            var brand = brands[b];
            var bb = $(':checkbox[name="Brands"][value="' + brand.BrandID + '"]');
            if (bb && bb.length > 0) {
                var ttl = $(bb).next().next();
                ttl.text(parseInt(ttl.text()) + brand.ItemCount);
            } else {
                $('#filters').append('<div>'+
                    '<input type="checkbox" value="' + brand.BrandID + '" name="Brands">\n               ' +
                    brand.Brand1 +' (<span class="fc"></span>/<span class="ttl">' + brand.ItemCount +'</span>)'+
                    '</div>');
                };
        }
    };

    function populateItems(items) {
        var view = $('input[name="view"]:checked').val();
        var count = $('#result .p').length;
        for (var i in items) {
            var item = items[i];
            $('#more').before('<div class="p ' + view + '" data-brand="' + item.BrandID + '" data-change="' + item.Change + '" data-price="' + item.Price + '" data-rank="' + ++count + '">' +
                        '<a href="' + item.Slug + '/' + item.ASIN + '">' +
                            '<img src="' + item.Image + '" title="' + item.Title + ')" alt="' + escape(item.Title) + '">' +
                        '</a>' +
                        '<div class="wr">' +
                            '<div class="t">' +
                                '<a href="' + item.Slug + '/' + item.ASIN + '">' +
                                    item.Title + '</a>' +
                            '</div>' +
                            '<div class="cp">' +
                                item.ExtendedPrice +
                                ' <span class="' + (item.Change > 0 ? "pr" : item.Change < 0 ? "pg" : "" ) +'">(' + item.Change + '%)' +
                                '</span>' +
                            '</div>' +
                            '<br>' +
                            '<span class="pg">Low:&nbsp;' + item.LowExtended + '</span><span class="pr">High:&nbsp;' + item.HighExtended + '</span>' +
                            '<span class="asof">Updated ' + item.Ago + ' ago</span>' +
                        '</div>' +
                    '</div>');
        }
    };
    $('#price-range').slider({
        range: true,
        min: p1,
        max: p2,
        values: [p1, p2],
        slide: function (event, ui) {
            $("#price").val('$' + ui.values[0] + " to $" + ui.values[1]);
            setTimeout('applyFilters()', 100);
        },
        change: function (event, ui) {
            $("#price").val('$' + ui.values[0] + " to $" + ui.values[1]);
        }
    });

    $('#change-range').slider({
        range: true,
        min: c1,
        max: c2,
        values: [c1, c2],
        slide: function (event, ui) {
            $("#change").val(ui.values[0] + "% to " + ui.values[1] + '%');
            setTimeout('applyFilters()', 100);
        },
        change: function (event, ui) {
            $("#change").val(ui.values[0] + "% to " + ui.values[1] + '%');
        }
    });


    //brands filter
    $(':checkbox[name="Brands"]').change(function (e) {
        var val = $(this).val();
        if (val == -1) {
            $(':checkbox[name="Brands"]').prop('checked', false);

        }
        $(':checkbox[name="Brands"][value="-1"]').prop('checked', val == -1);

        if ($(':checkbox[name="Brands"]:checked').length == 0 || val == -1) {
            $(':checkbox[name="Brands"][value="-1"]').prop('checked', true);
        }
        else {
            $('#result .p').hide();
            $(':checkbox[name="Brands"]:checked').each(function (i, cb) {
            });
        }
        setTimeout('applyFilters()', 100);
    });

    //sorting
    $('#sort').change(function (e) {
        sort($(':checked', this).val());
    }).buttonset();

    //view
    $('#view').change(function (e) {
        if ($('input[name="view"]:checked').val() == 'list')
            $('#result .p').removeClass('grid').addClass('list');
        else
            $('#result .p').removeClass('list').addClass('grid');

    }).buttonset();
    $('#vl').button("option", "icons", { primary: 'p-icon-l' });
    $('#vg').button("option", "icons", { primary: 'p-icon-g' });

    function sort(opt) {
        $('#result .p:visible').sortElements(function (a, b) {
            var x = parseFloat($(a).data(opt));
            var y = parseFloat($(b).data(opt));
            return x > y ? 1 : -1;
        });
    }
}
function applyFilters() {
    var prices = $('#price-range').slider('values');
    var changes = $('#change-range').slider('values');
    var bvals = [];
    var tvals = [];
    $(':checkbox[name="Brands"]:checked').each(function (i, e) {
        bvals.push(parseInt($(e).val()));
    });
    $(':checkbox[name="Brands"]').each(function (i, e) {
        tvals['"' + $(e).val() + '"'] = 0;
    });

    $('#result .p').each(function (i, elm) {
        var o = $(elm);
        var change = parseFloat(o.data('change'));
        var price = parseFloat(o.data('price'));
        var brand = parseInt(o.data('brand'));

        if (change >= changes[0] && change <= changes[1] &&
                price >= prices[0] && price <= prices[1]) {
            if (bvals[0] == -1 || $.inArray(brand, bvals) != -1) {//!isNaN(tvals['"' + brand + '"'])
                $(this).show();
                tvals['"' + brand + '"']++;
                return this;
            }
        }

        $(this).hide();
        return this;
    });
    updateCount(tvals);

};


function updateCount(tvals) {
    $(':checkbox[name="Brands"]').each(function (i, elm) {
        $(elm).next('span.fc').text(tvals['"' + $(elm).val() + '"']);
    });
    var t = $('#result .p').length;
    if (t == 0) return;
    var ct = $('#result .p:visible').length;
    $('#result .ct').text('Showing ' + ct + ' of ' + t + ' result' + (ct == 1 ? '' : 's'));
}


/**
* jQuery.fn.sortElements
* --------------
* @param Function comparator:
*   Exactly the same behaviour as [1,2,3].sort(comparator)
*   
* @param Function getSortable
*   A function that should return the element that is
*   to be sorted. The comparator will run on the
*   current collection, but you may want the actual
*   resulting sort to occur on a parent or another
*   associated element.
*   
*   E.g. $('td').sortElements(comparator, function(){
*      return this.parentNode; 
*   })
*   
*   The <td>'s parent (<tr>) will be sorted instead
*   of the <td> itself.
*/
jQuery.fn.sortElements = (function () {

    var sort = [].sort;

    return function (comparator, getSortable) {

        getSortable = getSortable || function () { return this; };

        var placements = this.map(function () {

            var sortElement = getSortable.call(this),
                parentNode = sortElement.parentNode,

            // Since the element itself will change position, we have
            // to have some way of storing its original position in
            // the DOM. The easiest way is to have a 'flag' node:
                nextSibling = parentNode.insertBefore(
                    document.createTextNode(''),
                    sortElement.nextSibling
                );

            return function () {

                if (parentNode === this) {
                    throw new Error(
                        "You can't sort elements if any one is a descendant of another."
                    );
                }

                // Insert before flag:
                parentNode.insertBefore(this, nextSibling);
                // Remove flag:
                parentNode.removeChild(nextSibling);

            };

        });

        return sort.call(this, comparator).each(function (i) {
            placements[i].call(getSortable.call(this));
        });

    };

})();
