/**
 * Base Lib helpers
 */

var LIB = {

    /**
     * Dodawanie CSSow (poza jQuery)
     */
    includeCSS: function(cssFile)
    {
        var oHead = document.getElementsByTagName('head')[0];
        var oLink = document.createElement('link');
        oLink.type = 'text/css';
        oLink.href = cssFile;
        oLink.media = 'screen';
        oLink.rel = 'stylesheet';
        oHead.appendChild(oLink);
    },

    /**
     * Usuwanie CSSów (poza jQuery)
     */
    removeCSS: function(cssFile)
    {
        var oHead = document.getElementsByTagName('head')[0]
        var links = oHead.getElementsByTagName('link');
        for (var i in links)
        {
            if (links[i] && links[i].href == cssFile)
            {
                links[i].parentNode.removeChild(links[i]);
            }
        };
    },

    /**
     * Dodawanie JSow (poza jQuery)
     */
    includeJS: function(jsFile)
    {
        var oHead = document.getElementsByTagName('head')[0];
        var oScript = document.createElement('script');
        oScript.type = 'text/javascript';
        oScript.src = jsFile;
        oHead.appendChild(oScript);
    },

    /**
     * Usuwanie JSów (poza jQuery)
     */
    removeJS: function(jsFile)
    {
        var oHead = document.getElementsByTagName('head')[0]
        var jscripts = oHead.getElementsByTagName('script');
        for (var i in jscripts)
        {
            if (jscripts[i] && jscripts[i].src == jsFile)
            {
                jscripts[i].parentNode.removeChild(jscripts[i]);
            }
        };
    },

    /**
     * Klonowanie obiektów
     * @param Object obj
     * @return Object
     */
    clone: function(obj)
    {
        var n = {};
        for (var p in obj)
        {
            n[p] = obj[p]
        }
    
        return n;
    },

    /**
     * Funkcja otwiera okienko javascriptowskie:
     * 
     * @param String url
     * @return void
     */
    windowOpen: function(Url) {
        var screen_x = screen.width;
        var screen_y = screen.height;

        var window_width = screen_x - 200;
        var window_height = screen_y - 300;

        var pos_x = (screen_x / 2) - (window_width / 2);
        var pos_y = (screen_y / 2) - (window_height / 2);

        var Name = 'window_' + Math.round((Math.random()*1000));
        var W = window.open(Url, Name, 'menubar=0,resizable=1,width='+window_width+',height='+window_height+',scrollbars=1,left='+pos_x+',top='+pos_y);
        W.focus();

        return W;
    },

    /**
     * Zamienia przecinki na kropki:
     * @param int/string price
     * @return string
     */
    fixPrice: function(price)
    {
        if (price.toString().indexOf(',') != -1)
        {
            return price.toString().replace(/,/, '.');
        }
        else
        {
            return price;
        }
    },

    /**
     * Konwersja do wartości cenowej:
     * 
     * @param value
     * @return float 
 */
    parsePrice: function(value)
    {
        value = parseFloat(fixPrice(value));
	
        if (isNaN(value))
        {
            return "0.00";
        }

        return value.toFixed(2);
    },

    /**
     * Przeliczanie ceny netto
     * 
     * @return void
     */
    calcNetto: function(val, tax)
    {
        val = parseFloat(fixPrice(val));

        if (isNaN(val))
        {
            return '';
        }

        var newVal = val  / (1 + (parseFloat(tax)/100));
    
        return parsePrice(newVal);
    },

    /**
     * Przeliczanie ceny brutto
     * 
     * @return void
     */
    calcBrutto: function(val, tax)
    {
        val = parseFloat(fixPrice(val));
    
        if (isNaN(val))
        {
            return '';
        }

        var newVal = val + (val * (parseFloat(tax)/100));
    
        return parsePrice(newVal);
    },

    /**
     * Funkcjonalność dla pola z ceną:
     * @param this
     * @return void
     */
    featureInputPrice: function()
    {
        $(this).keydown(function(e) {
        
            // delete, backspace, strzałki, nawigacja, przecinki, kropki, znak ujemny
            if ($.inArray(e.which, [46, 8, 36, 35, 37, 38, 39, 40, 93, 188, 190, 108, 109, 0]) > -1)
            {
                return true;
            }

            if (!(e.which >= 48 && e.which <= 57) && !(e.which >= 96 && e.which <= 105))
            {
                return false;
            }

            if ($.trim($(this).val()).search(/^\-?([0-9]{0,10}([\.,][0-9]{0,10})?)?$/) == -1)
            {
                return false;
            }
        });

        $(this).keyup(function() {
            $(this).val($(this).val().replace(',', '.'));
        });

        $(this).bind('repair', function() {
            $(this).val($.trim($(this).val()).replace(/\.0*$/, '.00'));
            $(this).val($.trim($(this).val()).replace(/^\./, '0.'));
            if ($.trim($(this).val()).search(/^\-?([0-9]{1,10})$/) != -1)
            {
                $(this).val($.trim($(this).val()) + '.00');
            }        
        });
    
        $(this).blur(function() {
            $(this).trigger('repair');
        });
    
        // Wywołanie na starcie procedury poprawiania wartości zmiennoprzecinkowych:
        $(this).trigger('repair');
    },

    /**
     * Funkcjonalność dla pola z typem całkowitym
     * @param this
     * @return void
     */
    featureInputInt: function()
    {
        $(this).keydown(function(e) {

            // delete, backspace, strzałki, nawigacja, znak ujemny
            if ($.inArray(e.which, [46, 8, 36, 35, 37, 38, 39, 40, 93, 109, 0]) > -1)
            {
                return true;
            }

            if (!(e.which >= 48 && e.which <= 57) && !(e.which >= 96 && e.which <= 105))
            {
                return false;
            }

            if ($(this).val().length > 10)
            {
                return false;
            }

            return true;
        });
    
        $(this).blur(function() {
            $(this).val($(this).val().replace(/[^0-9\-]/, '').substring(0,11));
        });
    },

    /**
     * Obcinanie textu
     * @param string text
     * @param int len
     * @param string replacer
     * @return string
     */
    truncateText: function(text, len, replacer)
    {
        var endingReplacer = (replacer ? replacer : '');
        var replacerLength = replacer.length;

        if (text.length > len)
        {
            text = text.substring(0, len-replacerLength) + endingReplacer;
        }

        return text;
    },

    /**
     * Przetwarzanie wiadomości z ajaxa:
     * @param mixes message
     */
    processMessage: function(message)
    {
        if (!message)
        {
            return "Błąd aplikacji!";
        }

        switch (typeof message)
        {
            case 'array':
                return message.join(",\n");

            case 'object':
                return message.join(",\n");

            case 'string':
                return message

            default:
                return message
        }
    },

    /**
     * Konwersja stringu do obiektu JSON (błąd pojawiający się przy ajaxForm)
     * @param string response
     * @return {}
     */
    responseToObject: function(response)
    {
        if (typeof response == 'string')
        {
            // W niektórych przeglądarkach odpowiedź serwera przychodzi zawarta w tagu (najwczęściej <pre>)
            response = response.replace(/^<[a-z]+[^>]*>/g, '').replace(/<\/[a-z]+>$/g, '');
        
            try
            {
                response = JSON.parse(response);
            }
            catch (e)
            {
                response = {
                    status: 'error', 
                    message: 'Błąd odpowiedzi serwera. Prosimy skontaktować się z biurem obsługi klienta.'
                };
            }
        }

        return response;
    },

    /**
     * Obsługa odpowiedzi JSON
     * 
     * @param {} response
     * @param {} callbacks
     * @return void
     */
    xhrSuccess: function(response, funcs)
    {
        var defaults = {
            ok: function() {},
            error: function(message)
            {
                if (message)
                {
                    window.alert(processMessage(message));
                }
            },
            always: function () {}
        };

        var callbacks = $.extend(defaults, funcs);

        if (typeof response == 'object' && typeof response['status'] == 'string')
        {
            if (response.status == 'ok')
            {
                if (typeof response.value != "undefined")
                {
                    if (typeof response.message != "undefined")
                    {
                        callbacks.ok(response.value, response.message);
                    }
                    else
                    {
                        callbacks.ok(response.value);
                    }
                }
                else
                {
                    callbacks.ok();
                }
            }
            else
            {
                if (typeof response.message == "undefined")
                {
                    response.message = null;
                }
            
                if (typeof response.value != "undefined")
                {
                    callbacks.error(response.message, response.value);
                }
                else
                {
                    callbacks.error(response.message);
                }
            }
        }
        else
        {
            window.alert('Błąd odpowiedzi Ajax. Prosimy skontaktować się z biurem obsługi klienta: tel. 801-080-350 lub (+48)12-376-09-50');
        }
        callbacks.always(response);
    },

    /**
     * Transformacja stringa do obiektu
     *
     * @param string params
     * @return {}
     */
    paramsToObject: function(params)
    {
        var slices = params.split(/[,\/]/);
        var obj = {};
        var subslice, variable, value;

        for (var i in slices)
        {
            if (typeof slices[i] !== 'string')
            {
                continue;
            }
            subslice = slices[i].split(/[:\-,=]/);
            variable = subslice[0];
            obj[variable] = (subslice[1]) ? subslice[1] : null ;
        }

        return obj;
    },

    /**
     * Funkcja pobierająca wartość zakotwiczenia z linków
     * (abstrackcja dla przeglądarek: ie i reszty)
     *
     * @return string
     */
    anchor: function(value, key)
    {
        var anchor = value.split('#')[1];

        if (typeof key != 'undefined')
        {
            var params = paramsToObject(anchor);
            anchor = params[key];
        }

        return anchor;
    },

    /**
     * Ładowanie skryptów kaskadowo
     *
     * @param [] files
     * @param function callback
     * @return void
     */
    loadScriptsCascade: function($, files, callback)
    {
        var file = files.shift();

        if (!loadScriptsCascade.files)
        {
            loadScriptsCascade.files = [];
        }

        var loadNext = function()
        {
            if (!files.length)
            {
                callback();
            }
            else
            {
                loadScriptsCascade($, files, callback);
            }
        };

    
        if ($.inArray(file, loadScriptsCascade.files) > -1)
        {
            loadNext();
        }
        else
        {
            loadScriptsCascade.files.push(file);
            $.getScript(file, loadNext);
        }
    },

    /**
     * Sanityzacja znaków
     *
     * @param string value
     * @return string
     */
    sanitizeChars: function(value)
    {
        value = $.trim(value.toLowerCase());
    
        var chars = [
        [RegExp(/ł/g), 'l'],
        [RegExp(/ę/g), 'e'],
        [RegExp(/ó/g), 'o'],
        [RegExp(/ą/g), 'a'],
        [RegExp(/ś/g), 's'],
        [RegExp(/ż/g), 'z'],
        [RegExp(/ź/g), 'z'],
        [RegExp(/ć/g), 'c'],
        [RegExp(/ń/g), 'n'],
        [RegExp(/Ł/g), 'l'],
        [RegExp(/Ę/g), 'e'],
        [RegExp(/Ó/g), 'o'],
        [RegExp(/Ą/g), 'a'],
        [RegExp(/Ś/g), 's'],
        [RegExp(/Ż/g), 'z'],
        [RegExp(/Ź/g), 'z'],
        [RegExp(/Ć/g), 'c'],
        [RegExp(/Ń/g), 'n']
        ];

        var n = chars.length;
        for (var i=0; i<n; i++)
        {
            value = value.replace(chars[i][0], chars[i][1]);
        }

        return value.replace(/[^a-z0-9\-]+/ig, '-');
    },

    /**
     * Ustawianie przestrzeni nazw
     * 
     * @param string name
     * @return void
     */
    namespace: function(name)
    {
        var subnames = [];
        var subname;
        var root = window;
        if (name.indexOf('.') != -1)
        {
            subnames = name.split('.');
        }
        else
        {
            subnames.push(name);
        }

        for (var i in subnames)
        {
            subname = subnames[i];
            if (typeof root[subname] == 'undefined')
            {
                root[subname] = {};
            }
            if (typeof root[subname] == 'object')
            {
                root = root[subname];
            }
        }
        return root;
    }
}
