//COMMON-JavaScript library

//--------------------------------
//    STRING
//--------------------------------
function string_repeat(string,
                       count)
{
        var _string = "";
        for (var i = 0; i < count; i++) _string += string;
        return _string;
};
//................................
function htmlspecialchars(string)
{
        string = string.replace(/</g, "&lt;");
        string = string.replace(/>/g, "&gt;");
        return string.replace(/"/g, "&quot;");
};
//................................
function unique_id(count)
{
        var _string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        var i       = 0;
        var value   = "";

        for (; i < count; i++)
                value += _string.charAt(Math.floor(Math.random() * 62));

        return value;
};
//................................
function strabridge(string) //arguments: 1 => length
{
        var length        = (strabridge.arguments.length > 1) ?
                            strabridge.arguments[1] : 40;
        var _length       = string.length;
        if (_length <= length) return string;

        length           -= 1;
        var length_start  = Math.round(length * 65 / 100, 0);
        var length_end    = length - length_start;

        return string.substr(0, length_start) +
               "…" +
               string.substr(-length_end);
}
//................................
function addslashes(string)
{
        return string.replace(/([\x00"'\\])/g, "\\$1");
};
//--------------------------------
//    COLORCONTROL
//--------------------------------
function colorcontrol(object,
                      image_path)
{
        var color = new Array("#FFFFFF", "#CFC0AA", "#CDAF84", "#F6A98E", "#F8BD95", "#F8BD95", "#FEFDAC", "#C9E7AD", "#ACDDAD", "#90D5AD", "#8DD4D0", "#89D3F6", "#96B0DD", "#9B9ED1", "#9E8DC6", "#B392C7", "#CA99C8", "#F6A6CA", "#F6A8AC",
                              "#CACACA", "#A79989", "#B2926B", "#F38568", "#F5A36F", "#F8C177", "#FEFC84", "#B3DF8B", "#88D28D", "#42C68E", "#30C6C0", "#00C3F2", "#6996D1", "#7680C2", "#7E67B4", "#9C6CB4", "#B871B5", "#F37DB6", "#F38290",
                              "#939393", "#86796E", "#9C7B53", "#EF3B3E", "#F28040", "#F5AA41", "#FEFB37", "#95D560", "#33C567", "#00B86B", "#00B7AC", "#00B3EF", "#007CC5", "#3A5EB2", "#5629A1", "#821EA0", "#A6009F", "#F0009C", "#F02270",
                              "#555555", "#6A5F59", "#88663E", "#AC2727", "#AE5D29", "#AF7C2B", "#B3B52E", "#689C46", "#00924C", "#008951", "#008880", "#0085B0", "#005A92", "#294084", "#3F0078", "#610077", "#7B0075", "#AF0073", "#AD0050",
                              "#000000", "#4E4845", "#75532D", "#8D0A00", "#8D4A06", "#8F640F", "#91931E", "#517F36", "#00773C", "#007140", "#007069", "#006D91", "#004677", "#102C6C", "#300062", "#4E0061", "#65005F", "#8F005C", "#8D003E");
        var map_name = "colorcontrol" + parseInt(Math.random() * 99999999);
        var x        = 0;
        var y        = 0;
        var i        = 0;

        document.write("<map name=\"" + map_name + "\">");

        for (y = 1; y < 22; y += 5)
        {
                for (x = 1; x < 92; x += 5)
                        document.write("<area shape=\"rect\" " +
                                             "coords=\"" + x + "," + y + "," +
                                             (x + 5) + "," + (y + 5) + "\" " +
                                             "href=\"javascript:colorcontrol_set(" +
                                             "'" + object + "','" + color[i++] + "');\">");
        };

        document.write("</map>" +
                       "<img src=\"" + image_path + "\" " +
                            "usemap=\"#" + map_name +"\">");
};
//................................
function colorcontrol_set(object,
                          value)
{
        eval("var object_handle = " + object);
        object_handle.value = value;
};
//--------------------------------
//    TEXTCONTROL
//--------------------------------
function textcontrol(object,
                     image_path) //arguments: 2 => extension
{
        image_path += "textcontrol/";

        document.write("<div class=\"textcontrol\">" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','+');\">" +
                       "<img src=\"" + image_path + "button_bold.png\" alt=\"bold\" title=\"bold\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','/');\">" +
                       "<img src=\"" + image_path + "button_italic.png\" alt=\"italic\" title=\"italic\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','_');\">" +
                       "<img src=\"" + image_path + "button_underline.png\" alt=\"underline\" title=\"underline\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','<');\">" +
                       "<img src=\"" + image_path + "button_big.png\" alt=\"big\" title=\"big\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','>');\">" +
                       "<img src=\"" + image_path + "button_small.png\" alt=\"small\" title=\"small\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','<-');\">" +
                       "<img src=\"" + image_path + "button_left.png\" alt=\"align left\" title=\"align left\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','<->');\">" +
                       "<img src=\"" + image_path + "button_center.png\" alt=\"center\" title=\"center\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','->');\">" +
                       "<img src=\"" + image_path + "button_right.png\" alt=\"align right\" title=\"align right\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','*');\">" +
                       "<img src=\"" + image_path + "button_title.png\" alt=\"title\" title=\"title\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','&quot;');\">" +
                       "<img src=\"" + image_path + "button_quote.png\" alt=\"quote\" title=\"quote\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','-');\">" +
                       "<img src=\"" + image_path + "button_monospace.png\" alt=\"fixed character width\" title=\"fixed character width\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','#image_left');\">" +
                       "<img src=\"" + image_path + "button_image_left.png\" alt=\"left aligned image\" title=\"left aligned image\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','#image_right');\">" +
                       "<img src=\"" + image_path + "button_image_right.png\" alt=\"right aligned image\" title=\"right aligned image\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','#hyperlink');\">" +
                       "<img src=\"" + image_path + "button_hyperlink.png\" alt=\"hyperlink\" title=\"hyperlink\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','#email');\">" +
                       "<img src=\"" + image_path + "button_email.png\" alt=\"email\" title=\"email\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','#table');\">" +
                       "<img src=\"" + image_path + "button_table.png\" alt=\"table\" title=\"table\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','#tablerow');\">" +
                       "<img src=\"" + image_path + "button_table_row.png\" alt=\"table row separator\" title=\"table row separator\">" +
                       "</a>" +

                       "<a href=\"javascript:textcontrol_set('" + object + "','#tablecell');\">" +
                       "<img src=\"" + image_path + "button_table_cell.png\" alt=\"table cell separator\" title=\"table cell separator\">" +
                       "</a>");

        if (textcontrol.arguments.length > 2)
                document.write(textcontrol.arguments[2]);

        document.write("</div>");
};
//................................
function textcontrol_select(object_handle)
{
        if (document.selection != null) object_handle._selection = document.selection.createRange();
};
//................................
function textcontrol_set(object,
                         format) //arguments: 2 => data
{
        eval("var object_handle = " + object);
        if (object_handle.disabled) return;

        var data         = (textcontrol_set.arguments.length > 2) ? textcontrol_set.arguments[2] : "";
        var _format      = "";
        var text         = "";
        var select_start = 0;
        var select_end   = 0;

        if (document.selection != null)
        {
                if (! object_handle._selection)
                {
                        object_handle._selection = object_handle.createTextRange();
                        object_handle._selection.move("textedit");
                };

                text = object_handle._selection.text;
        }
        else if (object_handle.selectionStart != null)
        {
                text           = object_handle.value.substring(object_handle.selectionStart, object_handle.selectionEnd);
                var scroll_top = object_handle.scrollTop;
        }
        else
        {
                text = "";
        };

        switch (format)
        {
        case "#image_left":
                if (data)
                {
                        _format      = "[IMG " + data + "]" + text;
                        select_start = -text.length;
                        select_end   = select_start;
                }
                else
                {
                        _format      = "[IMG http://URL]" + text;
                        select_end   = -text.length - 1;
                        select_start = select_end - 3;
                };
                break;

        case "#image_right":
                if (data)
                {
                        _format      = "[IMG-> " + data + "]" + text;
                        select_start = -text.length;
                        select_end   = select_start;
                }
                else
                {
                        _format      = "[IMG-> http://URL]" + text;
                        select_end   = -text.length - 1;
                        select_start = select_end - 3;
                };
                break;

        case "#hyperlink":
                if (data)
                {
                        if (text)
                        {
                                data.match(/^([^ \r\n]+)/);
                                _format = "[" + data.substring(0, RegExp.$1.length) + " " + text + "]";
                        }
                        else
                        {
                                _format = "[" + data + "]";
                        };

                        select_start = 0;
                        select_end   = 0;
                }
                else
                {
                        _format      = "[http://URL " + (text ? text : "click") + "]";
                        select_end   = -(text ? text.length : 5) - 2;
                        select_start = select_end - 3;
                };
                break;

        case "#email":
                if (data)
                {
                        if (text)
                        {
                                data.match(/^([^ \r\n]+)/);
                                _format = "[mailto:" + data.substring(0, RegExp.$1.length) + " " + text + "]";
                        }
                        else
                        {
                                _format = "[mailto:" + data + "]";
                        };

                        select_start = 0;
                        select_end   = 0;
                }
                else
                {
                        _format      = "[mailto:account@domain " + (text ? text : "click") + "]";
                        select_end   = -(text ? text.length : 5) - 2;
                        select_start = select_end - 14;
                };
                break;

        case "#table":
                _format      = "\n[# " + text + " ]\n";
                select_start = -text.length - 3;
                select_end   = select_start;
                break;

        case "#tablerow":
                _format      = " | \n | " + text;
                select_start = -text.length;
                select_end   = select_start;
                break;

        case "#tablecell":
                _format      = " | " + text;
                select_start = 0;
                select_end   = 0;
                break;

        case "#token":
                if (data)
                {
                        if (! data.match(/^%%.*%%$/))
                                data         = "%%" + data + "%%";

                        if (data.match(/^[^ \r\n]+$/))
                        {
                                _format      = data + text;
                                select_start = data.length - _format.length;
                                select_end   = select_start;
                                break;
                        };

                        if (text)
                        {
                                text         = text.replace(/,/g, "\\,").replace(/%%/g, "\\%%");
                                data         = data.replace(/^([^ \r\n]+[ \r\n])[^,%]+/, "$1" + text);
                                _format      = data;
                                data.match(/^(([^,]|\\,)+[^\\],[ \r\n]*|.+%%$)/);
                        }
                        else
                        {
                                _format      = data;
                                data.match(/^([^ \r\n]+[ \r\n]+)/);
                        };

                        select_start = RegExp.$1.length - _format.length;
                        data.substring(RegExp.$1.length).match(/^(([^,]|\\,)*[^\\](,)|.*(%%)$|$)/);
                        select_end   = select_start + RegExp.$1.length - RegExp.$3.length - RegExp.$4.length;
                }
                else
                {
                        _format      = "%%" + text + "%%";
                        select_end   = -2;
                        select_start = select_end - text.length;
                };
                break;

        case "#insert":
                _format      = (data ? data : "") + text;
                select_start = 0;
                select_end   = 0;
                break;

        case "#replace":
                _format      = data ? data : "";
                select_start = 0;
                select_end   = 0;
                break;

        case "#imbed":
                select_start = data.lastIndexOf("%text%");
                if (select_start == -1)
                {
                        _format      = data + text;
                        select_start = -text.length;
                }
                else
                {
                        _format      = data.replace(/%text%/, text);
                        select_start = -_format.length + select_start + text.length;
                };
                select_end   = select_start;
                break;

        default:
                _format      = "[" + format + " " + text + "]";
                select_start = -1;
                select_end   = -1;
                break;
        };

        if (document.selection != null)
        {
                with (object_handle._selection)
                {
                        text = _format;
                        collapse();
                        moveStart("character", select_start);
                        moveEnd("character", select_end);
                        select();
                };
        }
        else if (object_handle.selectionStart != null)
        {
                with (object_handle)
                {
                        var temp      = selectionStart + _format.length;
                        select_start += temp;
                        select_end   += temp;
                        value         = value.substring(0, selectionStart) +
                                        _format +
                                        value.substring(selectionEnd, textLength);
                        scrollTop     = scroll_top;
                        setSelectionRange(select_start, select_end);
                };
        }
        else
        {
                object_handle.value += _format;
        };

        object_handle.focus();
};
//--------------------------------
//    LOCATION
//--------------------------------
function load_page(container,
                   page) //arguments: 2 => width, 3 => height
{
        if (container)
        {
                eval(container + ".location.replace(\"" + page + "\");");
        }
        else
        {
                var width  = (load_page.arguments.length < 3) ? screen.width  - 40 : load_page.arguments[2];
                var height = (load_page.arguments.length < 4) ? screen.height - 40 : load_page.arguments[3];
                if (width  >= 1024)                   width  = 984;
                if (height >= 768)                    height = 728;
                if (width  > screen.availWidth  - 40) width  = screen.availWidth  - 40;
                if (height > screen.availHeight - 40) height = screen.availHeight - 40;
                var left   = parseInt((screen.availWidth  - width)  / 2);
                var top    = parseInt((screen.availHeight - height) / 2);

                window.open(page,
                            "_blank",
                            "width=" + width + "," +
                           "height=" + height + "," +
                             "left=" + left + "," +
                              "top=" + top + "," +
                         "location=no," +
                          "menubar=no," +
                        "resizable=" + ((load_page.arguments.length > 2) ? "no" : "yes") + "," +
                       "scrollbars=yes," +
                           "status=no," +
                          "toolbar=no");
        };
};
//--------------------------------
//    FORM
//--------------------------------
function limit(object,
               limit)
{
        if (object.value.length > limit)
                object.value = object.value.substr(0, limit);
};
//--------------------------------
//    COOKIE
//--------------------------------
function getcookie(name)
{
        var value  = document.cookie;
        var i      = value.indexOf(name + "=");
        if (i == -1) return "";
        i         += name.length + 1;
        var c      = value.indexOf(";", i);
        if (c == -1) c = value.length;
        value      = value.substring(i, c);
        return unescape(value);
};
//................................
function setcookie(name,
                   value) //arguments: 2 => expires
{
        document.cookie = name + "=" + escape(value) +
                          ((setcookie.arguments.length > 2) ? "; expires=" + setcookie.arguments[2].toGMTString() : "") +
                          "; path=/";
};
//................................
function delcookie(name)
{
        document.cookie = name + "=; expires=Thu, 01-Jan-70 00:00:00 GMT; path=/";
};
//--------------------------------
//    VARIOUS
//--------------------------------
var hide_objects_state = new Array();
var hide_objects_flag  = false;

function hide_objects()
{
        var flag   = (hide_objects.arguments.length > 0) ? hide_objects.arguments[0] : true;
        if (hide_objects_flag == flag) return;

        var list   = document.getElementsByTagName("object");
        var object = null;
        var c      = list.length;

        for (var i = 0; i < c; i++)
        {
                object = list.item(i);

                if (hide_objects_flag)
                {
                        object.style.visibility = hide_objects_state[i];
                        continue;
                };

                hide_objects_state[i]   = object.style.visibility;
                object.style.visibility = "hidden";
        };

        if (hide_objects_flag) hide_objects_state = new Array();
        hide_objects_flag = flag;
};
//................................
function show_objects()
{
        hide_objects(false);
};
