/**
 * aheadWorks Co.
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the EULA
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://ecommerce.aheadworks.com/LICENSE-M1.txt
 *
 * @category   AW
 * @package    AW_Ajaxcartpro
 * @copyright  Copyright (c) 2009-2010 aheadWorks Co. (http://www.aheadworks.com)
 * @license    http://ecommerce.aheadworks.com/LICENSE-M1.txt
 */
 
Product.ACPconfigurable = Class.create();
Product.ACPconfigurable.prototype = {
	config : {},
	initialize : function(config){
		this.config     = config;
		this.taxConfig  = this.config.taxConfig;
		this.settings   = $$('.super-attribute-select-acp');
		this.state      = new Hash();
		this.priceTemplate = new Template(this.config.template);
		this.prices     = config.prices;

		this.settings.each(function(element){
			Event.observe(element, 'change', this.configure.bind(this))
		}.bind(this));

		// fill state
		this.settings.each(function(element){
			var attributeId = element.id.replace(/[a-z]*/, '');
			if(attributeId && this.config.attributes[attributeId]) {
				element.config = this.config.attributes[attributeId];
				element.attributeId = attributeId;
				this.state[attributeId] = false;
			}
		}.bind(this))

		// Init settings dropdown
		var childSettings = [];
		for(var i=this.settings.length-1;i>=0;i--){
			var prevSetting = this.settings[i-1] ? this.settings[i-1] : false;
			var nextSetting = this.settings[i+1] ? this.settings[i+1] : false;
			if(i==0){
				this.fillSelect(this.settings[i])
			}
			else {
				this.settings[i].disabled=true;
			}
			$(this.settings[i]).childSettings = childSettings.clone();
			$(this.settings[i]).prevSetting   = prevSetting;
			$(this.settings[i]).nextSetting   = nextSetting;
			childSettings.push(this.settings[i]);
		}

		// try retireve options from url
		var separatorIndex = window.location.href.indexOf('#');
		if (separatorIndex!=-1) {
			var paramsStr = window.location.href.substr(separatorIndex+1);
			this.values = paramsStr.toQueryParams();
			this.settings.each(function(element){
				var attributeId = element.attributeId;
				element.value = (typeof(this.values[attributeId]) == 'undefined')? '' : this.values[attributeId];
				this.configureElement(element);
			}.bind(this));
		}
	},
	fillSelect: function(element){
		var attributeId = element.id.replace(/[a-z]*/, '');
		var options = this.getAttributeOptions(attributeId);
		this.clearSelect(element);
		element.options[0] = new Option(this.config.chooseText, '');

		var prevConfig = false;
		if(element.prevSetting){
			prevConfig = element.prevSetting.options[element.prevSetting.selectedIndex];
		}

		if(options) {
			var index = 1;
			for(var i=0;i<options.length;i++){
				var allowedProducts = [];
				if(prevConfig) {
					for(var j=0;j<options[i].products.length;j++){
						if(prevConfig.config.allowedProducts
							&& prevConfig.config.allowedProducts.indexOf(options[i].products[j])>-1){
							allowedProducts.push(options[i].products[j]);
						}
					}
				} else {
					allowedProducts = options[i].products.clone();
				}

				if(allowedProducts.size()>0){
					options[i].allowedProducts = allowedProducts;
					element.options[index] = new Option(this.getOptionLabel(options[i], options[i].price), options[i].id);
					element.options[index].config = options[i];
					index++;
				}
			}
		}
	},
	configure: function(event){
		var element = Event.element(event);
		this.configureElement(element);
	},
	configureElement : function(element) {
		this.reloadOptionLabels(element);
		if(element.value){
			this.state[element.config.id] = element.value;
			if(element.nextSetting){
				element.nextSetting.disabled = false;
				this.fillSelect(element.nextSetting);
				this.resetChildren(element.nextSetting);
			}
		}
		else {
			this.resetChildren(element);
		}
		this.reloadPrice();
	//      Calculator.updatePrice();
	},
	getAttributeOptions: function(attributeId){
		if(this.config.attributes[attributeId]){
			return this.config.attributes[attributeId].options;
		}
	},
	clearSelect: function(element){
		for(var i=element.options.length-1;i>=0;i--){
			element.remove(i);
		}
	},
	getOptionLabel: function(option, price){
		var price = parseFloat(price);
		if (this.taxConfig.includeTax) {
			var tax = price / (100 + this.taxConfig.defaultTax) * this.taxConfig.defaultTax;
			var excl = price - tax;
			var incl = excl*(1+(this.taxConfig.currentTax/100));
		} else {
			var tax = price * (this.taxConfig.currentTax / 100);
			var excl = price;
			var incl = excl + tax;
		}

		if (this.taxConfig.showIncludeTax || this.taxConfig.showBothPrices) {
			price = incl;
		} else {
			price = excl;
		}

		var str = option.label;
		if(price){
			if (this.taxConfig.showBothPrices) {
				str+= ' ' + this.formatPrice(excl, true) + ' (' + this.formatPrice(price, true) + ' ' + this.taxConfig.inclTaxTitle + ')';
			} else {
				str+= ' ' + this.formatPrice(price, true);
			}
		}
		return str;
	},
	formatPrice: function(price, showSign){
		var str = '';
		price = parseFloat(price);
		if(showSign){
			if(price<0){
				str+= '-';
				price = -price;
			}
			else{
				str+= '+';
			}
		}

		var roundedPrice = (Math.round(price*100)/100).toString();

		if (this.prices && this.prices[roundedPrice]) {
			str+= this.prices[roundedPrice];
		}
		else {
			str+= this.priceTemplate.evaluate({
				price:price.toFixed(2)
				});
		}
		return str;
	},
	reloadPrice : function(){
		var price = 0;
		for(var i=this.settings.length-1;i>=0;i--){
			var selected = this.settings[i].options[this.settings[i].selectedIndex];
			if(selected.config){
				price += parseFloat(selected.config.price);
			}
		}
		
		optionsPrice.changePrice('configAcp', price);
		
		optionsPrice.containers[0] = 'product-price-' + optionsPrice.productId + '_clone';
		optionsPrice.containers[4] = 'product-price-' + optionsPrice.productId + '_clone';
		optionsPrice.reload();
		
		return price;
	},
	reloadOptionLabels: function(element){
		var selectedPrice;
		if(element.options[element.selectedIndex].config){
			selectedPrice = parseFloat(element.options[element.selectedIndex].config.price)
		}
		else{
			selectedPrice = 0;
		}
		for(var i=0;i<element.options.length;i++){
			if(element.options[i].config){
				element.options[i].text = this.getOptionLabel(element.options[i].config, element.options[i].config.price-selectedPrice);
			}
		}
	},

	resetChildren : function(element){
		if(element.childSettings) {
			for(var i=0;i<element.childSettings.length;i++){
				element.childSettings[i].selectedIndex = 0;
				element.childSettings[i].disabled = true;
				if(element.config){
					this.state[element.config.id] = false;
				}
			}
		}
	},
	reloadOldPrice: function(){
		if ($('old-price-'+this.config.productId)) {

			var price = parseFloat(this.config.oldPrice);
			for(var i=this.settings.length-1;i>=0;i--){
				var selected = this.settings[i].options[this.settings[i].selectedIndex];
				if(selected.config){
					price+= parseFloat(selected.config.price);
				}
			}
			if (price < 0)
				price = 0;
			price = this.formatPrice(price);

			if($('old-price-'+this.config.productId)){
				$('old-price-'+this.config.productId).innerHTML = price;
			}

		}
	}
};

Product.DownloadableAcp = Class.create();
Product.DownloadableAcp.prototype = {
	config : {},
	initialize : function(config){
		optionsPrice.containers[0] = 'product-price-' + optionsPrice.productId + '_clone';
		optionsPrice.containers[4] = 'product-price-' + optionsPrice.productId + '_clone';
		this.config = config;
		this.reloadPrice();
	},
	reloadPrice : function(){
		var price = 0;
		var configNew = this.config;
		$$('.product-downloadable-link-acp').each(function(elm){
			if (configNew[elm.value] && elm.checked) {
				price += parseFloat(configNew[elm.value]);
			}
		});
		try {
			var _displayZeroPrice = optionsPrice.displayZeroPrice;
			optionsPrice.displayZeroPrice = false;
			optionsPrice.changePrice('downloadableAcp', price);
			
			optionsPrice.reload();
			optionsPrice.displayZeroPrice = _displayZeroPrice;
		} catch (e) {

		}
	}
};

/**************************** SIMPLE PRODUCT ********************************/
Product.ACPsimple = Class.create();
Product.ACPsimple.prototype = {
	initialize: function(config) {
		optionsPrice.containers[0] = 'product-price-' + optionsPrice.productId + '_clone';
		optionsPrice.containers[4] = 'product-price-' + optionsPrice.productId + '_clone';
	}
};

function validateDownloadableCallback(elmId, result) {
	var container = $('downloadable-links-list');
	if (result == 'failed') {
		container.removeClassName('validation-passed');
		container.addClassName('validation-failed');
	} else {
		container.removeClassName('validation-failed');
		container.addClassName('validation-passed');
	}
};
