﻿// Summary: Provides functionality to dynamically update product 
// details based on user attribute selections.
function skuSelector (thumbLinkIdBase, thumbImageIdBase, enlargeLinkId, regularImageId, addToShoppingCartLinkId, sendToFriendLinkId, availabilityMessagePanelId, availabilityMessageSpanId) 
{
	this.thumbLinkIdBase = thumbLinkIdBase;
	this.thumbImageIdBase = thumbImageIdBase;
	this.enlargeLinkId = enlargeLinkId;
	this.regularImageId = regularImageId;
    this.attributeDefinitions = [];
    this.skuOfferings = [];
    this.addToShoppingCartLinkId = addToShoppingCartLinkId;
    this.sendToFriendLinkId = sendToFriendLinkId;
    this.availabilityMessagePanelId = availabilityMessagePanelId;
    this.availabilityMessageSpanId = availabilityMessageSpanId;
}

skuSelector.prototype.addAttributeDefinition = function(code, inputElementName) 
{
    var attributeInfo = new Object();
    attributeInfo.code = code;
    attributeInfo.inputElementName = inputElementName;
    this.attributeDefinitions.push(attributeInfo);
}

skuSelector.prototype.addSkuOffering = function(skuOffering) 
{
    this.skuOfferings.push(skuOffering);
}

skuSelector.prototype.onSelectionChanged = function() 
{
    var match = null;
    for (var index = 0; index < this.skuOfferings.length; index++)
    {
        var skuOffering = this.skuOfferings[index];
        if (this.isMatchingSkuOffering(skuOffering))
        {
            match = skuOffering;
            break;
        }
    }
    if (match != null)
    {
        this.displaySelectedSkuOffering(match);
    }
    else
    {
        this.clearOptionResults();
    }
}

//********************************************************************
String.prototype.contains = function(str) {
// Test to see if String contains a String 
//********************************************************************
    return this.indexOf(str) >= 0 ? true : false; 
}

// Test to see which SkuOfferings match selection 
skuSelector.prototype.isMatchingSkuOffering = function(skuOffering) 
{
    var radioObj = [];

    for (var index = 0; index < this.attributeDefinitions.length; index++)
    {
		var ddlObj = 0
        var definition = this.attributeDefinitions[index];
        var elem = document.forms[0].elements;

        for (var k = 0; k < elem.length; k++)
        {
			if (!elem[k].disabled && elem[k].name.contains(definition.inputElementName))
			{
				if (elem[k].type == 'radio')
				{
					radioObj.push(elem[k]);
				}
				else
				{
					ddlObj = elem[k];
				}
			}
        }
    
	    if (ddlObj != 0)
	    {
		    var value = ddlObj.value;
	    }
	    else
	    {
			for (var i = 0; i < radioObj.length; i++) 
			{
				if (radioObj[i].checked)
				{
					var value = radioObj[i].value;
				}
			}
	    }
        
        if (!this.isMatchingAttribute(skuOffering, definition.code, value))
        {
            return false;
        }
    }
    return true;
}

// Test to see if attribute matches selection
skuSelector.prototype.isMatchingAttribute = function(skuOffering, name, value) 
{
    for (var index = 0; index < skuOffering.attributes.length; index++)
    {
        var attribute = skuOffering.attributes[index];
        if (attribute.code == name)
        {
            if (attribute.value == value) return true;
        }
    }
    return false;
}

skuSelector.prototype.displaySelectedSkuOffering = function(skuOffering)
{
	this.setInnerHtml('dynamic_sku', skuOffering.code);
	this.setInnerHtml('dynamic_name', skuOffering.name);
	this.setInnerHtml('dynamic_saleprice', "<br/>" + skuOffering.saleInfoMsg);
	if (skuOffering.saleInfoMsg.length > 2)
	{
		this.setInnerHtml('dynamic_now', " now <b>" + skuOffering.priceHtml + "</b>");
		document.getElementById('dynamic_saleprice').style.visibility = 'visible';
	}
	else
	{
		this.setInnerHtml('dynamic_now', skuOffering.priceHtml);
		document.getElementById('dynamic_saleprice').style.visibility = 'hidden';
	}
	
	this.setInnerHtml('dynamic_shortDescription', "");
		
	var addToShoppingCartLink = document.getElementById(this.addToShoppingCartLinkId);
	if (skuOffering.isAvailableToOrder)
	{
		addToShoppingCartLink.style.display = 'inline';
		addToShoppingCartLink.setAttribute('href', skuOffering.addToBasketUrl.replace(/&amp;/g, '&'));
	}
	else
	{
		addToShoppingCartLink.style.display = 'none';
	}    
	
	var sendToFriendLink = document.getElementById('_ctl0_C1_ctlSendToFriendLink_ctlLink');
	sendToFriendLink.setAttribute('href', skuOffering.sendToFriendLinkUrl);
	
	this.displaySkuOfferingAttributes(skuOffering);
	this.displaySkuOfferingImages(skuOffering);
	this.displayAvailabilityMessage(skuOffering);
}

skuSelector.prototype.displayAvailabilityMessage = function(skuOffering)
{
	this.setInnerHtml(this.availabilityMessageSpanId, skuOffering.availabilityMessage);
	var panelCssClass = skuOffering.isAvailableToOrder 
		? "availabilitymessagepanel_instock" : "availabilitymessagepanel_outofstock";
	document.getElementById(this.availabilityMessagePanelId).className = panelCssClass;
}

skuSelector.prototype.displaySkuOfferingAttributes = function(skuOffering)
{
	//this.setInnerHtml('dynamic_attributes', skuOffering.attributesHtml);
	// Create li element for each CustomAttribute
	var nodesToDisplay = this.getAttributeListItemElements(skuOffering);
	// Retain existing li items ("product code" and "delivery info") at end of list
	var list = document.getElementById("skuAttributeList");
	for(var index = 0; index < list.childNodes.length; index++)
	{
		var element = list.childNodes[index];
		if (element.id == "skuCode" || element.id == "skuDeliveryLink")
		{
			element.style.visibility = 'visible';
			nodesToDisplay[nodesToDisplay.length] = element;
		}
	}
	this.removeChildNodes(list);
	for(var index = 0; index < nodesToDisplay.length; index++)
	{
		var node = nodesToDisplay[index];
		list.appendChild(node);
	}	
}

skuSelector.prototype.getAttributeListItemElements = function(skuOffering)
{
	var elements = [];
	for (var index = 0; index < skuOffering.attributes.length; index++)
    {
        var attribute = skuOffering.attributes[index];
        if (attribute.displayInSummary == true)
        {
			var element = document.createElement("li");
			element.appendChild(document.createTextNode(attribute.definitionName + " : " + attribute.displayValue));
			elements[elements.length] = element;			
        }
    }
    return elements;
}

skuSelector.prototype.removeChildNodes = function(element)
{
  while (element.childNodes[0])
  {
	element.removeChild(element.childNodes[0]);
  }
}

skuSelector.prototype.setInnerHtml = function (elementId, html)
{
	var el = document.getElementById(elementId);
	el.innerHTML = html;
}

skuSelector.prototype.displaySkuOfferingImages = function(skuOffering)
{
	document.getElementById('zoom_panel').style.display = 'block';
	var imageCount = 0;
	var mainImage = document.getElementById(this.regularImageId);
	var enlargeLink = document.getElementById(this.enlargeLinkId);
	for(var index = 0; index < skuOffering.images.length; index++)
	{
		var image = skuOffering.images[index];
		var imageNumber = index + 1;
		if (index == 0)
		{			
			this.setImageProperties(mainImage, image.regular);
			enlargeLink.href = image.enlarged.src;
			mainImage.alt = image.enlarged.caption;
		}	
		this.setThumbImageElements(imageNumber, image);
		imageCount++;
	}
	this.hideUnusedThumbImageElements(imageCount);
}

skuSelector.prototype.hideUnusedThumbImageElements = function(imageCount)
{
	for (var imageNumber = 1; imageNumber <= 5; imageNumber++)
	{
		var thumbLink = this.getThumbLink(imageNumber);
		if (imageNumber > imageCount)
		{
			if (thumbLink == null)
			{
				continue;
			}
			thumbLink.style.display = "none";
		}
		else
		{
			if (thumbLink == null)
			{
				continue;
			}
			thumbLink.style.display = "";
		}
	}
}

skuSelector.prototype.setThumbImageElements = function(imageNumber, image)
{
	var thumbImage = this.getThumbImage(imageNumber);
	if (thumbImage == null)
	{
		return;
	}
	this.setImageProperties(thumbImage, image.thumb);
	var thumbLink = this.getThumbLink(imageNumber);
	
	var onClick;
	var useAnonymousFunction = (cmn_getBrowserName() == 'msie');
	if (useAnonymousFunction)
	{
		onClick = function () 
		{
			displayImage(image.regular.src, image.enlarged.src, image.regular.caption);
			this.blur();
			return false;
		}
	}	
	else
	{		
		onClick = 'displayImage(\'' + image.regular.src + '\', \'' + image.enlarged.src + '\', \'' +						image.regular.caption + '\');this.blur();return false;';
	}
	thumbLink.setAttribute("onClick", onClick, 0);	
	//thumbLink.style.display = "inline";	
}

skuSelector.prototype.getThumbLink = function(imageNumber)
{
	var id = this.thumbLinkIdBase + imageNumber;
	return document.getElementById(id);
}

skuSelector.prototype.getThumbImage = function(imageNumber)
{
	var id = this.thumbImageIdBase + imageNumber;
	return document.getElementById(id);
}

skuSelector.prototype.setImageProperties = function(image, imageFile)
{
	image.src = imageFile.src;
	image.width = imageFile.width;
	image.height = imageFile.height;
	image.caption = imageFile.caption;
}

// Adjusts display when no SkuOffering Match for option selection
skuSelector.prototype.clearOptionResults = function() 
{
	this.setInnerHtml('dynamic_sku', "Not Available");
	this.setInnerHtml('dynamic_name', "Not Available");
	this.setInnerHtml('dynamic_now', "<br/>Not Available");
	this.setInnerHtml('dynamic_saleprice', "");
	this.setInnerHtml('_ctl0_C1_ctlAvailabilityMessage_messageSpan', "Not Available");
	this.setInnerHtml('dynamic_shortDescription', "");
	var list = document.getElementById("skuAttributeList");
	
	for (var index = 0; index < list.childNodes.length; index++)
	{
		var element = list.childNodes[index];
		if (element.id == "skuCode" || element.id == "skuDeliveryLink")
		{
			element.style.visibility = 'hidden';
		}
		else
		{
			try
			{
			element.style.display = 'none';
			} catch (ex) {}
		}
	}
		
	var addToShoppingCartLink = document.getElementById(this.addToShoppingCartLinkId);
	addToShoppingCartLink.style.display = 'none';
	
	var sendToFriendLink = document.getElementById(this.sendToFriendLinkId);
	var mainImage = document.getElementById(this.regularImageId);
	mainImage.src = scs_getWebPath('/interface/unavailable.gif');
	document.getElementById('zoom_panel').style.display = 'none';
}

//
function sc_wql (quantitySelectId, linkId) {
    var qty = 0;
    var link = "";
    var index = 0;
    if (document.getElementById(quantitySelectId)){
        qty = document.getElementById(quantitySelectId).selectedIndex + 1;
        if (document.getElementById(linkId)){
            link = document.getElementById(linkId).getAttribute("href");
            index = link.indexOf("qty=");
            link = link.substring(0,index);
            link = link + "qty=" + qty;
            document.getElementById(linkId).setAttribute("href", link );
        }
    }


}