/* <!-- AjaxPro --> */
function toggleMenu(el, over)
{
    if (over) {
        Element.addClassName(el, 'over');
    }
    else {
        Element.removeClassName(el, 'over');
    }
}

var AjaxPro = function () {

var _config = {
    message: '',
    location: 'center',
    opacity: 0.95,
    overlay: 0.7,

    hasNoticeForm: 1,

    handles : [],
    baseUrl: '',
    secureUrl: ''
};

function _getPosition()
{
    var scrollOffsets = document.viewport.getScrollOffsets(),
        viewportSize  = document.viewport.getDimensions(),
        left          = viewportSize.width / 2 - 100;

    switch (_config.location) {
        case 'top':
            var top = scrollOffsets.top + 10;
            break;
        case 'bottom':
            var top = scrollOffsets.top + viewportSize.height - 150;
            break;
        case 'center':
        default:
            var top = scrollOffsets.top + viewportSize.height / 2 - 150;
            break;
    }
    return {
        top : top + 'px',
        left: left + 'px'
    };
}
function _hideProgress()
{
    $('ajaxpro-spinner').hide();
}
function _showProgress()
{
    _hideProgress();
    $('ajaxpro-spinner').setStyle(_getPosition()).show();
}
function _showEffect(url) {
    var overlay = $('ajaxpro-overlay');

    if (null !== overlay) {
        AjaxPro.scrollOverlayIntervalId = setInterval(scrollOverlay, 100);
        overlay.setOpacity(_config.overlay);
        overlay.setStyle({display: 'block'});
    }
    var cssClass = false;
    if (url.search('/checkout/cart') != -1) {
        cssClass = '.block-cart';
    }
    if (url.search('/catalog/product_compare') != -1) {
        cssClass = '.block-compare';
        $$('.block-compared').each(function(element){
            element.setOpacity(0.5);
        });
    }
    if (url.search('/wishlist/index') != -1) {
        cssClass = '.block-wishlist';
    }
    if (cssClass) {
        $$(cssClass).each(function(element){
            element.setOpacity(0.5);
        });
    }
}
function _hideEffect(url) {

    var overlay = $('ajaxpro-overlay');
    if (null !== overlay) {
        overlay.hide();
        clearInterval(AjaxPro.scrollOverlayIntervalId);
    }

    var cssClass = false;
    if (url.search('/checkout/cart') != -1) {
        cssClass = '.block-cart';
    }
    if (url.search('/catalog/product_compare') != -1) {
        cssClass = '.mini-compare-products';
    }
    if (url.search('/wishlist/index') != -1) {
        cssClass = '.mini-wishlist';
    }

    if (cssClass) {
        $$(cssClass).each(function(element){
            element.setOpacity(1);
        });
    }
}
function scrollOverlay() {
    var scrollOffsets = document.viewport.getScrollOffsets();
    $('ajaxpro-overlay').setStyle({
        top : scrollOffsets.top + 'px',
        left: scrollOffsets.left + 'px'
    });
}

return {
    init: function(config) {
        Object.extend(_config, config);
    },
    onReady: function() {
        // add interceptor functional
        Function.prototype.interceptor = function(fcn, scope){
            var method = this;
            return (typeof fcn !== 'function') ?
                    this :
                    function() {
                        var me = this,
                            args = arguments;
                        fcn.target = me;
                        fcn.method = method;
                        return (fcn.apply(scope || me || window, args) !== false) ?
                                method.apply(me || window, args) :
                                null;
                    };
        }
//        @todo test bug fix for ie9
//        // ie9 fix
//        Event.stop = Event.stop.interceptor(function(){
//            if (typeof event != 'undefined') {
//                event.preventDefault ? event.preventDefault() : event.returnValue = false;
//            }
//            return true;
//        });
        //add loading spinner
        var spinner = new Element('div', {'id': 'ajaxpro-spinner'});
        spinner.update('<p class="ajaxpro-message">' + _config.message + '</p>');
        document.body.appendChild(spinner.hide().setOpacity(_config.opacity));

        //add event hide form message
        $$('.ajaxpro-continue-button').each(function(element){
            element.observe('click', function(e) {
                if (typeof event != 'undefined') { // ie9 fix
                    event.preventDefault ? event.preventDefault() : event.returnValue = false;
                }
                Event.stop(e);
                var el = Event.element(e);
                // while(el.tagName != 'A') {
                //     el = el.up();
                //}
                el.up('div').hide();
                var overlay = $('ajaxpro-overlay');
                if (null !== overlay) {
                    overlay.hide();
                }

    //          Event.element(event).up().addClassName('no-display');
                return false;
            });
        });
        $$('.ajaxpro-action-button').each(function(element){
            element.observe('click', function(event) {
                Event.element(event).up().hide();
                return false;
            });
        });
        
        AjaxPro.addObservers();
    },
    /**
     * url, method, parameters, onComplete
     *
     * request function
     */
    request :function (config)
    {
        var url = config.url;
        var responseStatus = true;
        var requestMethod = config.method || 'post';

        var currentUrl = window.location.href;
        var isBaseUrl = (0 === currentUrl.indexOf(_config.baseUrl));
        var isRequestBaseUrl = (0 === url.indexOf(_config.baseUrl));
        if (isBaseUrl && !isRequestBaseUrl) {
            url = url.replace(_config.secureUrl, _config.baseUrl);
        } else if (!isBaseUrl && isRequestBaseUrl) {
            url = url.replace(_config.baseUrl, _config.secureUrl);
        }

        if (typeof JSON == 'object') {
            var handles = JSON.stringify(_config.handles);
        } else if (typeof _config.handles.toJSON === "function") {
            var handles = _config.handles.toJSON();
        } else {
            var handles = "[",
                length = _config.handles.length;

            _config.handles.each(function(el, i) {
                handles += '"' + el + '"';
                if (i < length - 1) {
                    handles += ',';
                }
            });
            handles += "]";
        }

        var parameters = Object.extend(
            {handles:handles, ajaxpro:1}, config.parameters || {}
        );

        onComplete = config.onComplete || function(response){
            console.error(response);
        };

        new Ajax.Request(url, {
            parameters: parameters,
            method: requestMethod,
            onLoading: function(transport) {
                _showProgress();
                _showEffect(url);
            },

            onComplete: function(transport) {
                var response = transport.responseJSON;
                if (200 != transport.status) {
                    responseStatus = false;
                    _hideProgress();
                    return false;
                }

                if (response == null) {
                    //window.location.reload();
                }

                if (response.redirectUrl) { //redirectUrl use like error flag :(((
                    if (_config.hasNoticeForm && response.message) {
                        AjaxPro.showMessage('ajaxpro-notice-form', response.message);
            //            $('ajaxpro-notice-form').select('.ajaxpro-action-button').each(function(element){
            //                element.setAttribute('href', response.redirectUrl);
            //            });
                    } else {
                        if(response.message.length)
                        {
                            alert(response.message)
                        };
                        window.location.href = response.redirectUrl;
                    }
                }
                onComplete(response);

                _hideProgress();
                _hideEffect(url);
                
                AjaxPro.addObservers();
                return false;
            }
        });
        return responseStatus;
    },
    addObservers: function(elements){
//        $$('body').first().stopObserving("ajaxpro:observe");
        $$('body').first().fire("ajaxpro:fire");
    },
    showMessage: function (id, message)
    {
        message = message || '';
        var element = $(id);
        element.setStyle(_getPosition());
        element.select('.ajaxpro-message').invoke('update', message);
    //  element.removeClassName('no-display')
        element.setStyle('');
        element.setOpacity(_config.opacity);
        element.show();
    }
    }
}();

