﻿/// <reference path="../Edentity.Global.js" />
/// <reference path="../External/jquery-1.4.1-vsdoc.js" />
/// <reference path="../Shoppers.Cookie.js" />

Edentity.RegisterNamespace("SDM.Modules.eFlyerOffers");

(function(eFlyer, $) {

    var defaults = {

};

var _currentPage = 1;
var _currentNatlPage = 1;
var _pager = null;
var _items = null;
var _category = -1;
var _onlyNational = false;
var _lang = null;
var _properties = null;

eFlyer.Init = function(p) {
    _properties = $.extend({}, defaults, p || {});
    var $container = _properties.Container,
            $btnSubmitPostal = $container.find("#btnSubmitPostal"),
            $btnPrev = $container.find("#btnEFlyerPrev"),
            $btnNext = $container.find("#btnEFlyerNext"),
            $ddlCategories = $("[id$=ddlCategories]", $container);
    _pager = $container.find('.Pager');
    _items = $container.find('.Flyer .Item');
    _category = _properties.CategoryID || determineCategoryFromUrl();
	_onlyNational = _category == -1;
	_lang = _properties.LanguageCode;

    $btnSubmitPostal.click(submitPostal);
    $btnPrev.click(prevClicked);
    $btnNext.click(nextClicked);
    $ddlCategories.val(_category).change(categoryChanged);

	loadItems(getStoredPostalCode(), _category, 1);
}

function getStoredPostalCode() {
    return Shoppers.Cookie.Get("eFlyerPostalCode");
}

function knowPostalCode() {
    return getStoredPostalCode() != null && getStoredPostalCode() != '';
}

function storePostalCode(code) {
    Shoppers.Cookie.Set("eFlyerPostalCode", code, 3600);
}

function getPostalCodeFromPage() {
    var $container = _properties.Container,
            postal = $container.find("#txtPostalCode").val();
    return ("" + postal).toLowerCase();
}

function isValidPostalCode(code) {
    var rePostalCode = /^[a-ceghj-npr-tvxy]\d[a-ceghj-npr-tv-z]\s*\d[a-ceghj-npr-tv-z]\d$/i;
    return rePostalCode.test(code);
}

function submitPostal() {
    var postal = getPostalCodeFromPage();
    if (isValidPostalCode(postal)) {
        storePostalCode(postal);
        loadItems(postal, _category, _currentPage + 1);
    } else {

    }
}

function loadItems(postalCode, category, pageNum) {

	if (pageNum <= 0) {
		pageNum = 1;
	}

	if (_onlyNational || pageNum == 1) {
		_currentPage = pageNum;
		loadNationalItems(category, pageNum);
	} else if (!(knowPostalCode()) && pageNum == 2) {
		showPostalCodePrompt();
        _properties.Container.find("#btnEFlyerPrev").addClass("PrevButton").removeClass("PrevButtonDisabled");
		_properties.Container.find("#btnEFlyerNext").addClass("NextButtonDisabled").removeClass("NextButton");
	} else {
		_currentPage = pageNum;
		pageNum = _currentPage - 1;
		loadZonedItems(postalCode, category, pageNum);
	}
}

function loadNationalItems(category, pageNum) {

	$.ajax({
		type: 'POST',
		url: Edentity.ResolveUrl('~/WebServices/AjaxService.asmx/GetEFlyerNatlListing'),
		data: "{Category:'" + category + "', PageNum:" + pageNum + ", LangCode:'" + _lang + "'}",
		contentType: 'application/json; charset=utf-8',
		dataType: 'json',
		success: function(res) {
			if (res && res.d) {
				var listings = res.d.Listings,
					hasMore = _onlyNational ? res.d.HasMore : true,
					flyerDate = res.d.FlyerDate;
				updateFlyerDate(flyerDate);
				showListings(_currentPage, hasMore);
				_items.each(function(i) {
					showListing($(this), listings[i]);
				});
			}
		},
		complete: function(XMLHttpRequest, textStatus) {
			//alert(XMLHttpRequest.status + ' ' + textStatus);
			//alert(XMLHttpRequest.responseText);
		}
	});
}

function loadZonedItems(postalCode, category, pageNum) {
	$.ajax({
		type: 'POST',
		url: Edentity.ResolveUrl('~/WebServices/AjaxService.asmx/GetEFlyerListing'),
		data: "{PostalCode:'" + postalCode + "', Category:'" + category + "', PageNum:" + pageNum + ", LangCode:'" + _lang + "'}",
		contentType: 'application/json; charset=utf-8',
		dataType: 'json',
		success: function(res) {
			if (res && res.d) {
				var listings = res.d.Listings,
					hasMore = res.d.HasMore,
					flyerDate = res.d.FlyerDate;
				updateFlyerDate(flyerDate);
				showListings(_currentPage, hasMore);
				_items.each(function(i) {
					showListing($(this), listings[i]);
				});
			}
		},
		complete: function(XMLHttpRequest, textStatus) {
			//alert(XMLHttpRequest.status + ' ' + textStatus);
			//alert(XMLHttpRequest.responseText);
		}
	});
}

function showPostalCodePrompt() {
    var $container = _properties.Container,
            $postalContainer = $container.find(".PostalCodeContainer"),
            $itemsContainer = $container.find(".Flyer");
    $itemsContainer.hide();
    $postalContainer.show();
}

function showListings(pageNum, hasMore) {
    var $container = _properties.Container,
            $postalContainer = $container.find(".PostalCodeContainer"),
            $itemsContainer = $container.find(".Flyer"),
            $btnEFlyerPrev = $container.find("#btnEFlyerPrev"),
            $btnEFlyerNext = $container.find("#btnEFlyerNext");
    $itemsContainer.show();
    $postalContainer.hide();
    if (pageNum == 1) {
        $btnEFlyerPrev.addClass("PrevButtonDisabled").removeClass("PrevButton");
    } else {
        $btnEFlyerPrev.addClass("PrevButton").removeClass("PrevButtonDisabled");
    }
    if (hasMore) {
        $btnEFlyerNext.addClass("NextButton").removeClass("NextButtonDisabled");
    } else {
        $btnEFlyerNext.addClass("NextButtonDisabled").removeClass("NextButton");
    }
}

function showListing($container, listing) {
    $container.empty();
    if (listing) {
	
		var $image = $("<div />").addClass("ItemImage");
		$image.append($("<img />").attr("src", listing.ProductThumbnailUrl).attr("alt", listing.ProductTitle).attr("width", 131).attr("height", 77));
		
        var $content = $("<div />").addClass("ItemContent");
		$content.append($("<div />").addClass("ItemName").text(listing.ProductTitle));
        $content.append($("<div />").addClass("ItemPrice").text(listing.Price));
		
		var $clear = $("<div />").addClass("Clear");

        if (listing.Description.length < 150) {
            $content.append($("<div />").addClass("ItemDescription").html(listing.Description));
        }
        else {
            var limitedDescription = listing.Description.substring(0, 149) + "..."
            $content.append($("<div />").addClass("ItemDescription").html(limitedDescription));
        }
		$container.append($image);
        $container.append($content);
		$container.append($clear);
    }
}

function updateFlyerDate(dateStr) {
	var dateRange = _properties.Container.find('.TitleBar .DateRange');
	if (dateRange.text() == '') {
		dateRange.text(dateStr);
	}
}

function prevClicked(e) {
    if ($(this).hasClass("PrevButton")) {
        loadItems(getStoredPostalCode(), _category, _currentPage - 1);
    }
}

function nextClicked(e) {
    if ($(this).hasClass("NextButton")) {
        loadItems(getStoredPostalCode(), _category, _currentPage + 1);
    }
}

function determineCategoryFromUrl() {
    var categories = _properties.Categories;
    for (var cat in categories) {
        if (location.href.toLowerCase().indexOf("/" + cat.toLowerCase()) != -1) {
            return categories[cat];
        }
    }
    return -1;
}

function categoryChanged(e) {
	var selCategory = $(this).val();
	if (!_onlyNational && selCategory == -1) return;
    _category = selCategory;
	loadItems(getStoredPostalCode(), _category, 1);
}

function categoryIDFromName(name) {
    var id = -1,
            categories = _properties.Categories;
    if (name && categories[name]) {
        contentID = categories[name];
    }
    return id;
}

} (SDM.Modules.eFlyerOffers, jQuery));
