/* <!-- AjaxPro --> */

var AjaxPro = function () {

var _config = {
    message       : '',
    location      : 'center',
    opacity       : 0.95,
    overlay       : 0.7,

    hasNoticeForm : 1,

    handles       : [],
    baseUrl       : '',
    secureUrl     : '',
    isMobile      : false
};
var _isMessageShow = false;

function _getPosition()
{
    var scrollOffsets = document.viewport.getScrollOffsets(),
        viewportSize  = document.viewport.getDimensions(),
        left          = viewportSize.width / 2 - 100,
        top;
        
    switch (_config.location) {
        case 'top':
            top = scrollOffsets.top + 10;
            break;
        case 'bottom':
            top = scrollOffsets.top + viewportSize.height - 150;
            break;
        case 'center':
        default:
            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 _showOverlay() {
    var overlay = $('ajaxpro-overlay');
    if (!overlay) {
        return;
    }
    if (_config.isMobile) {
    
        function _scrollOverlay() {
            var scrollOffsets = document.viewport.getScrollOffsets();
            $('ajaxpro-overlay').setStyle({
                top      : scrollOffsets.top + 'px',
                left     : scrollOffsets.left + 'px',
                position : 'absolute'
            });
        }
        AjaxPro.scrollOverlayIntervalId = setInterval(_scrollOverlay, 100);
    }
    overlay.setOpacity(_config.overlay);
    overlay.setStyle({display: 'block'});
}
function _hideOverlay() {
    var overlay = $('ajaxpro-overlay');
    if (!overlay) {
        return;
    }
    overlay.hide();
    if (AjaxPro.scrollOverlayIntervalId) {
        clearInterval(AjaxPro.scrollOverlayIntervalId);
    }
}

return {
    init: function(config) {
        Object.extend(_config, config);

        // 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);
                Event.element(e).up('div').hide();
                _hideOverlay();
                return false;
            });
        });
        $$('.ajaxpro-action-button').each(function(element){
            element.observe('click', function(e) {
                Event.element(e).up('div').hide();
                _hideOverlay();
                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 || {}
        );

        var onComplete = config.onComplete || function(response){
            console.error(response);
        };
        
        var onLoading = config.onLoading || function(){
            console.error('onLoading not set');
        };

        new Ajax.Request(url, {
            parameters: parameters,
            method: requestMethod,
            onLoading: function(transport) {
                _showProgress();
                _showOverlay();
                onLoading();
            },

            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;
                    }
                } else {
                    onComplete(response);
                }
                _hideProgress();
                if (!_isMessageShow) {
                    _hideOverlay();
                }
                
                AjaxPro.addObservers.delay(1); // 1 sec
                return false;
            }
        });
        return responseStatus;
    },
    addObservers: function() {
//        $$('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();
        _isMessageShow = true;
    }, 
    setOpacityEffect: function (selector, opacity) {
        $$(selector).each(function(element){
            element.setOpacity(opacity);
        });
    }
    }
}();
