productConfigurator=new Class({options:{urlValues:{},baseHref:"/css/",addToCartBaseHref:"/",addToCartButton:"addToCartButton",addToCartForm:"prdAddToCart",productLink:".prodDetail",itemClickSelector:".PricedOptionsContainer li",itemImageContainerPrefix:"ImgContainer_",subTotalTextContainer:"subTotalCost",basePrice:"0.00",groupClassContainer:"ul",pricedOptionsForm:"PricedOptionsForm",errorContainer:"",errorOffsets:{x:32,y:32},onBeforeAddtoCart:Class.empty,variantSelector:"thisfinish",productImage:"productImage",productImageZoom:"zoom",productImageLink:"prdImageLink",baseMediaGalleryHref:"",freeShippingContainer:"freeShipping",leadTimeContainer:"prdStockMessage",needsConfig:false,disabledAddToCartImage:"",selectFinishMessage:"Please select a finish before adding to cart",noPriceMessage:"Oops...We're sorry we forgot to set a price! Please call customer service to place an order.",outOfStockText:"Item current out of stock"},initialize:function(el,options){variants=[];this.setOptions(options);this.optionsContainer=$(el);this.productClicked=false;this.isConfigurable=false;this.build()},build:function(){var allOptions,selectionType,imgSrc,imgElement,imgContainer,button,item;this.buildErrorPopup();$(this.options.variantSelector).addEvent("change",this.onChangeVariant.bind(this)).addEvent("keyup",this.onChangeVariant.bind(this));$$(this.options.addToCartButton).each(function(button){button.addEvent("click",this.addToCart.bind(this,[button]));button.setStyle("cursor","pointer");button.store("defaultSrc",button.getProperty("src"));button.store("defaultAlt",button.getProperty("alt"))},this);this.defaultProductImage=$(this.options.productImage).getProperty("src");$(this.options.freeShippingContainer).store("defaultText",$(this.options.freeShippingContainer).get("html"));$(this.options.leadTimeContainer).store("defaultText",$(this.options.leadTimeContainer).get("html"));if($type($(this.options.pricedOptionsForm))){this.isConfigurable=true}if($type($(this.options.pricedOptionsForm))){$(this.options.pricedOptionsForm).reset();this.getAllOptionElements().each(function(item){if(this.getOptionType(item)=="textbox"){$(item).getElement("input").addEvent("keyup",this.onTextboxChange.bind(this,[item]))}else{$(item).getElements(this.options.productLink).addEvent("mouseleave",function(event){this.productClicked=false}.bind(this)).addEvent("mouseenter",function(event){this.productClicked=true}.bind(this));$(item).addEvent("click",this.onChoiceClick.bind(this,[item])).addEvent("mouseover",this.onChoiceMouseOver.bind(this,[item])).addEvent("mouseout",this.onChoiceMouseOut.bind(this,[item]))}if(this.isOptionSelected(item)){this.onChoiceClick(item)}this.setOptionPrice(item);imgSrc=$(item).getProperty("IDImageSrc");if($defined(imgSrc)&&imgSrc.length>0){imgContainer=$(this.options.itemImageContainerPrefix+item.getParent().getProperty("id"));new Asset.image(imgSrc,{id:"optionImg_"+this.getOptionId(item)}).setStyle("display","none").addClass("configureImg").injectTop(imgContainer)}if(this.getAllChoicesByGroup(this.getGroupId(item)).length==1||this.isOptionSelected(item)){this.showOptionImage(item)}},this);this.updateTotal()}},onChoiceClick:function(el){if(this.productClicked){return false}var isSelected=this.isOptionSelected(el);var selectionType=this.getOptionType(el);var groupId=el.getParent().getProperty("id");var IDCost=this.getOptionCost(el);var choiceDiff=0;if(selectionType.test("checkbox","i")){if(!isSelected){this.setChoice(el)}else{this.clearChoice(el)}}else{this.getAllChoicesByGroup(groupId).each(function(i){if(!this.getOptionType(i).test("textbox","i")){this.clearChoice(i)}choiceDiff=this.getOptionCost(i)-IDCost;if(choiceDiff!=0){i.getElements(".cost").set("html","("+this.formatCurrency(choiceDiff)+")")}else{i.getElements(".cost").set("html","")}}.bind(this));this.setChoice(el)}this.updateTotal()},onChoiceMouseOver:function(el){var groupId=el.getParent().getProperty("id");var imgContainer=$(this.options.itemImageContainerPrefix+el.getParent().getProperty("id"));el.toggleClass("hover");imgContainer.getChildren().each(function(i){i.setStyle("display","none")}.bind(this));this.showOptionImage(el)},onChoiceMouseOut:function(el){var groupId=this.getGroupId(el);var groupCount=this.getAllChoicesByGroup(groupId).length;if(groupCount>1){this.hideOptionImage(el)}el.toggleClass("hover");if(this.getOptionType(el).test("radio","i")){this.getAllChoicesByGroup(groupId).each(function(i){if(this.isOptionSelected(i)){this.showOptionImage(i)}}.bind(this))}},onTextboxChange:function(el){var textBox=el.getElement("input");var currentText=textBox.get("value");if(currentText.length>0){el.addClass("selected");el.setProperty("IDSelected","true")}else{el.removeClass("selected");el.setProperty("IDSelected","false")}},clearChoice:function(selElement){if(this.productClicked){return false}var IDCost=this.getOptionCost(selElement);selElement.removeClass("selected");selElement.setProperty("IDSelected","false");selElement.getElement("input").checked=false;if(IDCost>0){selElement.getElements(".cost").set("html","("+this.formatCurrency(IDCost)+")")}else{selElement.getElements(".cost").set("html","")}if(this.getOptionType(selElement).test("radio","i")){this.hideOptionImage(selElement)}},setChoice:function(selElement){if(this.productClicked){return false}selElement.addClass("selected");selElement.setProperty("IDSelected","true");selElement.getElement("input").checked="on";selElement.getElements(".cost").set("html","(Included in price)");if(this.getOptionType(selElement).test("radio","i")){this.showOptionImage(selElement)}},setOptionPrice:function(el){var IDCost=this.getOptionCost(el);if(this.isOptionSelected(el)){el.getElements(".cost").set("html","(Included in price)")}else{if(IDCost!=0){el.getElements(".cost").set("html","("+this.formatCurrency(IDCost)+")")}}},showOptionImage:function(el){var imgElement=$("optionImg_"+this.getOptionId(el));if($defined(imgElement)){imgElement.setStyle("display","block")}},hideOptionImage:function(el){var imgElement=$("optionImg_"+this.getOptionId(el));if($defined(imgElement)){imgElement.setStyle("display","none")}},isOptionSelected:function(el){return(el.getProperty("IDSelected")=="true")?true:false},getOptionType:function(el){return(el.getProperty("IDSelectionType"))?el.getProperty("IDSelectionType"):"checkbox"},getOptionCost:function(el){var optionCost=(el.getProperty("IDCost"))?el.getProperty("IDCost"):0;return optionCost.toFloat()},getOptionRegex:function(el){var optionRegex=(el.getProperty("IDValidationRegex"))?el.getProperty("IDValidationRegex"):"";return optionRegex},getOptionInvalidMessage:function(el){var message=(el.getProperty("IDInvalidMessage"))?el.getProperty("IDInvalidMessage"):"";return message},getOptionValue:function(el){var optionValue="";if(this.getOptionType(el).test("Textbox","i")){optionValue=(el.getElement("input").get("value"))?el.getElement("input").get("value"):""}return optionValue},getOptionId:function(el){var optionId=($defined(el.getProperty("IDPricedOptionId")))?el.getProperty("IDPricedOptionId"):0;return optionId.toInt()},getGroupName:function(el){var groupName=($defined($(el).getProperty("IDGroupName")))?$(el).getProperty("IDGroupName"):"";return groupName},getGroupId:function(el){var groupId=($defined($(el).getParent().getProperty("id")))?$(el).getParent().getProperty("id"):0;return groupId},getAllChoicesByGroup:function(groupId){return $(groupId).getChildren()},getAllOptionElements:function(){return this.optionsContainer.getElements(this.options.itemClickSelector)},getAllOptionGroups:function(){var groupIdArray=[];$(this.optionsContainer).getElements(this.options.groupClassContainer).each(function(el){groupIdArray.include(el.getProperty("id"))});return groupIdArray},setDefaultVariant:function(finish){var defaultVariant=this.getVariantByFinish(unescape(finish));if($defined(defaultVariant)){var defaultOption=$(this.options.variantSelector).getChildren().filter(function(item,index){return(item.get("value")==defaultVariant.uniqueid)},this);defaultOption.getLast().setProperty("selected","selected")}},verifyChoices:function(){var numSelected=0;var errorArray=[];var optionType="";this.getAllOptionGroups().each(function(i){optionType=this.getOptionType($(i).getChildren()[0]);if(optionType.test("Radio","i")){numSelected=$(i).getChildren().filter("[IDSelected=true]");if(numSelected==0){errorArray.include({message:"Please select a "+this.getGroupName(i),groupId:i})}}else{if(optionType.test("Textbox","i")){var firstOption=$(i).getChildren()[0];var optionRegex=this.getOptionRegex(firstOption);var optionValue=this.getOptionValue(firstOption);var regex=new RegExp(optionRegex,"i");if(!regex.test(optionValue)){errorArray.include({message:this.getOptionInvalidMessage(firstOption),groupId:i})}}}}.bind(this));return errorArray},addToCart:function(btn){var selectedOptionList;var baseHref=this.options.addToCartBaseHref;var addToCartString="";if(this.isConfigurable){var errorArray=this.verifyChoices();if(errorArray.length>0){return this.showErrorPopup(btn,errorArray)}var selectedOptionList=this.getSelectedOptionList()}this.fireEvent("onBeforeAddtoCart");var selectedVariant=this.getSelectedVariant();if(!$type(selectedVariant)){return this.showErrorPopup(btn,[{message:this.options.selectFinishMessage}])}else{$(this.options.addToCartForm).getElement("input[name=uniqueId]").set("value",selectedVariant.uniqueid)}if(selectedVariant.price<=0){return this.showErrorPopup(btn,[{message:this.options.noPriceMessage}])}$(this.options.addToCartForm).getElement("input[name=quantity]").value=(!$("qtyselected").get("value").isNumeric()||($("qtyselected").get("value").isNumeric()&&$("qtyselected").value.toInt()<1))?1:$("qtyselected").value.toInt();if(this.options.needsConfig){$(this.options.addToCartForm).getElement("input[name=page]").value="product:configureAccessory";baseHref="/index.cfm"}if($defined(selectedOptionList)){addToCartString="&OptionList="+selectedOptionList}addToCartString=$(this.options.addToCartForm).toQueryString()+addToCartString;location.href=baseHref+"?"+addToCartString},getSelectedOptionList:function(){var allSelectedOptions=this.getAllOptionElements().filter(".selected");var selectionOptionList="";allSelectedOptions.each(function(el,index){selectionOptionList=selectionOptionList+this.getOptionId(el)+";"+this.getOptionValue(el);if(allSelectedOptions.length!=index+1){selectionOptionList=selectionOptionList+","}}.bind(this));return selectionOptionList},updateBasePrice:function(basePrice){this.setOptions({basePrice:basePrice});this.updateTotal()},updateTotal:function(){var selectedVariant=this.getSelectedVariant();var newSubTotal=this.calculateTotal(selectedVariant);$$(this.options.subTotalTextContainer).each(function(cnt){cnt.set("html",this.formatCurrency(newSubTotal))}.bind(this))},calculateTotal:function(variant){var optionsTotal=0;var selectedVariantPrice=($defined(variant))?variant.price:this.options.basePrice;if(this.isConfigurable){var allSelectedOptions=this.optionsContainer.getElements("li[IDSelected=true]");allSelectedOptions.each(function(i){optionsTotal=optionsTotal+this.getOptionCost(i)}.bind(this))}optionsTotal=optionsTotal+selectedVariantPrice.toFloat();return optionsTotal},addVariant:function(uniqueid,image,freeShippingText,price,leadTimeText,disableAddToCart,finish){variants.include({uniqueid:uniqueid,image:new Asset.image(image),freeShippingText:freeShippingText,price:price,leadTimeText:leadTimeText,disableAddToCart:disableAddToCart,finish:finish});this.onChangeVariant()},getVariantByUniqueID:function(uniqueid){var variant;variants.each(function(item,index){if(item.uniqueid==uniqueid){variant=variants[index]}});return variant},getVariantByFinish:function(finish){var variant;variants.each(function(item,index){if(item.finish.toLowerCase()==finish.toLowerCase()){variant=variants[index]}});return variant},getSelectedVariant:function(){return this.getVariantByUniqueID(this.getSelectedVariantUniqueId())},getSelectedVariantUniqueId:function(){return($(this.options.variantSelector).getProperty("type")=="select")?$(this.options.variantSelector).getSelected().getLast().get("value"):$(this.options.variantSelector).get("value")},onChangeVariant:function(event){this.hideErrorPopup();this.updateTotal();return this.changeVariant(this.getSelectedVariantUniqueId())},changeVariant:function(uniqueid){var selectedVariant=this.getVariantByUniqueID(uniqueid);if($defined(selectedVariant)){if(this.options.baseMediaGalleryHref.length>0){$(this.options.productImageZoom).set("href",this.options.baseMediaGalleryHref+uniqueid);$(this.options.productImageLink).set("href",this.options.baseMediaGalleryHref+uniqueid)}$(this.options.productImage).setProperty("src",selectedVariant.image.getProperty("src"));$(this.options.freeShippingContainer).set("html",selectedVariant.freeShippingText);$(this.options.leadTimeContainer).set("html",selectedVariant.leadTimeText);if(selectedVariant.disableAddToCart=="true"){$$(this.options.addToCartButton).each(function(button){button.removeEvents("click");button.setProperty("src",this.options.disabledAddToCartImage);button.setStyle("cursor","default");button.setProperty("alt",this.options.outOfStockText)},this)}else{$$(this.options.addToCartButton).each(function(button){button.removeEvents("click");button.setProperty("src",button.retrieve("defaultSrc"));button.setProperty("alt",button.retrieve("defaultAlt"));button.setStyle("cursor","hand");button.addEvent("click",this.addToCart.bind(this,[button]))},this)}}else{$(this.options.productImage).setProperty("src",this.defaultProductImage);$(this.options.leadTimeContainer).set("html",$(this.options.leadTimeContainer).retrieve("defaultText"));$(this.options.freeShippingContainer).set("html",$(this.options.freeShippingContainer).retrieve("defaultText"));$$(this.options.addToCartButton).each(function(button){button.removeEvents("click");button.setProperty("src",button.retrieve("defaultSrc"));button.setProperty("alt",button.retrieve("defaultAlt"));button.setStyle("cursor","hand");button.addEvent("click",this.addToCart.bind(this,[button]))},this)}},formatCurrency:function(num){num=num.toString().replace(/\$|\,/g,"");if(isNaN(num)){num="0"}sign=(num==(num=Math.abs(num)));num=Math.floor(num*100+0.50000000001);cents=num%100;num=Math.floor(num/100).toString();if(cents<10){cents="0"+cents}for(var i=0;i<Math.floor((num.length-(1+i))/3);i++){num=num.substring(0,num.length-(4*i+3))+","+num.substring(num.length-(4*i+3))}return(((sign)?"":"-")+"$"+num+"."+cents)},buildErrorPopup:function(){if($defined(this.options.errorContainer)){scrollFx=new SmoothScroll({duration:700},window);$(this.options.errorContainer).setStyle("display","none")}},onErrorClick:function(el){scrollFx.start(0,$(el).getParent().getCoordinates().top);this.hideErrorPopup()},showErrorPopup:function(btn,errors){if($defined(this.options.errorContainer)){var htmlArray=[];var error;errors.each(function(error){var errorLink;if($defined(error.groupId)){errorLink=new Element("a",{href:"#"+error.groupId}).set("html",error.message).addEvent("click",this.onErrorClick.bind(this,[error.groupId]))}else{errorLink=new Element("b").set("html",error.message)}htmlArray.include(new Element("p").adopt(errorLink))}.bind(this));$(this.options.errorContainer).getElement("div").empty().adopt(htmlArray);$(this.options.errorContainer).setStyle("display","block");var offsetX,offsetY;offsetX=this.options.errorOffsets.x;offsetY=this.options.errorOffsets.y;$(this.options.errorContainer).setStyles({left:btn.getPosition().x+Math.abs(offsetX),top:btn.getPosition().y+offsetY})}else{alert("Oops...Please make sure you selected all options below!")}},hideErrorPopup:function(){if($defined($(this.options.errorContainer))){$(this.options.errorContainer).setStyle("display","none")}}});productConfigurator.implement(new Events);productConfigurator.implement(new Options);String.implement({lastElement:function(separator){separator=separator||" ";var txt=this;var index=txt.lastIndexOf(separator);var result=(index==-1)?txt:txt.substr(index+separator.length,txt.length);return result},trimLastElement:function(separator){separator=separator||" ";var txt=this;var index=this.lastIndexOf(separator);return(index==-1)?"":txt.substr(0,index+separator.length)},isNumeric:function(){return(this.match(/^(-?\d*\.?\d*)$/)!=null)}});