function ajaxcart(url) {
	//Deve ser feito antes do dialogo ser exibido pois ao exibir o novo dialogo,
	//o anterior (com o form de opcoes, no caso de produtos configuraveis) e fechado
	var productOptions = parseProductOptions(); 
	
	showDialog("Processando", "Atualizando seu Carrinho...", undefined, true, false);
	var retorno = $j.ajax({
				url: url,
				type: "post",
				async: false,
				data: productOptions
			});

	retorno = $j.parseJSON(retorno.responseText);
	
	switch (retorno.result) {
		case 0: //Nenhum erro
			showDialog("Carrinho Atualizado", retorno.message, "success-msg", false, true);
			updateSidebarCart(retorno.sidebar_cart_html);
			updateCart(retorno.checkout_cart_html);
			updateCartTotals(retorno.totals_cart_html);
			updateWishlist(retorno.wishlist_html);
			updateCartCrosssell(retorno.crosssell_cart_html);		
			updateTopLinks(retorno.top_links_html);	
			break;
		case 1: //Falha
			showDialog("Erro", retorno.message, "error-msg", false, true);
			break;
		case 2: //Faltando configuracoes do produto
			//self.location = retorno.redirect_url;
			var url = url.replace('add', 'configure');
			configureProduct(url, true);
		break;
	}
}

function configureProduct(url, forceConfig) {
	var forceConfig = typeof(forceConfig) != 'undefined' ? forceConfig : false;
	showDialog("Processando", "Carregando as Opções do Produto..", undefined, true, false);
	var retorno = $j.ajax({
				url: url,
				type: "post",
				async: false,
				cache: false,
			});
	
	// DW
	//alert(retorno.responseText);
	
	retorno = $j.parseJSON(retorno.responseText);
	
	if (retorno.showconfiguration || forceConfig) {
		//$j("#dialog-modal").html(retorno.configform);		
		showDialog("Configure o seu Produto", retorno.configform, undefined, false, false, true);
		fixConfigButtons(url.replace('configure', 'add'));
	}
	else {
		//Postar o produto sem configurar
		if($j('#product_addtocart_form')){
			$j('#product_addtocart_form').remove();
		}
		$j("body").append(retorno.configform); //Insere o codigo no body
		$j('#product_addtocart_form').hide();
		
		ajaxcart(url.replace('configure', 'add'));
	}
}

//Varre a pagina procurando o formulário de opcoes do produto (bundle)
//E prepara os dados do mesmo para envio via POST
function parseProductOptions() {
	return $j('#product_addtocart_form').serialize();
}

function updateSidebarCart(html) {
	if (options.ajaxcart.areas.search("sidebar_cart") > -1) {
		$j(options.ajaxcart.sidebar_cart.name).fadeOut("slow", function () {
			$j(options.ajaxcart.sidebar_cart.name).replaceWith(html);
			$j(options.ajaxcart.sidebar_cart.name).hide();
			$j(options.ajaxcart.sidebar_cart.name).fadeIn("slow");
			fixRemoveButtons();
		});		
	}
}

function updateCart(html) {
	if (options.ajaxcart.areas.search("cart") > -1) {
		$j(options.ajaxcart.cart.name).fadeOut("slow", function () {
			$j(options.ajaxcart.cart.name).replaceWith(html);
			$j(options.ajaxcart.cart.name).hide();
			$j(options.ajaxcart.cart.name).fadeIn("slow");
			fixRemoveButtons();
		});
	}
}

function updateCartTotals(html) {
	if (options.ajaxcart.areas.search("cart_totals") > -1) {
		$j(options.ajaxcart.cart_totals.name).fadeOut("slow", function () {
			$j(options.ajaxcart.cart_totals.name).replaceWith(html);
			$j(options.ajaxcart.cart_totals.name).hide();
			$j(options.ajaxcart.cart_totals.name).fadeIn("slow");
		});		
	}
}

function updateCartCrosssell(html) {
	if (options.ajaxcart.areas.search("cart_crosssell") > -1) {
		$j(options.ajaxcart.cart_crosssell.name).fadeOut("slow", function () {
			$j(options.ajaxcart.cart_crosssell.name).replaceWith(html);
			$j(options.ajaxcart.cart_crosssell.name).hide();
			$j(options.ajaxcart.cart_crosssell.name).fadeIn("slow");
			fixAddButtons();
		});			
	}
}

function updateWishlist(html) {
	if (options.ajaxcart.areas.search("wishlist") > -1) {
		$j(options.ajaxcart.wishlist.name).fadeOut("slow", function () {
			$j(options.ajaxcart.wishlist.name).html(html);
			$j(options.ajaxcart.wishlist.name).hide();
			$j(options.ajaxcart.wishlist.name).fadeIn("slow");
		});
	}
}

function updateTopLinks(html) {
	if (options.ajaxcart.areas.search("header_links") > -1) {
		$j(options.ajaxcart.header_links.name).fadeOut("slow", function () {
			$j(options.ajaxcart.header_links.name).replaceWith(html);
			$j(options.ajaxcart.header_links.name).hide();
			$j(options.ajaxcart.header_links.name).fadeIn("slow");
		});
	}
}

function showDialog(titulo, message, decoration, spinner, buttons, configure) {
	$j("#dialog-modal").dialog("destroy");
	var titulo = typeof(titulo) != 'undefined' ? titulo : titulo_dialog;
	var message = typeof(message) != 'undefined' ? message : mensagem_dialog;
	var decoration = typeof(decoration) != 'undefined' ? " class='" + decoration + "'" : "";
	var spinner = typeof(spinner) != 'undefined' ? spinner : false;
	var buttons = typeof(buttons) != 'undefined' ? buttons : false;
	var configure = typeof(configure) != 'undefined' ? configure : false;
	
	if (spinner) { message = message + " <img src='" + spinner_url + "' />"; }
	$j("#dialog-modal").html("<p" + decoration + ">" + message + "</p>");
	
	if (buttons) {
		$j("#dialog-modal").dialog({
			modal: true, 
			title: titulo,
			resizable: false,
			draggable: false,
			close: function(event, ui) { $j(this).dialog("destroy"); },
			buttons: {
				OK: function() {
					$j(this).dialog("close");
				},
				"Ir para o Carrinho": function () {
					self.location = "/checkout/cart";
				}
			}
		});			
	}
	else {
	}
		$j("#dialog-modal").dialog({
			modal: true, 
			title: titulo,
			resizable: false,
			draggable: false,
			close: function(event, ui) { $j(this).dialog("destroy"); }
		});
		
	if (configure) {
		//Configuracoes especificas para o dialogo de config de produto
		$j("#dialog-modal").dialog({
			resizable: false,
			draggable: false,
			width: 600,
			height: 400,
			position: ['top', 'left']
		});
	}
}

function fixRemoveButtons() {
	$j(options.ajaxcart.buttons.remove).each(
		function(i, item) { 
			var oldurl = $j(item).attr("href");
			if (oldurl.search('wishlist') > -1) { return; } //Caso seja um botao de remoçao da wishlist, não execute o JS
			var newurl = oldurl.replace("checkout", "ajaxcart");
			newurl = newurl.replace(/uenc\/.*?\//, ""); //replace do UENC
			$j(item).removeAttr('onclick');
			$j(item).unbind('click');
			$j(item).click(
				function() {
					ajaxcart(newurl);
					return false;
				}
			);
		}
	);
}

function fixConfigButtons(url) {
	var buttons = options.ajaxcart.buttons.add.split(',');
	for (var i = 0; i < buttons.length; i++) {
		$j('#dialog-modal ' + buttons[i]).removeAttr('onclick');
		$j('#dialog-modal ' + buttons[i]).unbind('click');
		$j('#dialog-modal ' + buttons[i]).click(
			function() {
				ajaxcart(url);
				return false;
			}
		);			
	}
}

function fixAddButtons() {
	$j(options.ajaxcart.buttons.add).each(
		function(i, item) {
			var url = $j("#product_addtocart_form").attr("action");
			if (url == undefined) {
				//Nao estamos na pagina do produto
				url = $j(item).attr("onclick") + "";
				url = url.match(/["|'](.*?)["|']/);
				url = url[1];
			}			
			if (url.match(/options\=cart/im) == null && 
				self.location.href.match(/options\=cart/im) == null &&
				$j('#super-product-table').length < 1) { //Estamos em um produto simples
				url = url.replace("wishlist/index/cart", "ajaxcart/cart/wishlist"); //replace para urls da wishlist
				url = url.replace("checkout", "ajaxcart"); //replace para as outras urls
				//url = url.replace(/uenc\/.*?\//, ""); //replace do UENC
				$j(item).removeAttr('onclick');
				$j(item).unbind('click');
				$j(item).click(
					function() {
						ajaxcart(url);
						return false;
					}
				);
			}
			else { //Estamos em um produto composto (pacote)
				//TODO: Validar as urls de wishlist
				url = url.replace("add", "configure"); //replace para as outras urls
				url = url.replace("checkout", "ajaxcart"); //replace para as outras urls
				$j(item).removeAttr('onclick');
				$j(item).unbind('click');
				$j(item).click(
					function() {
						configureProduct(url);
						return false;
					}
				);
			}
		}
	);
}

$j(function() {
	/*mensagem_dialog = "Adicionando ao carrinho...";
	titulo_dialog = "Processando"; */
	
	options = $j.ajax({
				url: "/ajaxcart/cart/options",
				type: "post",
				async: false,
			});	
	options = $j.parseJSON(options.responseText);
	spinner_url = options.skin_url + "/images/opc-ajax-loader.gif";
	$j("body").append('<div id="dialog-modal" title=""></div>');
	$j("#dialog-modal").hide();
	fixRemoveButtons();
	fixAddButtons();
})

