﻿/// <reference path="js/stringBuilder.js" />

function buildFilter()
{
    var data = {};
    $('#filters :checked').each(function()
    {
        var id = $(this).parents('li:first').children(':hidden').val();
        if (data[id])
            data[id].push(this.value);
        else
            data[id] = [this.value];
    });
    var json = new Json();
    json.startObj();
    for (var p in data)
    {
        json.arrayProp(p,data[p]);
    }
    json.endObj();
    return json.toString();
}

function highlightProduct()
{
    $(this).toggleClass('activeProd');
}

function prepareGrid()
{
    $('div.prod').hover(highlightProduct, highlightProduct);
    $('div.prodActions ul li:first-child').css('background-image', 'none');
}
var filterCache = {};
function filterClicked()
{
    filterCache = {};
    var clicked = this;
    $(this).parent().parent().find(':checked').each(function()
    {
    	if (this != clicked)
    	{
    		this.checked = false;
    		$(this).parent().removeClass('selected');
    	}
    });
    $(this).parent().toggleClass('selected', this.checked);
    filterCache[this.value] = true;
    page = 1;
    buildGrid();
}

function loadAllFilters()
{
    this.innerHTML = 'loading...';
    var sender = $(this);
    var filter = sender.parent();
    var filterID = filter.find(':hidden:first').val();
    var items = filter.find('div.items:first');

    var pageUrl = '/Compare-Prices/FilterValues/' + categoryID + '/' + filterID;
    var args = null;

    if (!categoryID) {
        pageUrl = '/Compare-Prices/SearchFilterValues/' + filterID;
        args = { query: searchQuery };
    }
    
    $.post(pageUrl, args,
        function(data) 
        {
            if (!categoryID && filterID == "category") {
                items.addClass('long').empty();
                for (var i = 0; i < data.length; ++i)
                    $('<p><a href="' + data[i].Href + '" title="' + data[i].Name + '">' + data[i].Name + '</a></p>').appendTo(items);
                sender.remove();
            }
            else {
                items.addClass('long').empty();
                for (var i = 0; i < data.length; ++i)
                    $('<p><input type="checkbox" value="' + data[i].ID + '"/> ' + data[i].Name + '</p>').appendTo(items);
                sender.remove();
                $('input', items).click(filterClicked).attr('checked', function() { return filterCache[this.value] ? true : false; });
            }
        }, 'json');
}

function buildGrid()
{
    //$('#progress').show();
    var grid = $('#prodGrid');
    var gridPos = grid.offset({ margin: true, scroll: false });
    $('<div id="shadow" style="position: absolute;background-color: White; "></div>')
    .css({ left: gridPos.left, top: gridPos.top, width: grid.width(), height: grid.height(), opacity: 0.5, display: 'none' })
    .appendTo('body');
    $('<img id="progressImg" src="/Content/img/pricera-progress.gif" />').css({position: 'absolute', left: gridPos.left + 220, top: gridPos.top + 120}).appendTo('body');
    $('#shadow').fadeIn();
    $('#filters input').attr('disabled', true);
    
    // variable declared in Search.aspx
    if (categoryID) {
        $.post('/Compare-Prices/Products/' + categoryID + '/' + page, { pageSize: pageSize, filter: buildFilter(), query: searchQuery }, productsReceived, 'json');
    }
    else {
        $.post('/Compare-Prices/Search/' + page, { query: searchQuery, filter: buildFilter() }, productsReceived, 'json');
    }
}

function productsReceived(data)
{
    //pager = new Pager(10, Math.ceil(data.Total / pageSize));
    var grid = $('#prodGrid')[0];
    var products = data.Products;
    if (searchQuery)
    {
        if (data.Total > 1)
        {
            $('.totalProdCount').html(data.Total + " matches for \"" + searchQuery + "\"");
        }
        else
        {
            $('.totalProdCount').html(data.Total + " match for \"" + searchQuery + "\"");
        }
    }
    else
    {
        $('.totalProdCount').html(data.Total);
    }
    $('div.prod', grid).remove();
    for (var i = 0; i < products.length; ++i)
    {
        var product = products[i];
        var prod = addChild(grid, 'div', 'prod');

        var inner = addChild(prod, 'div', 'innerProd');

        // Image
        var div = addChild(inner, 'div', 'prodImage');
        div.innerHTML = '<img class="prodImage" src="' + product.Img + '" />';
        // Price
        div = addChild(inner, 'div', 'prodPrice');
        addChild(div, 'p').innerHTML = 'from';
        //addChild(div, 'p', 'price highlight1').innerHTML = product.Price;
        addLink(div, product.Url, product.Price, 'price highlight1');
        addChild(div, 'p').innerHTML = 'at ' + product.Offers + ' stores';
        // Desc
        div = addChild(inner, 'div', 'prodDesc');
        var h2 = addChild(div, 'h2');
        addLink(h2, product.Url, product.Name);
        addChild(div, 'p').innerHTML = product.Desc;
        // Desc - buy actions
        div = addChild(div, 'div', 'prodBuy');
        if (product.Offers == 1)
            addChild(div, 'div', 'btnCompare').innerHTML = '<a href="' + product.Url + '" target="_blank" rel="nofollow">See it</a>';
        else
            addChild(div, 'div', 'btnCompare').innerHTML = '<a href="' + product.Url + '">Compare Prices</a>';
        if (product.Rating)
            addImage(div, '/Content/img/rating/r' + product.Rating + '.gif');
        if (product.ReviewsText)
            addLink(div, product.Url + "#reviewTab", product.ReviewsText);

        prod.innerHTML += '<div class="prodActions"></div>';
    }
    prepareGrid();
    addMoreLess();
    buildPager(data.Total);
    $('#filters input').attr('disabled', false);
    //$('#progress').hide();
    $('#shadow').remove();
    $('#progressImg').remove();
    scroll(0, 0);
}

function buildPager(totalProductCount)
{
    var pager = new Pager(11, Math.ceil(totalProductCount / pageSize));
    var pagerCtrl = $('ul.pager');
    var pages = pager.setPage(page);
    pagerCtrl.empty();
    var sb = new StringBuilder();
    for (var i = 0; i < pages.length; ++i)
    {
        sb.add('<li>');
        if (pages[i] == page)
            sb.add('<em>').add(pages[i]).add('</em>');
        else if (pages[i])
            sb.add('<a href="').add(location.href).add('?page=').add(pages[i]).add('" rel="').add(pages[i]).add('">').add(pages[i]).add('</a>');
        else
            sb.add('...');
        sb.add('</li>');
    }
    pagerCtrl.append(sb.toString());
    $('li:contains(...)', pagerCtrl).addClass('gap');
    $('em', pagerCtrl).parent().addClass('current');
    $('ul.pager a').click(function()
    {
        page = parseInt(this.rel);
        buildGrid();
        return false;
    });
}

function addMoreLess() 
{
    var showMore = $('<a href="javascript:void"> [+]</a>').click(function() { $(this).hide().next().show().next().show(); });
    var showLess = $('<a href="javascript:void"> [-]</a>').hide().click(function() { $(this).hide().prev().hide().prev().show(); });
    $('span.more').hide().before(showMore).after(showLess);
}

$(function()
{
	$('#filters div.items p').hover(function() { $(this).addClass('active'); }, function() { $(this).removeClass('active'); });
});