/**
	@base Panagora.Class
	@constructor
	@author Niklas Bergius
*/
Panagora.ProductView = new (Panagora.Class.create(
/** @lends Panagora.ProductView */
function ProductView() {
	var self = this;
	var productId;
	var currentImage;
	var stdPriceText;
	var addingInProgress;
	
	function init() {
		//$j('#add-to-cart-form').submit(onCartFormSubmit);

		// If you have multiple submits, attach onclick-events instead!
		// Always use onclick event...
		//$j('#add-to-cart-form select.available').click(onSizeClick);
		//$j('#add-to-cart-form button.unavailable').click(onUnavailableClick);
		$j('#add-to-cart-form select#size-select').change(onSizeChange);
		$j('#add-to-cart-form select#size-select').trigger('change');
		$j('#add-to-cart-form').submit(onFormSubmit);
		
		$j('#add-to-cart.done').live('click', function(e){
			location.href = this.getAttribute('panagora:gotocart');
			return false;
		});
		
		$j('.modal').click(CreateAjaxModal);

		// Image switcher
		$j('#image-container li').each(function(index){
			if ($j(this).attr('panagora:zoom') == $j('#image-zoom').attr('href')) {
				currentImage = $j('#image-container li:eq('+index+')');
			}
		});
		$j("#image-container li").click(imageSwitch);
		$j('#primary-image-node, #product-image-swap').click(imageSwitchNext);
		
		if (currentImage.attr('panagora:width') <= 560 || currentImage.attr('panagora:height') <= 560)
			$j("#image-zoom").addClass("dimmed");

		$j("#image-zoom").click(AddImageZoom2);
		Panagora.AddImageZoom("panagora-size-table", {});
		
		// Attach the productId selector on all selects
		$j('.distinct').change(fetchProductId);
		
		// if only one dimension and all sizes are out of stock
		if ($j('.distinct:visible').length == 0 && $j('#selectable-products-container option.available').length == 0) {
			$j('#size-select').hide();
			$j('#add-to-cart').hide();			
			$j('#out-of-stock-legend').show();
		}
		
		// get standard price text
		stdPriceText = $j('p.price').html();
		
		var productListContainer = document.getElementById('token-container');
		if (location.hash) {
			Panagora.ajax({
				url: productListContainer.getAttribute('panagora:src'),
				data: {
					'token': location.hash.substring(1),
					'currentid': productListContainer.getAttribute("panagora:id"),
					'limit': 10
				},
				dataType: 'text',
				success: function (content) {
					if (content) {
						document.getElementById('token-list').innerHTML = content;
						$j('.token-carousel').tokenCarousel();
					} else {
						getDefaultTokenList(productListContainer);
					}
				}
			});
		} else {
			getDefaultTokenList(productListContainer);
		}
	}
	
	function getDefaultTokenList(productListContainer){
		productListContainer.setAttribute('class', 'notoken');
		Panagora.ajax({
			url: productListContainer.getAttribute('panagora:searchdef'),
			data: {
				'partial': 'lastpublished-product',
				'orderby': 'Published',
				'currentid': productListContainer.getAttribute("panagora:id"),
				'limit': 10,
				'skip_layout': 1
			},
			dataType: 'text',
			success: function (content) {
				document.getElementById('token-list').innerHTML = content;
				$j('.token-carousel').tokenCarousel();
			}
		});
	}
	
	function fetchProductId() {
		$j('#color-image-container')
			.attr('panagora:image', '')
			.attr('panagora:zoom', '');
		
		if (this.selectedIndex == 0) {
			productId = 0;
			$j('#selectable-products-container').hide();
			return;
		}

		var distincts = $j('.distinct', this.form);
		var products = [];
		
		for (var i = 0; i < distincts.length; i++) {
			if (productMatrix[distincts[i].name][distincts[i].value]) {
				var selectedProducts = productMatrix[distincts[i].name][distincts[i].value].clone();
				products.push(selectedProducts);
			} else if (distincts[i].value == 0) {
				var selectedProducts = [];
				for (tmp in productMatrix[distincts[i].name]) {
					selectedProducts = selectedProducts.concat(productMatrix[distincts[i].name][tmp].clone());
				}
				products.push(selectedProducts);
			} else return;
		}
		
		// This is brokezor... FIX!
		var first = products.pop();
		var temp = [];
		if (first) {
			temp = first;
			while(el = products.pop()) {
				temp = temp.intersect(el);
			}
			
			if (temp.length > 0 && temp[0]) {
				// Show the buttons that is included in the array
				showActiveProducts(temp);
			} 
		}
		
		var selectedOption = $j('option:eq(' + this.selectedIndex + ')', this);
		
		// does selected property have an image?
		if (selectedOption.attr('panagora:image') && selectedOption.attr('panagora:image') != '') {
			$j('#color-image-container')
				.attr('panagora:image', selectedOption.attr('panagora:image'))
				.attr('panagora:zoom', selectedOption.attr('panagora:zoom'));
			
			// show property image
			$j('#color-image-container').click();
		} else if ($j('#image-container li:eq(0)').length > 1) {
			// show first image
			$j('#image-container li:eq(0)').click();
		}
	}
	
	function showActiveProducts(productIds) {
		
		var productId;
		var sizeInStock = false;
		
		$j('select[name=productId] option').hide();
		
		
		while (productId = productIds.pop()) {
			var input = $j('#product-' + productId);
			input.show();
			sizeInStock = input.is('.available') || sizeInStock;
		}
		
		// reset price text
		$j('p.price').html(stdPriceText);

		// console.log(sizeInStock)

		if (!sizeInStock) {			
			$j('#selectable-products-container #size-select').hide();
			$j('#selectable-products-container legend#out-of-stock-legend').css('display', 'block');
		} else {
			$j('#selectable-products-container #size-select').show();
			$j('#selectable-products-container legend#out-of-stock-legend').css('display', 'none');
		}
		
		// show button container
		$j('#selectable-products-container').show();
	}
	
	function onUnavailableClick() {
		Panagora.alert('@{SIZE_UNAVAILABLE}');
		return false;
	}
	
	function onSizeChange(e) {
		e.preventDefault();
		
		if (addingInProgress)
			return;
		
		// Remove any selected options
		$j("#add-to-cart-form #size-select option").removeClass("selected");
		
		// Selected the one you changed to.
		var option = $j(this).children('[selected]');

		if (option.val() != 0) {
			option.addClass("selected");

			productId = option.attr('panagora:value');
			
			// show specific price
			var priceText = $j('<span class="pricevalue"></span>')
				.append(option.attr('panagora:price'));
			
			$j('p.price').html(
				option.attr('panagora:isonsale') == 'False'
					? ''
					: '<strike>' + option.attr('panagora:originalprice') + '</strike> '
			);
			
			$j('p.price').append(priceText);
			
			// Switch image on the submit-image to the highlighted one.
			enableAddButton();
		} else {
			disableAddButton();
		}
	}

	function onFormSubmit(e) {
		if (productId > 0) {
			$j('#add-to-cart').get(0).disabled = true;
			Panagora.post({
				url: this.action,
				data: {
					id: productId,
					partial: 'cart-summary'
				},	
				dataType: 'html', 
				success: cartAddSuccess,
				error: cartAddFailure
			});

			addingInProgress = true;
		} else {
			Panagora.alert('@{PLEASE_SELECT_SIZE}');
		}
		
		return false;
	}
	
	function cartAddSuccess(response) {
		if (Panagora.CartComponent && Panagora.CartComponent.refresh)
			Panagora.CartComponent.refresh(response);
		showGoToCheckout();
		addingInProgress = false;
	}
	
	function showGoToCheckout() {
		$j('#add-to-cart')
			.removeClass('nocursor')
			.removeClass('active')
			.addClass('done')
			.attr('disabled', false);
	}
	
	function enableAddButton() { 
		$j('#add-to-cart')
			.removeClass('nocursor')
			.removeClass('done')
			.addClass('active')
			.attr('disabled', false);
	}
	
	function disableAddButton() { 
		$j('#add-to-cart')
			.removeClass('done')
			.removeClass('active')
			.addClass('nocursor')
			.attr('disabled', true);
	}

	function cartAddFailure(response) {
		var json = eval('(' + response.responseText + ')');
		Panagora.errorAlert(json.Status);
		$j('#add-to-cart').get(0).disabled = false;
		addingInProgress = false;
	}
	
	function imageSwitch() {
		currentImage = $j(this);
		if (currentImage.attr('panagora:width') <= 560 || currentImage.attr('panagora:height') <= 560)
			$j("#image-zoom").addClass("dimmed");
		else
			$j("#image-zoom").removeClass("dimmed");

		var imageURL = this.getAttribute('panagora:image');
		var zoomURL = this.getAttribute('panagora:zoom');
		var imageHeight = this.getAttribute('panagora:height');
		var imageWidth = this.getAttribute('panagora:width');
		document.getElementById("primary-image-node").src = imageURL;
		document.getElementById("primary-image-node").setAttribute('panagora:height', imageHeight);
		document.getElementById("primary-image-node").setAttribute('panagora:width', imageWidth);
		document.getElementById("image-zoom").href = zoomURL;
	}
	
	function imageSwitchNext() {
		var next = currentImage.next('li');
		if (!next.length || next.attr('panagora:image') == '')
			next = $j('#image-container li:eq(0)');
		
		if (next.attr('panagora:image') != '')	
			next.click();
	}

	var modalWindow;
	var img;
	var toggleElement;

	function AddImageZoom2(e) {
		e.preventDefault();
		
		toggleElement = currentImage;
		// console.log(currentImage);

		// set options
		var options = {
			width: 0,
			height: 0,
			callbacks: {
				hide: function() {
					modalWindow.ShutDown();
				}
			}
		};

		if (currentImage.attr('panagora:width') > 560 || currentImage.attr('panagora:height') > 560) {
			// create window
			modalWindow = new Panagora.ModalWindow(options);
			
			// create image element
			var image = $j('<img src="/static/images/wait.gif" style="padding: 25px" />').get(0);
	
			// load progress animation
			modalWindow.SetContent(image);
			// show window
			modalWindow.Show();
			
			// load big image (with some insane IE workarounds)
			var imgObj = new Image();
			imgObj.onload = function () {
				img = $j('<img/>').load(function () {
					var dims = {
						height: imgObj.height,
						width: imgObj.width
					};
					
					if (dims.width && dims.height) {
						modalWindow.SetOptions(dims);
					}
					
					$j(img).click(function() {
						modalWindow.ShutDown();
					}); // click to close
			
					// add image
					modalWindow.SetContent(img);
				});
				img.attr('src', imgObj.src);
			}
			imgObj.src = toggleElement.attr('panagora:zoom');
		} else {
			
		}
		return false;
	}

	var modalWindow;
	var isVisible = false;
	
	function CreateAjaxModal(e) {
		e.preventDefault();

		var options = {
			width: 700,
			vMargin: 30,
			callbacks: {
				hide: function() {
					modalWindow.ShutDown();
				}
			}
		};

		modalWindow = new Panagora.ModalWindow(options);

		self.log(this.href);
		$j.get(this.href+'?layout=modal', {}, function(data) {
			// load progress animation
			modalWindow.SetContent(data);
			// show window
			modalWindow.Show();
		});
	}

	// init on dom ready
	Panagora.ready(init);

}))();

// Intersect prototype
Array.prototype.intersect = function (arr) {
	var primary = this.length <= arr.length ? this : arr;
	var secondary = this.length <= arr.length ? arr : this;
	
	var output = [];
	for (var i = 0; i < primary.length; i++) {
		if (secondary.indexOf(primary[i]) > -1) {
			output.push(primary[i]);
		}
	}
	return output;
}

Array.prototype.clone = function () {
	var clone = [];
	for (var i = 0; i < this.length; i++) {
		clone.push(this[i]);
	}
	
	return clone;
}

// Prototype an indexOf-method for IE...
if(!Array.indexOf){
    Array.prototype.indexOf = function(obj){
        for(var i=0; i<this.length; i++){
            if(this[i]==obj){
                return i;
            }
        }
        return -1;
    }
}
