


function aq_ajaxtools_process(url, method)
{
	var responseStatus = true;
	var requestMethod = method || 'post';
	
	

	new Ajax.Request(url, {
		method: requestMethod,
		onLoading: function(transport) {
			aq_ajaxtools_showProgress();
			aq_ajaxtools_showEffect(url);
		},

		onComplete: function(transport) {

			var response = transport.responseJSON;

			if (transport.status != 200)
			{
				responseStatus = false;
				aq_ajaxtools_hideProgress();
				return false;
			}
			aq_ajaxtools_parseResponse(response);
			aq_ajaxtools_hideProgress();
			aq_ajaxtools_redefineEvent();
			aq_ajaxtools_hideEffect(url);
			responseStatus = true;
			
			if (checkoutCartUrl && url.search('/go_to_cart') != -1)  {
				window.location = checkoutCartUrl;
			}
		
			
			return false;
		}
	});
	
	return responseStatus;
}

function aq_ajaxtools_parseResponse(response)
{

	if (response == null)
	{
		return;
	}
	
    if (response.redirectUrl) { //redirectUrl use like error flag
      window.location.href = response.redirectUrl;
	  return;
    }
	
    //shopping cart blocks
    if (response.topLinkCart) {
        $$('.top-link-cart').invoke('replace', response.topLinkCart);
        if (response.message && ajaxtoolsEnabledShoppingCartForm) {
            aq_ajaxtools_showMessage('ajaxtools-addtocart-form', response.message);
        }
    }
	// minicart
    if (response.miniCart || response.miniCart == "") {
        $$('div.basket').invoke('replace', response.miniCart);
    }
	// checout cart
    if (response.checkoutCart || response.checkoutCart == "") {
		$$('.cart').invoke('replace', response.checkoutCart);
    }
    //compare blocks
    if (response.compareSideBar || response.compareSideBar == "") {

		$$('.block-compare').invoke('replace', response.compareSideBar);
		decorateList('compare-items');

        if (response.message && ajaxtoolsEnabledCompareForm) {
            aq_ajaxtools_showMessage('ajaxtools-addtocompare-form', response.message);
        }
    }
    if (response.rightReportsProductcCompared || response.rightReportsProductcCompared == "") {
		$$('.block-compared').invoke('replace', response.rightReportsProductcCompared);
		decorateList('recently-compared-items');
    }
}

function aq_ajaxtools_redefineEvent()
{
	/**
	 *  redeclare submit form function on product page
	 *  add product action checkout/cart/add
	 */
	if(typeof productAddToCartForm != 'undefined' && ajaxtoolsEnabledShoppingCart) {
		alert('shop cart');
		productAddToCartForm.submit = function(){
			var params = this.form.serialize();
			var url = this.form.action;
			if(this.validator && this.validator.validate()){
				if (!aq_ajaxtools_process(url + '?' + params  + '&ajaxtools=1')){
					this.form.submit();
				}
			}
			return false;
		}
	}


	/**
	 * redeclare submit form function on shopping cart page
	 * update action checkout/cart/updatePost
	 */
	var shoppingCartTable = $('shopping-cart-table');
	if (shoppingCartTable && ajaxtoolsEnabledShoppingCart) {
		var shoppingCartForm = shoppingCartTable.up('form');
		if(typeof shoppingCartForm != 'undefined'){
			shoppingCartForm.observe('submit', function(event) {
				Event.stop(event);
				var params = Event.element(event).serialize();
				var url = Event.element(event).action;
				if (!aq_ajaxtools_process(url + '?' + params  + '&ajaxtools=1')){
					Event.element(event).submit();
				}
				return false;
			});
		}
	}
	
	/**
	 * get all page link and add redeclare his onclick event
	 *
	 */
	$$('a').each(function(element)
	{

		var url = element.getAttribute('href');
//      var onclickHandler = element.getAttribute('onclick');

		if (url == '#' && ajaxtoolsEnabledShoppingCart)
		{
			var onclickHandler = element.getAttribute('onclick');
			if (
				onclickHandler
				&& typeof onclickHandler == 'string'
				&& onclickHandler != ''
				&& onclickHandler.search('setLocation') != -1
				&& onclickHandler.search('checkout/cart/add') != -1
			) {

				element.stopObserving('click');
				element.observe('click', function(event) {
					Event.stop(event);
				});
			}
		}
		
		
		if (url && ajaxtoolsEnabledShoppingCart
			&& url.search('checkout/cart/delete') != -1)
		{
			element.stopObserving('click');
			element.setAttribute('onclick', '');
			element.observe('click', function(event) 
			{
				Event.stop(event);
				
				if (ajaxtoolsEnabledDeleteCartConfirm) 
				{
					var confirmation = confirm(removeCartItemMessage);
					if(!confirmation) 
						return false;
				}

				aq_ajaxtools_process(url + 'ajaxtools/1', 'get');

				return false;
			});
			return false;
		}
		
		//if enabled compare
		if (url && ajaxtoolsEnabledCompare &&
			(	(url.search('catalog/product_compare/add') != -1)
			 || (url.search('catalog/product_compare/remove') != -1)
			 || (url.search('catalog/product_compare/clear') != -1)
			))
		{
		
			if (url.search('catalog/product_compare/remove') != -1) {
				var elementImage = element.select('img')[0];
				if (elementImage) {
					elementImage.setAttribute('onclick', '');
				}
				element.setAttribute('onclick', '');
			}

			element.stopObserving('click');
			element.observe('click', function(event) 
			{
				Event.stop(event);
				
				var confirmation = true;
				if (ajaxtoolsEnabledDeleteCompareConfirm && url.search('catalog/product_compare/remove') != -1) {
					confirmation = confirm(removeCompareItemMessage);
				}
				else if (ajaxtoolsEnabledDeleteCompareConfirm && url.search('catalog/product_compare/clear') != -1) {
					confirmation = confirm(removeCompareClearMessage);
				}

				if(!confirmation) 
					return false;

				aq_ajaxtools_process(url + 'ajaxtools/1', 'get');
				
				return false;
			});
			
			return false;
		}
	});
}

function aq_ajaxtools_hideProgress()
{
	$('ajaxtools-progress').hide();
	$('ajaxtools-overlay').hide();
}

function aq_ajaxtools_showProgress()
{
    aq_ajaxtools_hideProgress();
	new Effect.Appear($('ajaxtools-overlay'), { duration: 0.5,  to: 0.8 });
	$('ajaxtools-progress').setStyle(aq_ajaxtools_getPosition()).show();
}

function aq_ajaxtools_showEffect(url) {

}



function aq_ajaxtools_hideEffect(url) {
    $('ajaxtools-overlay').hide();
}


function aq_ajaxtools_getPosition()
{
	// 'bottom', 'center'
    switch (messageLocation) {
        case 'top':
            var left = document.viewport.getWidth() / 2 - 100;
            var top = 10;
            break;
        case 'bottom':
            left = document.viewport.getWidth() / 2 - 100;
            top = document.viewport.getHeight() - 150;
            break;
        case 'center':
		default:
            left = document.viewport.getWidth() / 2 - 100;
            top = document.viewport.getHeight() / 2 - 150;
            break;
    }

    //fix IE6 position:fixed
    Prototype.Browser.IE6 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 6;
    if (Prototype.Browser.IE6) {
        top = parseInt(document.documentElement.clientHeight / 2 - 25);
    }
    return {'top': top + 'px', 'left':left + 'px'};

}

function aq_ajaxtools_init()
{

	//append loading progress
    var progress = new Element('div', {'id': 'ajaxtools-progress'});
	progress.hide();
	progress.setOpacity(messageOpacity);
    document.body.appendChild(progress);

	aq_ajaxtools_redefineEvent();

    //add event hide form message
    $$('.ajaxtools-continue-button').each(function(element){
        element.observe('click', function(event) {
            Event.stop(event);
			var el = Event.element(event);
			while(el.tagName != 'A') {
				el = el.up();
			}
            el.up().hide();
            return false;
        });
    });
    $$('.ajaxtools-action-button').each(function(element){
        element.observe('click', function(event) {
            Event.element(event).up().hide();
            return false;
        });
    });
}

document.observe("dom:loaded", function() {
  aq_ajaxtools_init();
});


/**
 * redefine setLocation function
 */
function setLocation(url)
{
	if (url.search('checkout/cart/add') != -1 
		&& aq_ajaxtools_process(url + 'ajaxtools/1', 'get')) {
		//Event.stop();
		return false;
	} 
	else	
		window.location.href = url;
}

function aq_ajaxtools_showMessage(selector, message)
{
    /*
	var element = $(selector);
	element.setStyle(aq_ajaxtools_getPosition());
	element.select('.ajaxtools-message').invoke('update', message);
	element.setStyle('');
	element.setOpacity(0.95);
	element.show();
	*/
}


