/* --------- /javascripts/product.js --------- */ 

var ProductPage=Class.create({initialize:function(element,data){this.element=$(element);this.__data=data;this.option_groups=this.element.select('.option_group').collect(function(el){return new Product.OptionGroup(el);});this.variants=this.__data.variants.collect(function(r){var v=new Product.Variant('variant_'+r.id,r);v.images=r.image_ids.collect(function(id){(new Image()).src=this.__data.images[id]['large'];return this.__data.images[id];},this);v.options=this.option_groups.collect(function(g){return g.options.findAll(function(o){if(r.option_ids.member(o.id))return o.variants.push(v);});}).flatten();return v;},this);this.selectVariantsFromOptions();Object.extend(this,{dispatch:function(e,memo){switch(e.eventName){case'option:selected':this.selectVariantsFromOptions();break;case'option:over':break;case'option:out':break;case'variant:update':this.calculateTotals();break;case'image:zoom':this.imageZoom();break;case'image:reset_zoom':this.resetImageZoom();break;}}.bindAsEventListener(this)});document.observe('option:selected',this.dispatch);document.observe('option:over',this.dispatch);document.observe('option:out',this.dispatch);document.observe('variant:update',this.dispatch);document.observe('image:zoom',this.dispatch);document.observe('image:reset_zoom',this.dispatch);},isRetail:function(){return!this.isWholesale();},isWholesale:function(){return!!this.__data.wholesale;},isMinimumMet:function(quantity){return this.isWholesale()?this.__data.wholesale_minimum_quantity&&quantity>=this.__data.wholesale_minimum_quantity:true;},getSelectedOptions:function(){return this.option_groups.invoke('getSelectedOption');},selectVariantsFromOptions:function(){this.variants.invoke('hide');if(this.isWholesale()){this.__selected_variants=this.getSelectedOptions().pluck('variants').flatten();}else{var oaddr=this.getSelectedOptions().pluck('id').join('_');this.__selected_variants=[this.variants.find(function(v){return v.optionIds().join('_')==oaddr;})];}
this.__selected_variants.invoke('show');if(this.isRetail())this.determineAvailability();this.calculateTotals();var images=this.__selected_variants.pluck('images').flatten().uniq();if(images>1){var idx=$(this.element.id+'_image_index').update('');images.each(function(i){var el=$e('a',{href:'#'});el.appendChild($e('img',{src:i['xsmall']}));idx.insert(el);});}
$(this.element.id+'_large_image').setStyle({backgroundImage:'url('+images.first()['large']+')'});(new Image()).src=images.first()['original'];},resetImageZoom:function(){$(this.element.id+'_large_image').setStyle({backgroundImage:'url('+images.first()['large']+')'});},imageZoom:function(){$(this.element.id+'_large_image').setStyle({backgroundImage:'url('+images.first()['original']+')'});},selectOptionsFromVariant:function(variant){variant.options.invoke('select');},determineAvailability:function(){if(this.__selected_variants.first().onHand()>0){$('wholesale_message').hide();$('cart_form').down('.variants').show();$('cart_form').down('.purchase_totals').show();}else{$('cart_form').down('.variants').hide();$('cart_form').down('.purchase_totals').hide();$('wholesale_message').show();}
this.getSelectedOptions().each(function(o){o.variants.each(function(v){v.options.without(o).invoke(v.onHand()>0?'enable':'disable');});});},calculateTotals:function(){var quantity_element=$(this.element.id+'_purchase_quantity'),button_element=$('add_to_cart_button'),quantity=this.variants.invoke('quantity').sum(),total=this.variants.invoke('total').sum();if(this.isMinimumMet(quantity)){quantity_element.removeClassName('minimum_not_met');button_element.enable();}else{quantity_element.addClassName('minimum_not_met');button_element.disable();}
quantity_element.update(quantity);$(this.element.id+'_purchase_total').update((total).toMoney());},destroy:function(){document.stopObserving('option:selected',this.dispatch);document.stopObserving('option:over',this.dispatch);document.stopObserving('option:out',this.dispatch);document.stopObserving('variant:update',this.dispatch);}});var Product={};Product.Image=Class.create({initialize:function(element){}});Product.Variant=Class.create({initialize:function(element,data){this.__data=data;this.options=[];this.images=[];this.element=$(element);this.total_element=this.element.select('.item_total').first();this.input=this.element.select('.item_quantity .input').first();this.update();this.hide();Object.extend(this,{onKeyup:function(e){this.update();Event.stop(e);}.bindAsEventListener(this),onKeydown:function(e){var kc=e.keyCode;if(kc==16||(kc>=65&&kc<=90)||(kc>=106&&kc<=111)||kc>=186){Event.stop(e);}else if(/^0/.match(this.input.value)){this.input.value=this.input.value.replace(/^0/,'');}}.bindAsEventListener(this),onBlur:function(e){if(!this.input.value)this.input.value=0;}.bindAsEventListener(this)});this.input.observe('keydown',this.onKeydown);this.input.observe('keyup',this.onKeyup);this.input.observe('blur',this.onBlur);},optionIds:function(){return this.__data.option_ids;},image:function(key){return this.images[0][key||'large'];},price:function(){return parseFloat(this.__data.price);},onHand:function(){return $int(this.__data.on_hand);},quantity:function(){return $int(this.input.value||0);},total:function(){return this.price()*parseFloat(this.input.value||0);},update:function(){this.total_element.update((this.total()).toMoney());this.input.fire('variant:update');},clear:function(){this.input.value=0;this.total_element.update((0).toMoney());},disable:function(){this.element.select('input').invoke('disable');this.element.addClassName('disabled');},enable:function(){this.element.select('input').invoke('enable');this.element.removeClassName('disabled');},show:function(){this.enable();this.element.show();},hide:function(){this.element.hide();this.clear();this.disable();}});Product.OptionGroup=Class.create({selectedOption:false,initialize:function(element){this.element=$(element);this.id=this.element.id.gsub(/^product_option_group_/,'');this.options_element=$(this.element.id+'_options');this.selection_text=$(this.element.id+'_selection_text');this.options=this.options_element.select('.option').collect(function(o){return new Product.Option(this,o);},this);this.options.first().select();},optionFrom:function(element){if(element instanceof Product.Option)return element;element=$(element);return this.options.find(function(o){return o.element.id==element.id;})||false;},setSelectedOption:function(option){this.__selected_option=option;this.selection_text.update(option.text());},getSelectedOption:function(){return this.__selected_option;},deselectAllOptions:function(){this.options.invoke('deselect');},destroy:function(){this.options.invoke('destroy');}});Product.Option=Class.create({initialize:function(option_group,element){this.option_group=option_group;this.element=$(element);this.id=this.element.id.gsub(/^option_/,'');this.variants=[];Object.extend(this,{onClick:function(e){this.select();Event.stop(e);}.bindAsEventListener(this),toggleHover:function(e){this.__stateChange('over',e.type=='mouseout'?'out':false);}.bindAsEventListener(this)});this.element.observe('click',this.onClick);this.element.observe('mouseover',this.toggleHover);this.element.observe('mouseout',this.toggleHover);},text:function(){return this.element.alt||this.element.innerHTML;},disabled:function(){return this.element.hasClassName('disabled');},enabled:function(){return!this.disabled();},selected:function(){return this.element.hasClassName('selected');},selectable:function(){return!this.selected();},__stateChange:function(state,memo){this.element[memo?'removeClassName':'addClassName'](state);this.element.fire('option:'+(memo||state),{option:this});},select:function(){if(this.selectable()){this.option_group.deselectAllOptions();this.option_group.setSelectedOption(this);this.__stateChange('selected');}},deselect:function(option){this.__stateChange('selected','deselected');},enable:function(option){if(this.disabled())this.__stateChange('disabled','enabled');},disable:function(option){if(this.enabled())this.__stateChange('disabled');},destroy:function(){this.element.stopObserving();}});/* --------- /javascripts/image_zoom.js --------- */ 

if(Event.addBehavior)Event.addBehavior({'.image_zoom':function(){new Control.ImageZoom(this);}});if(typeof(Control)=="undefined")Control={};Control.ImageZoom=Class.create({initialize:function(element,options,preload){this.element=$(element);this.image=this.element.down('img');this.source={small:this.image.src,large:this.element.href};if(!preload){var image=new Image();image.src=this.source.small;image.onload=this.initialize.bind(this).curry(element,options,true);return;}
this.selected=this.source.small;this.options=Object.extend({trigger:null,afterZoomIn:null,afterZoomOut:null},options||{});this.position=this.element.cumulativeOffset();this.dimensions={small:this.image.getDimensions()};this.scaleReport=1;this.preload=new Image();this.preload.src=this.source.large;this.preload.onload=this.loaded.bind(this);this.scroller=$e('div').setStyle({overflow:'auto',width:(this.dimensions.small.width+20).px(),height:(this.dimensions.small.height+20).px()});this.element.wrap(this.scroller);this.wrapper=$e('div').setStyle({overflow:'hidden',width:(this.dimensions.small.width).px(),height:(this.dimensions.small.height).px()});this.scroller.wrap(this.wrapper);if(this.options.trigger){$(this.options.trigger).observe('click',this.click.bindAsEventListener(this));}
this.element.observe('click',this.click.bindAsEventListener(this));this.element.observe('mousemove',this.move.bindAsEventListener(this));},click:function(event){event.stop();switch(this.selected){case this.source.small:if(this.element.loaded){this.image.src=this.selected=this.source.large;this.element.show();this.move(event);if(this.options.afterZoomIn)this.options.afterZoomIn();}else{this.element.hide();this.click.bind(this).delay(0.5,event);}
break;case this.source.large:this.image.src=this.selected=this.source.small;if(this.options.afterZoomOut)this.options.afterZoomOut();break;}},move:function(event){var x=event.pointerX()-this.position.left;var y=event.pointerY()-this.position.top;this.scroller.scrollLeft=x*this.scaleReport-x;this.scroller.scrollTop=y*this.scaleReport-y;},loaded:function(){this.element.loaded=true;this.dimensions.large=this.preload.getDimensions();this.scaleReport=this.dimensions.large.width/this.dimensions.small.width;}});
