/**
 *$Id: string.js 62 2008-09-25 14:16:51Z vkarpov $
 *
 * Работа со строками
 */
PuskFramework.str = new function()
{
    var pf = PuskFramework;

    /**
     * Дополнить строку до заданной длины
     *
     * @param {Object} string строка
     * @param {Object} l длина
     * @param {Object} s строка для дополнения
     * @param {Object} t тип дополнения (0/1/2)
     * @return {String}
     */
    this.pad = function(string, l, s, t)
    {
        string = string || '';
        return s || (s = " "), (l -= string.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
            + 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
            + string + s.substr(0, l - t) : string;
    };

    /**
     * Удалить пробелы и другие пустые символы с начала и конца строки
     *
     * @param {Object} string строка
     * @return {String}
     */
    this.trim = function(string)
    {
        string = string || '';
        string = string.toString();
        string = string.replace(/^[\s\n]+/g, ''); // strip leading
        string = string.replace(/[\s\n]+$/g, ''); // strip trailing
        return string;
    };

    /**
     * Удалить тэги из строки
     *
     * @param {Object} string строка
     * @return {String}
     */
    this.stripTags = function(string)
    {
        string = string || '';
        return string.replace(/(<[^>]+>)/g, '');
    };

    /**
     * Экранировать HTML сущности
     *
     * @param {Object} string строка
     * @return {String}
     */
    this.escapeHtml = function(string)
    {
        string = string || '';
        return string.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
    };

    /**
     * Деэкранировать HTML сущности
     *
     * @param {Object} string строка
     * @return {String}
     */
    this.unescapeHtml = function(string)
    {
        string = string || '';
        return string.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&')
    };

    /**
     * Обрезать строку до заданной длины и дополнить подстрокой, если обрезание состоялось
     *
     * @param {Object} string строка
     * @param {Object} length длина
     * @param {Object} truncation дополнение
     * @return {String}
     */
    this.truncate = function(string, length, truncation)
    {
        string = string || '';
        length = length || 30;
        truncation = truncation || '...';
        return string.length > length ?
            string.slice(0, length) + truncation : string;
    };

    /**
     * Проверка наличия подстроки в строке
     *
     * @param {String} string строка
     * @param {String} needle подстрока
     * @param {Bool} caseInsensitive учитывать регистр?
     * @return {Bool}
     */
    this.contains = function(string, needle, caseInsensitive)
    {
        string = string || '';
        var haystack = string;
        if (caseInsensitive)
        {
            haystack = haystack.toLowerCase();
            needle   = needle.toLowerCase();
        }
        return haystack.indexOf(needle) > -1;
    };

    /**
     * Проверка на наличие подстроки в начале строки
     *
     * @param {String} string строка
     * @param {String} needle подстрока
     * @param {Bool} caseInsensitive учитывать регистр?
     * @return {Bool}
     */
    this.startsWith = function(string, needle, caseInsensitive)
    {
        string = string || '';
        needle = needle || '';
        var haystack = string;
        if (caseInsensitive)
        {
            haystack = haystack.toLowerCase();
            needle = needle.toLowerCase();
        }
        return haystack.indexOf(needle) === 0;
    };

    /**
     * Проверка на наличие подстроки в конце строки
     *
     * @param {String} string строка
     * @param {String} needle подстрока
     * @param {Bool} caseInsensitive учитывать регистр?
     * @return {Bool}
     */
    this.endsWith = function(string, needle, caseInsensitive)
    {
        string = string || '';
        needle = needle || '';
        var haystack = string;
        if (caseInsensitive)
        {
            haystack = haystack.toLowerCase();
            needle = needle.toLowerCase();
        }
        var d = haystack.length - needle.length;
        return d >= 0 && haystack.lastIndexOf(needle) === d;
    };

    /**
     * Отверблюдить строку
     *
     * @param {String} string строка
     * @return {String}
     */
    this.camelize = function(string)
    {
        if (!string) return '';
        var oStringList = string.split('-');
        if (oStringList.length == 1) return oStringList[0];

        var camelizedString = string.indexOf('-') == 0
            ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
            : oStringList[0];

        for (var i = 1, len = oStringList.length; i < len; i++) {
            var s = oStringList[i];
            camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
        }

        return camelizedString;
    };

    /**
     * Преобразовать GET строку в объект
     *
     * @param {String} str строка
     * @param {String} delimiter1
     * @param {String} delimiter2
     * @return {Object}
     */
    this.toHash = function(str, delimiter1, delimiter2)
    {
        if (!str) return '';
        delimiter1 = delimiter1 || '&';
        delimiter2 = delimiter2 || '=';
        var hash = {};
        var pair, pairs = str.split(delimiter1);
        for(var i=0, len=pairs.length; i<len; i++)
        {
            pair = (pairs[i]).split(delimiter2);
            if (pair[1] != undefined)
            {
                hash[pf.str.trim(decodeURIComponent(pair[0]))] = pf.str.trim(decodeURIComponent(pair[1]));
            }
        }
        return hash;
    };

    this.oneOf = function(str)
    {
        str = str || '';
        str = str.toString();
        if (arguments.length < 1) return false;
        for (var i = 1; i < arguments.length; i++)
        {
            if (str === arguments[i].toString()) return true;
        }
        return false;
    };
};
