// var jQuery, window, document, _l, $, console, 
// , b, 
var say = function () {
    'use strict';
    var i;
    if (typeof (console) === 'object') {
        for (i = 0; i < arguments.length; i++) {
            console.log(arguments[i]);
        }
    }
    return true;
};
var _base_cache;
var base = function (url) {
    'use strict';
    if (_base_cache === undefined) {
        _base_cache = $('base').attr('href');
    }
    if (url === null) {
        return _base_cache;
    } else {
        return _base_cache + url.replace(/^\//, '');
    }
};
var L = function (identifier) {
        'use strict';
        return (_l[identifier] || identifier);
    };
var lang = L;

(function ($) {
    'use strict';
    
    var fixDialogPosition = function(e) {
        var $dialog = $(e.target).closest('.ui-dialog');
        var offs = $dialog.offset();

        $dialog.css({
            left: '50%',
            top: '50px',
            'margin-left': -($dialog.width() / 2)
        });
        $('html').scrollTop(0);
    };

    $.ajaxSetup({
        scriptCharset: "utf-8",
        contentType: "application/x-www-form-urlencoded; charset=UTF-8"
    });

    $.widget("ui.xaxosReload", {

        options: {
            success: null,
            complete: null,
            clickBefore: null,
            clickAfter: null
        },

        handler: function () {
            this._handler();
        },

        _create: function () {
            this._handler();
        },

        _handler: function () {
            var $this = this;
            $this.element
                .find('a.xaxos-reload')
                .click(function (e) {
                    e.preventDefault();
                    var $thisLink = $(this);
                    //say('CLICK in searchresult');

                    if (typeof $this.options.clickBefore === 'function') {
                        $this.options.clickBefore(e, $thisLink, $this);
                    }

                    $.ajax({
                        url: $thisLink.attr('href'),
                        type: 'GET',
                        dataType: 'html',
                        success: function (data, textStatus, jqXHR) {
                            $this.element
                                .html(data)
                                .xaxosReload('handler');
                            if (typeof $this.options.success === 'function') {
                                $this.options.success(data, textStatus, jqXHR);
                            }
                        },
                        complete: function (jqXHR, textStatus) {
                            if (typeof $this.options.complete === 'function') {
                                $this.options.complete(jqXHR, textStatus);
                            }
                        }
                    });

                    if (typeof $this.options.clickAfter === 'function') {
                        $this.options.clickAfter(e, $thisLink, $this);
                    }

                });
        }
    });




    /*
     * xaxosController
     * 
     * Important note:
     * a method xaxosControllerHandler is required:
     * 
     * $.xaxosControllerHandler(content) {
     *         content.find(somewhat).doSomeThing(...);
     *         ...
     * }
     */
    $.widget("ui.xaxosController", {
        load: function () {
            this._load(this.element);
        },

        _execute: function () {
            var _data = this.element.data('ajax');
            var _url = this.element.attr('href');

            if (_url.indexOf('?') !== -1) {
                _url = _url.split('?');
                _url = _url[0] + '_xhr?' + _url[1];
            } else {
                _url = _url + '_xhr';
            }
            $.ajax({
                url: _url,
                type: (_data) ? 'POST' : 'GET',
                data: _data,
                dataType: 'text',
                success: function (data, textStatus, jqXHR) {
                    if (jqXHR.status === 200) {
                        var contentType = jqXHR.getResponseHeader('Content-Type');
                        $.xaxosControllerAction($.parseJSON(data));
                    }
                }
            });
        },

        _load: function () {
            var $this = this;

            if ($this.element.hasClass('check-dirty')) {
                var dirtyElements = $('.dirty');
                if (dirtyElements.length === 0) {
                    $this._execute();
                } else {
                    $.xaxosConfirm({
                        question: lang('Discard changes?'),
                        success: function () {
                            $this._execute();
                        }
                    });
                }
            } else {
                $this._execute();
            }
        },

        _create: function () {
            var $this = this;

            this.element.click(function (e) {
                e.stopPropagation();
                e.preventDefault();
                $this._load();
            });
        }
    });

    $.extend({
        xaxosConfirm: function (params) {
            var titleLabel = params.titleLabel || lang('Question');
            var okLabel = params.okLabel || lang('Yes');
            var cancelLabel = params.cancelLabel || lang('No');

            if ((params.question !== '') && (params.success) && (typeof params.success === 'function')) {
                var content = $('<div><div style="padding: 10px;">' + params.question + '</div></div>');
                content.dialog({
                    title: titleLabel,
                    modal: true,
                    width: 400,
                    resizable: false,
                    buttons: [
                        { text: okLabel, click: function () { params.success(); $(this).dialog('close'); }},
                        { text: cancelLabel, click: function () { $(this).dialog('close'); }}
                    ],
                    open: fixDialogPosition
                });
            } else {
                $.xaxosAlert({
                    title: 'Error',
                    content: 'xaxosConfirm is not configured correctly.'
                });
            }
        },
        xaxosAlert: function (params) {
            if ((params.title !== '') && (params.content !== '')) {
                var content = $('<div><div style="padding: 10px;">' + params.content + '</div></div>');
                content.dialog({
                    title: params.title,
                    modal: true,
                    resizable: false,
                    width: 400,
                    buttons: [
                        { text: lang('Ok'), click: function () { $(this).dialog('close'); }}
                    ],
                    open: fixDialogPosition
                });
            }
        },
        xaxosControllerAction: function (data) {
            //say(data);
            var i;
            var _gaq = _gaq || [];
            $('.dialog').dialog('close');
            if ((data.error === null) || (data.error === undefined)) {
                if (data.actions.length > 0) {
                    for (i = 0; i < data.actions.length; i++) {
                        var _target, $action = data.actions[i];
                        switch ($action.action) {
                        case 'append':
                            var _doAppend = function (data) {
                                var $content = $(data);
                                $($action.target).append($content);
                                $.xaxosControllerHandler($content);
                            };
                            if ($action.url) {
                                $.ajax({
                                    url: $action.url,
                                    type: 'GET',
                                    dataType: 'html',
                                    success: function (data, textStatus, jqXHR) {
                                        _doAppend(data, $action);
                                    }
                                });
                                _gaq.push(['_trackEvent', 'AjaxController', 'append', $action.url]);
                            } else {
                                _doAppend($action.data);
                                _gaq.push(['_trackEvent', 'AjaxController', 'append']);
                            }
                            break;
                        case 'replace':
                            var _doReplace = function (data) {
                                var $content = $(data);
                                $.xaxosControllerHandler($content);
                                    //say('$action.source >> $action.target');
                                //say($action);
                                //say($action.target);
                                if ($action.source) {
                                    $content = $content.find($action.source);
                                }
                                $($action.target).replaceWith($content);
                            };
                            if ($action.url) {
                                $.ajax({
                                    url: $action.url,
                                    type: 'GET',
                                    dataType: 'html',
                                    success: function (data, textStatus, jqXHR) {
                                        _doReplace(data);
                                        if ($action.history) { // TODO chris defined vs true??
                                            window.history.replaceState(null, null, $action.url);
                                        }
                                    }
                                });
                                _gaq.push(['_trackEvent', 'AjaxController', 'replace', $action.url]);
                            } else {
                                _doReplace($action.data);
                                _gaq.push(['_trackEvent', 'AjaxController', 'replace']);
                            }
                            break;
                        case 'toggle':
                            _target = $($action.target);
                            if (_target.hasClass('expanded')) {
                                _target.removeClass('expanded');
                            } else if ($action['class']) {
                                _target.toggleClass($action['class']);
                            } else {
                                $.ajax({
                                    url: $action.url,
                                    type: 'GET',
                                    dataType: 'html',
                                    success: function (data, textStatus, jqXHR) {
                                        var $content = $(data);
                                        $($action.target).replaceWith($content);
                                        $.xaxosControllerHandler($content);
                                    }
                                });
                            }
                            break;
                        case 'removeClass':
                            _target = $($action.target);
                            _target.removeClass($action['class']);
                            break;
                        case 'addClass':
                            _target = $($action.target);
                            _target.addClass($action['class']);
                            break;
                        case 'delete':
                            var $removed = false;
                            var $target = $($action.target);
                            $target.children().slideUp("normal", function () {
                                if (!$removed) {
                                    $removed = true;
                                    $target.remove();
                                }
                            });
                            break;
                        case 'redirect':
                            document.location.href = $action.url;
                            break;
                        case 'dialog':
                            var _doDialog = function (data) {
                                var _dialog = $('<div class="dialog">' + data + '</div>'),
                                    $w = $('#wrapper'),
                                    $wOffset = $w.offset(),
                                    _defaultDialogOptions = {
                                        width: 380,
                                        modal: true,
                                        resizable: false,
                                        open: fixDialogPosition
                                    };
                                _dialog
                                    .appendTo('body')
                                    .dialog(_defaultDialogOptions);
                                $.xaxosControllerHandler(_dialog);
                            };
                            if ($action.url) {
                                $.ajax({
                                    url: $action.url,
                                    type: 'GET',
                                    dataType: 'text',
                                    success: function (data, textStatus, jqXHR) {
                                        var contentType = jqXHR.getResponseHeader('Content-Type');
                                        if (contentType.indexOf('json') === -1) {
                                            _doDialog(data);
                                        } else {
                                            $.xaxosControllerAction($.parseJSON(data));
                                        }
                                    }
                                });
                                _gaq.push(['_trackEvent', 'AjaxController', 'dialog', $action.url]);
                            } else {
                                _doDialog($action.data);
                                _gaq.push(['_trackEvent', 'AjaxController', 'dialog']);
                            }
                            break;
                        }
                        if ($action.url) {
                            _gaq.push(['_trackPageview', $action.url]);
                        }
                    }
                }
            } else {
                $.xaxosAlert({
                    title: 'Error',
                    content: data.error
                });
            }
        }
    });

}(jQuery));

