/* Loader image pre-loading */
var imageLoader = new Image();
imageLoader.src = '/images/loaderbig.gif';

/* Constants and common options */
var NO_OPTION_VALUE = -1,
    NEW_ID = -1,
    cookieOptions = {
        expires: 2592000,
        path: '/'
    };

/* Library functions */
function isSet(value) {
    return (value !== undefined && value !== null);
}

function hasFields(value, fieldList) {
    if (!isSet(value)) {
        return false;
    }
    for (var f in fieldList) {
        if (value[fieldList[f]] === undefined) {
            return false;
        }
    }
    return true;
}

function twoDigits(val) {
    return (val < 10)? '0' + val: val;
}

function getFormattedDate(unixTimestamp) {
    var date = new Date(parseInt(unixTimestamp) * 1000),
        dateChunks = {
            year: String(date.getFullYear()),
            month: String(date.getMonth() + 1),
            day: String(date.getDate())
        };
    for (var ch in dateChunks) {
        if (dateChunks[ch].length == 1) {
            dateChunks[ch] = String('0') + dateChunks[ch];
        }
    }
    return dateChunks.year + '-' + dateChunks.month + '-' + dateChunks.day;
}

function getFormattedTime(unixTimestamp, showSeconds) {
    if(showSeconds === undefined) {
        showSeconds = true;
    }
    var date = new Date(parseInt(unixTimestamp) * 1000),
        dateChunks = {
            hours: String(date.getHours()),
            minutes: String(date.getMinutes()),
            seconds: String(date.getSeconds())
        },
        ouptut = '';
    for (var ch in dateChunks) {
        if (dateChunks[ch].length == 1) {
            dateChunks[ch] = String('0') + dateChunks[ch];
        }
    }
    ouptut = dateChunks.hours + ':' + dateChunks.minutes;
    if(showSeconds)
        ouptut += ':' + dateChunks.seconds
    return ouptut;
}

function resetForm(formSelector) {
    $(':input', formSelector).val('').removeAttr('checked').removeAttr('selected');
}

function convertCookieValue(httpCookieValue) {
    return httpCookieValue.replace(/\+/g, ' ');
}

/* Multilanguage */
var TranslateArray = [],
    translateLoaded = false,
    translateLanguage = (isSet(currentLanguage))
        ? currentLanguage['code']
        : ((isSet(defaultLanguage))? defaultLanguage['code']: 'pl');

$.ajax({
    type: 'GET',
    dataType : 'json',
    url: '/lang/' + translateLanguage + '/translate.json',
    async: false,
    success: function (response) {
        TranslateArray = response;
        translateLoaded = true;
    },
    error: function () {
        $.ajax({
            url: '/ajax/log-translation-error',
            type: 'POST',
            data: {
                lang: translateLanguage
            },
            success: function () {},
            error: function () {}
        });
    }
});

function _(id, args) {
    var logTranslationError = function(id) {
        $.ajax({
            url: '/ajax/log-translation-error',
            type: 'POST',
            data: {
                id: id,
                lang: translateLanguage
            },
            success: function () {},
            error: function () {}
        });
    }

    if (!isSet(TranslateArray[id])) {
        if (translateLoaded) {
            logTranslationError(id);
        }
        return '{' + id + '}';
    }
    var trans = TranslateArray[id],
        lacks = false;
    if ($.isArray(trans)) {
        var result = '';
        for (var i in trans) {
            switch (typeof(trans[i])) {
                case 'string':
                    result += trans[i];
                    break ;
                case 'number':
                    if (hasFields(args, [trans[i]])) {
                        result += args[trans[i]];
                    }
                    else {
                        result += '{#' + trans[i] + '}';
                        lacks = true;
                    }
                    break ;
                default:
                    result += '{?}';
                    lacks = true;
            }
        }
        if (lacks) {
            logTranslationError(id);
        }
        return result;
    }
    else {
        return String(trans);
    }
};

/* Ajax overall initialization with loader */
var ajaxLoaderLevel = 0;
$.ajaxSetup({
    beforeSend: function () {
        ajaxLoaderLevel++;
        if (!$('#loader').length) {
            $(document.body).append(
                '<div id="loader"><div id="loader_overlay" style="height:' + $(window).height() + $(document).scrollTop() + 'px"></div>' +
                '<div id="loader_msg"><img src="' + imageLoader.src + '" alt=""/><p>' + _('MSG_AJAX_LOADING') + '</p></div></div>'
            );
        }
    },
    complete: function () {
        ajaxLoaderLevel--;
        if (ajaxLoaderLevel <= 0) {
            $('#loader').remove();
            ajaxLoaderLevel = 0;
        }
    },
    timeout: 50000,
    error: function () {
        alert(_('MSG_AJAX_ERROR'));
    }
});

/* DialogSet and popups */
var DialogSet = {},
    DialogOptions = {},
    PopupSet = {};

$(document).ready(function () {
    if (isSet($.ui) && isSet($.ui.dialog.prototype.options)) {
        var buttons = [];
        buttons[_('MSG_DIALOG_CLOSE')] = function () {
            $(this).dialog('close');
        };
        $.extend($.ui.dialog.prototype.options, {
            autoOpen: false,
            buttons: buttons,
            closeOnEscape: true,
            modal: true,
            overlay: {opacity: 0.5, background: "#888"},
            resizable: false,
            width: 480
        });
        $.ajaxSetup({
            error: showError
        });
    }
});

function getNthDialogButton($dialog, nth) {
    return $('.ui-dialog-buttonpane button:nth(' + nth + ')', $dialog.parents('.ui-dialog'));
}

function showDialog(name, options, trigger) {
    var display = function () {
            var $dialog = DialogSet[name].clone(true),
                dialogTrigger = null,
                dialogOptions = {
                    title: $dialog.children('.dialog[title]').attr('title')
                };
            if (isSet(options)) {
                dialogOptions = $.extend(dialogOptions, options);
            }
            if (isSet(DialogOptions[name])) {
                dialogOptions = $.extend(dialogOptions, DialogOptions[name]);
                if (isSet(DialogOptions[name]['trigger'])) {
                    dialogTrigger = DialogOptions[name]['trigger'];
                }
            }
            $dialog.dialog(dialogOptions);
            if ($.isFunction(trigger)) {
                trigger($dialog);
            }
            if ($.isFunction(dialogTrigger)) {
                dialogTrigger($dialog);
            }
            $dialog.dialog('open');
            $dialog.focus();
        };

    if (!isSet(DialogSet[name])) {
        var $dialog = $('<div id="' + name + '_dialog"></div>');
        if (isSet(options) && isSet(options['blank']) && options['blank']) {
            DialogSet[name] = $dialog;
            display();
        } else {
            $dialog.load('/lang/' + translateLanguage + '/dialog/' + name + '.html', function () {
                $.ajaxSettings.complete();
                DialogSet[name] = $dialog;
                display();
            });
        }
    } else {
        display();
    }
}

function closeDialog(name) {
    $('#' + name + '_dialog:visible').dialog('close').remove();
}

function showError() {
    var $errDialog = DialogSet['error'];
    if (!isSet($errDialog)) {
        $errDialog = $('<div id="err_dialog">').attr('title', _('MSG_AJAX_DIALOG_ERROR_TITLE'))
            .html('<div class="sending_status"><div class="error icon32"></div><p><strong>' + _('MSG_AJAX_DIALOG_ERROR_MESSAGE') + '</strong></p></div>');
        DialogSet['error'] = $errDialog;
    }
    if (!$('#err_dialog:visible').length) {
        $errDialog.clone(true).dialog({
            autoOpen: true,
            close: function() {
                $(this).remove();
            }
        });
    }
}

function showMessage(title, msg, noHtml, noCloseOthers) {
    var $msgDialog = DialogSet['message'];
    if (!isSet($msgDialog)) {
        $msgDialog = $('<div id="msg_dialog">');
        DialogSet['message'] = $msgDialog;
    }
    if (!noCloseOthers) {
        closeAllMessages();
    }
    var $cloneDialog = $msgDialog.clone(true).attr('title', title);
    if (noHtml) {
        $cloneDialog.text(msg);
    } else {
        $cloneDialog.html(msg);
    }
    $cloneDialog.dialog({
        autoOpen: true,
        close: function() {
            $(this).remove();
        }
    });
}

function closeAllMessages() {
    if ($('#msg_dialog:visible').length > 0) {
        $('#msg_dialog').dialog('close').remove();
    }
}

function popup(url, width, height) {
    var popupId = new Date().getTime();
    if(width === undefined)
        width = 440;
    if(height === undefined)
        height = 510;
    PopupSet[popupId] = window.open(
        url, popupId,
        'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=' + width +  ',height=' + height
    );
}
$(document).ready(function () {
    $('.popup').click(function() {
        var url = $(this).attr('href');
        popup(url);
        return false;
    });
});

/* Templates */
function renderTemplate(template, data) {
    return $.tmpl(TemplateSet[template], data);
}

/* Handler trigger */
function invokeHandlers(handlers) {
    for (var h in handlers) {
        var handlerFunction = handlers[h][0],
            $handlerElement = (isSet(handlers[h][1]))? $(handlers[h][1]): null,
            handlerArguments = (isSet(handlers[h][2]))? handlers[h][2]: {};
        if (!isSet(handlerFunction)) {
            continue ;
        }
        if (isSet($handlerElement)) {
            if ($handlerElement.length > 0) {
                handlerFunction($handlerElement, handlerArguments);
            }
        } else {
            handlerFunction(handlerArguments);
        }
    }
}

$(document).ready(function () {
    invokeHandlers([
        [MultilanguageHandler, '.multilanguage_edit'],
        [LoginHandler, '#login_link'],
        [LiveChatLinkHandler, '.livechat_link'],
        [TooltipsHandler, '.tooltip'],
        [AutoSelectHandler, '.autoSelect'],
        [ReCaptchaHandler, 'label.recaptcha'],
        [HowitworksHandler, '#gnav_howitworks'],
        [TboxHandler, '.terminal']
    ]);
});

function HowitworksHandler($button) {
    var $howitworks = $('#howitworks');
    $button.click(function() {
        if($howitworks.is(':visible')) {
            $(this).removeClass('active');
            $howitworks.slideUp();
        } else {
            $howitworks.slideDown();
            $(this).addClass('active');
        }
    });
    $('.close', $howitworks).click(function() {
        $button.removeClass('active');
        $howitworks.slideUp();
    });
}

function TboxHandler($terminal) {
    $terminal.tooltip({
        showURL: false,
        bodyHandler: function() {
            return renderTemplate('tbox', {
                text: _('TERMINAL_TOOLTIP')
            });
        }
    });
    $terminal.click(function() {
        $('#tooltip').toggle();
    });
}

function MultilanguageHandler($multilanguageEdit) {
    var isFormMultilanguage = false;

    $multilanguageEdit.each(function () {
        if (!$(this).attr('name').length || !($(this).is('input[type=text]') || $(this).is('textarea'))) {
            return ;
        }

        var $clone = $(this).clone(true).addClass('hidden'),
            name = $(this).attr('name'),
            value = $(this).attr('value'),
            ValueSet = (value.length > 0)? $.json.decode(value): {};

        isFormMultilanguage = true;

        for (var l in availableLanguages) {
            var id = availableLanguages[l]['id'],
                code = availableLanguages[l]['code'];
            if (code == defaultLanguage['code']) {
                $(this).val((hasFields(ValueSet, [id]))? ValueSet[id]: '').attr('name', name + '[' + id + ']')
                    .addClass('multilanguage_edit_' + code);
            }
            else {
                var $newElement = $clone.clone(true);
                $newElement.val((hasFields(ValueSet, [id]))? ValueSet[id]: '').attr('name', name + '[' + id + ']')
                    .addClass('multilanguage_edit_' + code).insertBefore($(this));
            }
        }
    });

    if (isFormMultilanguage) {
        var $multilanguager = $('<span></span>');
        for (var l in availableLanguages) {
            var code = availableLanguages[l]['code'],
                icon = availableLanguages[l]['img'],
                $link = $('<a></a>'),
                $icon = $('<img />');
            $icon.attr('src', icon).attr('alt', code);
            $link.attr('href', '#').html($icon).click(function () {
                var codeClass = 'multilanguage_edit_' + $('img', $(this)).attr('alt');
                $('.multilanguage_edit').each(function () {
                    if ($(this).hasClass(codeClass)) {
                        $(this).removeClass('hidden');
                    } else {
                        $(this).addClass('hidden');
                    }
                });
                return false;
            });
            $multilanguager.addClass('multilanguager_for_all').append($link);
        }
        $('.form_title').append($multilanguager);
    }
}

function LoginHandler($loginLink) {
    $loginLink.click(function() {
        $('#login_toggle').toggle('fast');
    });
}

function LiveChatLinkHandler($liveChatLink) {
    $liveChatLink.click(function () {
        window.open('/livezilla/chat.php','','width=590,height=550,left=0,top=0,resizable=yes,menubar=no,location=no,status=yes,scrollbars=yes');
    });
}

function TooltipsHandler($selector) {
    $selector.tooltip({
        showURL: false
    });
    $selector.click(function() {
        $('#tooltip').toggle();
    });
}

function AutoSelectHandler($autoSelect) {
    $autoSelect.change(function() {
        var name = $(this).attr('name'),
            value = $(this).val(),
            uri = location.href.replace(new RegExp('/' + name + '/[^/]+'), '');
        if (value != NO_OPTION_VALUE) {
            uri += (uri[uri.length - 1] == '/')? name + '/' + value: '/' + name + '/' + value;
        }
        location.href = uri;
    });
}

function ReCaptchaHandler($reCaptchaLabel) {
    $reCaptchaLabel.attr('for', 'recaptcha_response_field');
}

