function focusInput(defaultText, inputElement) {
	inputElement.style.color = '#000000';
	if (inputElement.value==defaultText) {
		inputElement.value = '';
	}
}
function blurInput(defaultText, inputElement) {
	inputElement.style.color = '#4B4B4B';
	if (inputElement.value.length<1) {
		inputElement.value = defaultText;
	}
}

if ((typeof Steradian) == 'undefined') {
  var Steradian = {};
}

Steradian.money = function(price) {
  var amount = price.toFixed(2).toString();  
  if( amount.match(/^\.\d+/)) {amount = "0" + amount; }
	return "$" + amount;
	
}

Steradian.Product = function(json) {
	if((typeof json) != 'undefined') { this.update(json); }
};

Steradian.Product.prototype.update = function(json) {
	for(property in json) {
		this[property] = json[property];
	}
};

Steradian.Product.prototype.getVariant = function(id) {
	for(var i = 0; i < this.variants.length; ++i) {
		var variant = this.variants[i];
		if(variant.id == id) {
			if((typeof variant.update) == 'undefined') {
				variant = new Steradian.Variant(variant);
				variant.quantity = this.quantity || 1;
				this.variants[i] = variant;
			}
			return variant;
		}
	}
};

Steradian.Variant = function(json) {
	if((typeof json) != 'undefined') { this.update(json); }
}

Steradian.Variant.prototype.update = function(json) {
	for(property in json) {
		this[property] = json[property];
	}
};

Steradian.Variant.prototype.skuContent = function() {
	if( !this.sku || this.sku.match(/^\s*$/)) {
		return '';
	} else {
		return "Item #" + this.sku;
	}
};

Steradian.Variant.prototype.priceContent = function() {
	return Steradian.money(this.price * this.quantity);
};

Steradian.Variant.prototype.compareAtPriceContent = function() {
	if(this.compare_at_price) {
		return "MSRP: <del>" + Steradian.money(this.compare_at_price * this.quantity) + "</del>";
	} else {
		return "";
	}
};

Steradian.Variant.prototype.leadTimeContent = function() {
	if( this.available ) {
		if( this.inventory_tracked ) {
			return this.stock_status + ", usually ships in " + this.lead_time;
		}
	} else {
		return "Currently unavailable, please check back soon.";
	}
	
	return '';
};

Steradian.ProductForm = function(options) {
	this.selectInput = $(options.selectInput || "variant_select");
	this.skuElement = $(options.skuElement || "variant_sku");
	this.priceElement = $(options.priceElement || "variant_price");
	this.compareAtPriceElement = $(options.compareAtPriceElement || "variant_compare_at_price");
	this.leadTimeElement = $(options.leadTimeElement || "variant_lead_time");
	this.submitInput = $(options.submitInput || "variant_submit");
	if(this.submitInput && this.submitInput.type == 'image') {
		this.enabledSubmitImage = this.submitInput.src;
		this.disabledSubmitImage = this.submitInput.src.replace(/^(.*)(\.[^.]*)$/, '$1_disabled$2');
	}
	
	if((typeof options.product.update) == 'undefined') {
		this.product = new Steradian.Product(options.product);
	} else {
		this.product = options.product;
	}
	
	this.onVariantSelected = (options.onVariantSelected || (function() {}));
	
	var productForm = this;
	this.selectInput.onchange = function() {
		productForm.updateFields();
	}
	this.updateFields();
}

Steradian.ProductForm.prototype.updateFields = function() {
	var variant = this.product.getVariant(this.selectInput.value);
	this.updateField(this.skuElement, variant.skuContent());
	this.updateField(this.compareAtPriceElement, variant.compareAtPriceContent());
	this.updateField(this.priceElement, variant.priceContent());
	this.updateField(this.leadTimeElement, variant.leadTimeContent());
	
	if(this.submitInput) {
		if(variant.available) {
			this.submitInput.disabled = false;
			if(this.enabledSubmitImage) { this.submitInput.src = this.enabledSubmitImage };
		} else {
			this.submitInput.disabled = true;
			if(this.disabledSubmitImage) { this.submitInput.src = this.disabledSubmitImage };
		}
	}
	
	this.onVariantSelected();
};

Steradian.ProductForm.prototype.updateField = function(element, content) {
	if(element) {
		if( content == '' ) {
    	element.style.display = 'none';
		} else {
    	element.style.display = '';
			element.innerHTML = content;
		}
	}
};

Steradian.PackageDealForm = function(options) {
	this.packageDeal = options.packageDeal;
	
	this.undiscountedPriceElement = $(options.undiscountedPriceElement || this.elementIdFor('undiscounted_price'));
	this.discountedPriceElement = $(options.discountedPriceElement || this.elementIdFor('discounted_price'));
	this.discountPercentageElement = $(options.discountPercentageElement || this.elementIdFor('discount_percentage'));
	this.submitInput = $(options.submitInput || this.elementIdFor('submit'));
	if(this.submitInput && this.submitInput.type == 'image') {
		this.enabledSubmitImage = this.submitInput.src;
		this.disabledSubmitImage = this.submitInput.src.replace(/^(.*)(\.[^.]*)$/, '$1_disabled$2');
	}
	
	this.initializing = true;
	this.products = [];
	for(i = 0; i < this.packageDeal.product_quantities.length; ++i) {
		var productQuantity = this.packageDeal.product_quantities[i];
		var product = new Steradian.Product(productQuantity.product);
		product.quantity = productQuantity.quantity;
		product.variantSelectInput = $(this.elementIdFor('variants', product));
		this.products[i] = product;
		new Steradian.ProductForm(this.productFormOptions(product));
	}
	this.initializing = false;
	
	this.updateFields();
};

Steradian.PackageDealForm.prototype.elementIdFor = function(suffix, product) {
	if(product) {
		return "package" + this.packageDeal.id + "_product" + product.id + "_" + suffix;
	} else {
		return "package" + this.packageDeal.id + "_" + suffix;
	}
};

Steradian.PackageDealForm.prototype.productFormOptions = function(product) {
	var packageDealForm = this;
	return {
		'product': product,
		'selectInput': product.variantSelectInput,
		'skuElement': this.elementIdFor('sku', product),
		'priceElement': this.elementIdFor('price', product),
		'compareAtPriceElement': this.elementIdFor('compare_at_price', product),
		'leadTimeElement': this.elementIdFor('lead_time', product),
		'submitInput': this.submitInput,
		'onVariantSelected': function() { packageDealForm.updateFields(); }
	}
};

Steradian.PackageDealForm.prototype.updateFields = function() {
	if(this.initializing) { return; }
	
	var undiscountedPrice = 0.0;
	var allAvailable = true;
	for(i = 0; i < this.products.length; ++i) {
		var product = this.products[i];
		var variant = product.getVariant(product.variantSelectInput.value);
		undiscountedPrice += variant.quantity * variant.price;
		if(!variant.available) { allAvailable = false; }
	}
	var discountedPrice = undiscountedPrice - this.packageDeal.discount;
	var discountPercentage = (this.packageDeal.discount * 100.0 / undiscountedPrice).toFixed(0).toString() + '%';
	
	if(this.undiscountedPriceElement) { this.undiscountedPriceElement.innerHTML = Steradian.money(undiscountedPrice); }
	if(this.discountedPriceElement) { this.discountedPriceElement.innerHTML = Steradian.money(discountedPrice); }
	if(this.discountPercentageElement) { this.discountPercentageElement.innerHTML = discountPercentage; }
	
	if(this.submitInput) {
		if(allAvailable) {
			this.submitInput.disabled = false;
			if(this.enabledSubmitImage) { this.submitInput.src = this.enabledSubmitImage; };
		} else {
			this.submitInput.disabled = true;
			if(this.disabledSubmitImage) { this.submitInput.src = this.disabledSubmitImage; };
		}
	}
};
