var previousShippingHTML = '';
ProductSelectorMediator.prototype = new ProductSelector();

function ProductSelectorMediator(args)
{
	ProductSelector.call(this);

	this.defaults = {
			swatchImageId : 'swatchImage',
			OOSMessageElementId : 'oosMessageId'};
	this.defaults = ProtoLite.Object.CopyProperties(this.defaults, args);

	var product = this.defaults.product;
	this.id = "SkuSelector_" + this.defaults.id;
	if (InstanceContainer)
		InstanceContainer.RegisterInstance(this);

	this.MetaData = {
	    salePrices : [],
	    regularPrices : [],
	    lowestRegularPrice :500000,
	    regularPriceToDisplay :0,
	    discountinuedTotal :0,
	    hasOptions :false
	};

	this.currentSelectedSku = null;
	var self = this;
	var imageMapForZoomer = {};
	var shppingInfoMap = {};
	var containerToDraw = GetElement(this.defaults.containerToDraw);
	var addToCartArea = this.defaults.addToCartArea;

	var imageBoxId = 'imagebox1';
	var swatchImageId = this.defaults.swatchImageId;
	var profile = false;
	// profile = true;
	addToCartArea.profile = profile;
	addToCartArea.printTrace = this.printTrace;
	addToCartArea.RegisterProductSelector(this.id);

	this.init =
	        function(initFunc)
	        {
		        for ( var i = 0; i < product.sku_data.length; i++)
		        {
			        var skuItem = product.sku_data[i];
			        var swatchImg = skuItem.sku_swatch_image;
			        if (!swatchImg || swatchImg == '')
			        {
				        swatchImg =
				                'http://mirror.altrec.com/images/shop/photos/nophoto_skuselect.gif';
			        }
			        else
			        {
				        swatchImg = 'http://mirror.altrec.com' + swatchImg;
			        }
			        skuItem.imgHtml =
			                '<div class="cropSwatch" style=\'background-image:url("' + swatchImg + '");\'>&nbsp;</div>';

			        var regularImg = skuItem.sku_swatch_image_d;
			        if (!regularImg || regularImg == '')
			        {
				        regularImg =
				                'http://mirror.altrec.com/images/shop/photos/nophoto_d.gif';
			        }
			        else
			        {
				        regularImg = 'http://mirror.altrec.com' + regularImg;
			        }
			        skuItem.sku_swatch_image_reg = regularImg;
			        skuItem.sku_swatch_image_zoomed =
			                ((skuItem.sku_zoom_image && skuItem.sku_zoom_image != '')
			                        ? domainPrefix : '')
			                        + skuItem.sku_zoom_image;

			        // update image map object
			        if (!imageMapForZoomer[skuItem.sku_swatch_image_d
			                .toLowerCase()])
			        {
				        imageMapForZoomer[skuItem.sku_swatch_image_d
				                .toLowerCase()] =
				                skuItem.sku_swatch_image_zoomed;
			        }

			        // update shipping info map
			        var shippingKey =
			                skuItem.sk_shipping_cost + "_"
			                        + skuItem.shipping_time;
			        if (!shppingInfoMap[shippingKey])
			        {
				        shppingInfoMap[shippingKey] = {
				            count :1,
				            item :skuItem
				        };
			        }
			        else
			        {
				        shppingInfoMap[shippingKey].count += 1;
			        }

			        if (initFunc)
				        initFunc(this.id, skuItem, product, this.MetaData);
		        }

		        this.SetData(containerToDraw, product);

		        // render
		        this.CurrentState = 'MultipleSelection';

		        if (this.profile)
		        {
			        this.printTraceLbl = document.createElement('div');
			        containerToDraw.parentNode.appendChild(this.printTraceLbl);
		        }
		        else
			        TimerQueue.enabled = false;
	        };

	this.RenderDefaultSelections = function()
	{
		this.SelectValidSkus();
		if (this.SelectedSkuItem)
		{
			this._handleSelection(this.SelectedSkuItem);
		}
		else if (this.defaultSkuItem)
		{
			// simulate clicks
			for ( var property in self.selectors)
			{
				var selector = self.selectors[property];
				if (selector.display == 'block')
				{
					var str =
					        property + '_._' + property + '_'
					                + this.defaultSkuItem[property];

					try
					{
						if (selector.options.subSelectors
						        && selector.options.subSelectors.length > 0
						        && selector.options.subSelectors[0].property)
						{
							str +=
							        '_'
							                + selector.options.subSelectors[0].property
							                + '_'
							                + this.defaultSkuItem[selector.options.subSelectors[0].property];
						}

						str = str.replace(/'/g, "##");
					}
					catch (e)
					{
						// do nothing
					}
					this.OnClick(str);
				}
			}
		}
		this.initing = false;
	};

	this.BuyNowEvent = function(e, args)
	{
		if (this.CurrentState == 'ValidSelection')
		{
			if (product.sku_data.length == 1)
			{
				try
				{
					var imgSrc = GetElement('fullimage').src;
					selectedSKU.sku_swatch_image = imgSrc;
				}
				catch (ex)
				{
				}
			}

			var selectedSKU = this.currentSelectedSku;
			selectedSKU.href = window.location.href;
			selectedSKU.productName = product.product_name;
			selectedSKU.brandName = product.pd_brand_name;
			selectedSKU.pid = product.pid;

			this.AddToCart(selectedSKU);
			

		}
		else if (this.CurrentState == 'MultipleSelection')
		{
			var neededSelectors = this.promptSelections();

			var message = 'Please select a ';
			for ( var i = 0; i < neededSelectors.length; i++)
			{
				if (i > 0 && i < (neededSelectors.length - 1))
					message += ', ';
				if (i > 0 && i == (neededSelectors.length - 1))
					message += ' and ';
				message += neededSelectors[i];
			}
			message += ' before adding to cart';

			addToCartArea.DrawSelectorPrompts(message);
		}
		else
		{
			// oos
			if (this.OnOutOfStock && this.hasOOSSku)
			{
				this.OnOutOfStock(this.oosObj);
			}
		}
	};

	this.AddToCart = function(selectedSKU)
	{
		var cartItem = new AltrecItem();
		cartItem.setData(selectedSKU);
		cart.addToCart(null, cartItem);
	};

	this._handleMouseOverEvent =
	        function(selectorItem)
	        {
		        if (selectorItem.propertySelected == 'color'
		                && !this.selectors['color'].selectedItem)
			        this
			                ._swapColorSwatch(selectorItem.exampleSku.sku_swatch_image_reg);
	        };

	this._revertSavedState =
	        function()
	        {
		        if (this.selectors['color'].selectedItem)
			        this
			                ._swapColorSwatch(this.selectors['color'].selectedItem.exampleSku.sku_swatch_image_reg);
	        };

	this._selectItemEvent =
	        function()
	        {
		        if (this.selectors['color'].selectedItem)
			        this
			                ._swapColorSwatch(this.selectors['color'].selectedItem.exampleSku.sku_swatch_image_reg);
	        };

	this.getDefaultSelectedSku = function()
	{
		return {
			onhand_qty :1
		};
	};

	this._handleSelection =
	        function(sku)
	        {
		        addToCartArea.ClearSelection();

		        this.hidePrompts();
		        this.currentSelectedSku = null;
		        if (sku != null)
		        {
			        if (sku.SpecialOrder == "true")
			        {
				        addToCartArea.DrawSpecialOrder();
			        }
			        else
			        {
				        addToCartArea.DrawAddToCart();
			        }

			        addToCartArea.DrawSelectedSkuInfo(sku);
			        this.currentSelectedSku = sku;
			        this.SetShippingInfo(sku);

			        if (this.OnSkuSelection)
			        {
				        this.OnSkuSelection(sku);
			        }
		        }
		        else if (this.CurrentState == 'MultipleSelection')
		        {
			        addToCartArea.DrawInactive();
		        }
		        else
		        {
			        this.oosObj = {};

			        for ( var property in this.selectors)
			        {
				        var selector = this.selectors[property];
				        if (selector.selectedItem)
				        {
					        this.oosObj[property] = selector.selectedItem.value;
				        }

				        if (selector.options.secondaryValue)
				        {
					        this.oosObj[selector.options.secondaryValue] =
					                selector.selectedItem.secondaryValue;
				        }
			        }

			        this.hasOOSSku = false;
			        var itemsMatched =
			                this.FindMatchingItems(this.oosObj, true);
			        if (itemsMatched.length == 0)
				        itemsMatched =
				                this.FindMatchingOOSItems(this.oosObj, true);

			        if (itemsMatched.length == 1)
			        {
				        this.oosObj = itemsMatched[0];
				        this.hasOOSSku = true;
				        addToCartArea.DrawOutOfStock();
			        }
			        else
			        {
				        addToCartArea.DrawNotAvaliable();
			        }

			        // push product level items on sku
			        for ( var i in product)
			        {
				        if (i != 'sku_data' && i != 'sku_data_oos')
					        this.oosObj[i] = product[i];
			        }

			        this._handleNonValidCombos(this.oosObj);
			        this.blockOOSMessageChange = true;
		        }
	        };

	this.SetShippingInfo =
	        function(selectedSKU, supressAnimation)
	        {
		        var shippingHTML = '';
		        if (selectedSKU.sk_shipping_cost == '0.0'
		                || selectedSKU.sk_shipping_cost == '')
		        {
			        shippingHTML +=
			                '<li><a href="#" onclick="WebModal.Show(\'free_shipping_popup\',{width:400});return false"><b>FREE Shipping</b></a></li>';
		        }
		        else
		        {
			        shippingHTML +=
			                '<li><a href="#" onclick="WebModal.Show(\'free_shipping_popup\',{width:400});return false"><b>' + FormatCurrency(
			                        Number(selectedSKU.sk_shipping_cost), true) + ' for Ground</b></a></li>';
			        shippingHTML +=
			                '<li><a href="#" onclick="WebModal.Show(\'free_shipping_popup\',{width:400});return false">Free on $45 Orders</a></li>';
		        }
		        if (Number(selectedSKU.shipping_extra) > 0)
		        {
			        shippingHTML +=
			                '<li><a href="#" onclick="WebModal.Show(\'free_shipping_popup\',{width:400});return false">' + FormatCurrency(
			                        Number(selectedSKU.shipping_extra), true) + ' Oversize Charge</a></li>';
		        }

		        var now = new Date();
		        var months =
		                [
		                        'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
		                        'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'
		                ];
		        now.setDate(now.getDate() + Number(selectedSKU.shipping_time));

		        if (selectedSKU.sku_vendor_id)
		        {
			        shippingHTML +=
			                '<li>Ships From : ' + selectedSKU.sku_vendor_id + '</li>';
		        }

		        if (selectedSKU.cs_onhand_qty)
		        {
			        shippingHTML +=
			                '<li>Qty On Hand : ' + selectedSKU.cs_onhand_qty + '</li>';
		        }

		        var shippingListElement = GetElement('shippingList');
		        if (shippingListElement)
		        {
			        if (previousShippingHTML == '')
				        previousShippingHTML = shippingListElement.innerHTML;
			        shippingListElement.innerHTML = shippingHTML;

			        if (previousShippingHTML != shippingHTML
			                && !supressAnimation && Effect)
			        {
				        new Effect.Highlight(shippingListElement, {
				            startcolor :'#ffff99',
				            endcolor :'#fffffff'
				        });
				        previousShippingHTML = shippingHTML;
			        }
		        }
	        };

	this.SwapSwatch = function(image)
	{
		try
		{
			var imageElement = GetElement(swatchImageId);
			if (imageElement.src != image)
				imageElement.src = image;

			if (GetElement(imageBoxId).style.display != 'block')
			{
				showImage(imageBoxId);
			}
		}
		catch (e)
		{
		}
	};

	this._swapColorSwatch =
	        function(image)
	        {
		        InstanceContainer.FireEventAsync(this.id, 'SwapSwatch', 0,
		                image);

		        try
		        {
			        var imageSrcUrl = image;
			        var imageKey =
			                imageSrcUrl.substring(
			                        imageSrcUrl.indexOf('/images'))
			                        .toLowerCase();
			        if (zoom
			                && (zoom.getZoomUrl() != imageMapForZoomer[imageKey]))
			        {
				        var cleanImage = imageMapForZoomer[imageKey]
				        zoom.SetAssets(swatchImageId, image, cleanImage
				                .replace('http://www.altrec.com',
				                        'http://mirror.altrec.com'));
			        }

		        }
		        catch (e)
		        {
		        }
	        };

	this._handleNonValidCombos =
	        function(sku)
	        {
		        if (this.blockOOSMessageChange)
			        return;

		        this.CreateOOSMessageElement();

		        var suffix = ' is no longer available';
		        var appendTempOOSMessage = false;
		        if (sku.sku_status_id)
		        {
			        if (sku.sku_status_id == '2' || sku.sku_status_id == '3')
			        {
				        appendTempOOSMessage = true;
				        suffix = ' is currently unavailable';
			        }
		        }

				var message = '';
		        if (sku.color)
		        	message = sku.color + suffix;
		        if (sku.size)
		        {
			        if (sku.color)
			        	message += ' in ' + sku.size;
			        else
			        	message = sku.size + suffix;
		        }
		        if (this.selectors['sk_options'] && sku.sk_options
		                && sku.sk_options != '')
		        {
			        if (message == '')
			        	message = 'This item is longer available ';
			        message += " for " + sku.sk_options;
		        }
		        if (appendTempOOSMessage)
		        {
		        	message +=
			                "<br />Please click below to be notified<br /> when in stock";
		        }
		       
		        this.DrawOOSMessage(message, sku);
	        };

	this._handleValidCombo = function(sku)
	{
		if (this.blockOOSMessageChange)
		{
			return;
		}
		this.TurnOOSMessageOff();
	};
	
	this.CreateOOSMessageElement = function()
	{
		if (!GetElement(this.defaults.OOSMessageElementId) && GetElement(swatchImageId))
		{
	        var oosMsg = document.createElement('div');
	        oosMsg.className = 'productImgOOS';
	        oosMsg.id = this.defaults.OOSMessageElementId;
			GetElement(swatchImageId).parentNode.appendChild(oosMsg);
		}
	};
	
	this.DrawOOSMessage = function(message, sku)
	{
        var oosMsg = GetElement(this.defaults.OOSMessageElementId);
        if (oosMsg)
        {
	        oosMsg.innerHTML = message;
	        oosMsg.style.display = 'block';
        }
	};
	
	this.TurnOOSMessageOff = function()
	{
        var oosMsg = GetElement(this.defaults.OOSMessageElementId);
		if (oosMsg)
		{
			oosMsg.style.display = 'none';
		}
	};

	this.OnPageLoadInit = function()
	{
		var largestKey = {
		    count :0,
		    item :null
		};

		for ( var key in shppingInfoMap)
		{
			if (shppingInfoMap[key].count > largestKey.count)
			{
				largestKey.count = shppingInfoMap[key].count;
				largestKey.item = shppingInfoMap[key].item;
			}
		}

		if (largestKey.item)
		{
			if (this.currentSelectedSku)
				largestKey.item = this.currentSelectedSku;
			this.SetShippingInfo(largestKey.item, true);
		}

		this.RenderDefaultSelections();
	};
	
	ProtoLite.Object.CopyFunctions(this, args);
}

function formatPriceArr(priceArray)
{
	var saleHtml = '';
	if (priceArray.length == 1)
	{
		saleHtml = FormatCurrency(priceArray[0], true);
		return saleHtml;
	}

	var saleLow = priceArray[0];
	var saleHigh = priceArray[0];
	for ( var i = 0; i < priceArray.length; i++)
	{
		var price = priceArray[i];
		if (price != priceArray[0])
			saleHtml += ', ';

		saleHtml += FormatCurrency(price, true);
		if (price < saleLow)
			saleLow = price;
		if (price > saleHigh)
			saleHigh = price;
	}

	if (priceArray.length == 2 || true)
	{
		saleHtml =
		        FormatCurrency(saleLow, true) + " - "
		                + FormatCurrency(saleHigh, true);
	}

	return saleHtml;
}

function AddToCartArea(args)
{
	this.defaults = {};
	this.defaults = ProtoLite.Object.CopyProperties(this.defaults, args);
	var buyNowBtn;
	var buyContainer;
	var buyNowMessageContainer;
	var selectedItemContainer;
	var selectedPriceLbl;
	var selectedItemLbl;
	var selectedSkuLbl;
	var buyNowMessage;
	var productSelectorArray = new Array();
	var containerToDraw = GetElement(this.defaults.containerToDraw);

	this.FireBuyNowClick = function()
	{
		_FireBuyNowClick();
	};
	
	function _FireBuyNowClick()
	{
		for ( var i = 0; i < productSelectorArray.length; i++)
		{
			InstanceContainer.FireEvent(productSelectorArray[i], 'BuyNowEvent');
		}
	}

	this.Render = function()
	{
		TimerQueue.addTimer('::startDrawBuyArea');

		buyContainer = document.createElement('div');
		buyContainer.innerHTML = '&nbsp;';
		buyContainer.className = 'buyContainer';
		buyContainer.style.position = 'relative';
		containerToDraw.appendChild(buyContainer);

		buyNowBtn = document.createElement('div');
		buyNowBtn.id = 'buyNowBtn';
		buyNowBtn.innerHTML = "&nbsp;";
		buyNowBtn.style.cursor = 'auto';
		buyNowBtn.className = 'buyNowBtn';
		buyNowBtn.onclick = this.FireBuyNowClick;
		buyContainer.appendChild(buyNowBtn);
		
		buyNowBtnA = document.createElement('a');
        buyNowBtnA.id = 'buyNowBtnA';
        buyNowBtnA.href = '#';    
        buyNowBtnA.appendChild(buyNowBtn);
        buyContainer.appendChild(buyNowBtnA);
        buyNowBtnA = document.createElement('a');

		selectedItemContainer = document.createElement('div');
		selectedItemContainer.className = 'selectedItemContainer';
		buyContainer.appendChild(selectedItemContainer);

		selectedItemLbl = document.createElement('div');
		selectedItemLbl.className = 'selectedItemLbl';
		selectedItemContainer.appendChild(selectedItemLbl);

		selectedPriceLbl = document.createElement('div');
		selectedPriceLbl.className = 'selectedPriceLbl';
		selectedItemContainer.appendChild(selectedPriceLbl);

		selectedSkuLbl = document.createElement('div');
		selectedSkuLbl.className = 'selectedSkuLbl';
		selectedItemContainer.appendChild(selectedSkuLbl);

		buyNowMessageContainer = document.createElement('div');
		buyNowMessageContainer.className = 'buyNowMessageContainer';
		buyContainer.appendChild(buyNowMessageContainer);
		var topArrow = document.createElement('div');
		topArrow.className = 'buyNowMessageTopArrow';
		topArrow.innerHTML = "&nbsp;";
		buyNowMessageContainer.appendChild(topArrow);
		buyNowMessage = document.createElement('div');
		buyNowMessage.className = 'buyNowMessage';
		buyNowMessageContainer.appendChild(buyNowMessage);

		this.printTrace(TimerQueue.getAllMessage(), true);
	};

	this.RegisterProductSelector = function(selectorId)
	{
		productSelectorArray.push(selectorId);
	};

	this.ClearSelection =
	        function()
	        {
		        if (buyNowMessageContainer && selectedPriceLbl
		                && selectedItemLbl && selectedSkuLbl)
		        {
			        buyNowMessageContainer.style.display = 'none';
			        selectedPriceLbl.innerHTML = '';
			        selectedItemLbl.innerHTML = '';
			        selectedSkuLbl.innerHTML = ''
		        }
	        };

	this.DrawSpecialOrder = function(selectedSKU)
	{
		if (!buyNowBtn)
			return;
		buyNowBtn.style.cursor = 'pointer';
		buyNowBtn.style.backgroundPosition = '0px -120px';
	};

	this.DrawAddToCart = function(selectedSKU)
	{
		if (!buyNowBtn)
			return;
		buyNowBtn.style.cursor = 'pointer';
		buyNowBtn.style.backgroundPosition = '0px 0px';
	};

	this.DrawOutOfStock = function()
	{
		if (!buyNowBtn)
			return;
		buyNowBtn.style.cursor = 'pointer';
		buyNowBtn.style.backgroundPosition = '0px -60px';
	};

	this.DrawNotAvaliable = function()
	{
		if (!buyNowBtn)
			return;
		buyNowBtn.style.cursor = 'auto';
		buyNowBtn.style.backgroundPosition = '0px -90px';
	};

	this.DrawInactive = function()
	{
		if (!buyNowBtn)
			return;
		buyNowBtn.style.cursor = 'auto';
		buyNowBtn.style.backgroundPosition = '0px -30px';
	};

	this.DrawSelectedSkuInfo =
	        function(sku)
	        {
		        if (selectedItemContainer && selectedItemLbl && selectedSkuLbl
		                && selectedPriceLbl)
		        {
			        var priceHTML = FormatCurrency(sku.sku_retail, true);
			        if (sku.sku_price < sku.sku_retail)
				        priceHTML =
				                "<span class='saleFont'>"
				                        + FormatCurrency(sku.sku_price, true)
				                        + "</span>&nbsp;<strike>"
				                        + FormatCurrency(sku.sku_retail, true)
				                        + "</strike>";
			        selectedPriceLbl.innerHTML = priceHTML;
			        selectedSkuLbl.innerHTML = "(#" + sku.sid + ")";

			        selectedItemLbl.innerHTML = sku.color;
			        if (selectedItemLbl.innerHTML != '' && sku.size != '')
				        selectedItemLbl.innerHTML += ', ';
			        selectedItemLbl.innerHTML += sku.size;
			        if (sku.sk_options != '')
			        {
				        if (selectedItemLbl.innerHTML != '')
					        selectedItemLbl.innerHTML += " - ";
				        selectedItemLbl.innerHTML += sku.sk_options;
			        }
			        if (selectedItemLbl.innerHTML == '')
				        selectedItemContainer.style.top = '0px';
		        }
	        };

	this.DrawSelectorPrompts = function(message)
	{
		if (buyNowMessageContainer && buyNowMessage)
		{
			buyNowMessageContainer.style.display = 'block';
			buyNowMessageContainer.style.width = '350px';

			buyNowMessage.innerHTML = message;
		}
	};
	
	ProtoLite.Object.CopyFunctions(this, args);
}
