/*************************************************************
*                     ОСНОВНЫЕ НАСТРОЙКИ
*************************************************************/
var CONFIG = new Array();
CONFIG['dir'] = new Array();
CONFIG['dir']['XMLHR'] = '/http/ajax/';
CONFIG["TRUE_IMAGES_TYPES"] = new Array('jpg', 'jpeg');
CONFIG["LANG"] = 'en';
CONFIG['messages'] = new Array();
CONFIG['messages']['forms'] = new Array();

CONFIG['messages']['ru'] = new Array();
CONFIG['messages']['en'] = new Array();

CONFIG['messages']['ru']['forms'] = new Array();
CONFIG['messages']['en']['forms'] = new Array();

CONFIG['messages']['ru']['forms']['exception'] = 'formObj не является объектом формы!';
CONFIG['messages']['ru']['forms']['empty_input_fields'] = 'Заполнены не все поля формы!';
CONFIG['messages']['ru']['forms']['filter_field_digit'] = 'В данное поле допускается вводить только цифры (0-9)';
CONFIG['messages']['ru']['forms']['filter_field_alnum'] = 'В данное поле допускается вводить только цифры (0-9), символы латинского алфавита (a-z), знаки `_` и `-`';

CONFIG['messages']['en']['forms']['exception'] = 'formObj is not forms object!';
CONFIG['messages']['en']['forms']['empty_input_fields'] = 'Not all fields are filled!';
CONFIG['messages']['en']['forms']['filter_field_digit'] = 'In this field is allowed to enter only numbers (0-9)';
CONFIG['messages']['en']['forms']['filter_field_alnum'] = 'In this field is allowed to enter only numbers (0-9), symbols of the Latin alphabet (az), marks `_` and `-`';

/*************************************************************
*                     ИСКЛЮЧЕНИЯ
*************************************************************/
/**
* Пользовательское исключение.
* 
* @param string сообщение об ошибке
* @return void
*/
function UserException(message)
{
   this.name = "UserException";
   this.message = this.name + ': ' + message;
}

/*************************************************************
* Определение броузера.
* Взято с kruglov.ru
*************************************************************/
var isDOM = document.getElementById //DOM1 browser (MSIE 5+, Netscape 6, Opera 5+)
var isOpera = isOpera5 = window.opera && isDOM //Opera 5+
var isOpera6 = isOpera && window.print //Opera 6+
var isOpera7 = isOpera && document.readyState //Opera 7+
var isMSIE = document.all && document.all.item && !isOpera //Microsoft Internet Explorer 4+
var isMSIE5 = isDOM && isMSIE //MSIE 5+
var isNetscape4 = document.layers //Netscape 4.*
var isMozilla = isDOM && navigator.appName == "Netscape" //Mozilla или Netscape 6.*


/*************************************************************
* Рабочая область
*************************************************************/
function getScrollLeft()
{
    return  window.pageXOffset
            || document.documentElement.scrollLeft
            || document.body.scrollLeft
            || 0;
}

function getScrollTop()
{
    return window.pageYOffset
           || document.documentElement.scrollTop
           || document.body.scrollTop
           || 0;
}

function getClientHeight()
{
    return document.documentElement.clientHeight;
}

function getClientWidth()
{
    return document.documentElement.clientWidth;
}

/*************************************************************
* Строковые функции
*************************************************************/

/**
* Метод возвращает false если строка пуста,
* т.е. не содержит символов, или не содержит символов,
* отличных от пробельных.
* 
* @param void
* @return boolean
*/
String.prototype.noempty = function()
{
    if (this == '' || this == null) {
        return false;
    }

    for (var j=0; j < this.length; j++)
    {
        if (this.charAt(j)!=" " && this.charAt(j)!="\n" && this.charAt(j)!="\t" && this.charAt(j)!="\r") {
            return true;
        }
    }
    
    return false;
}

/**
* Метод возвращает true если строка 
* является email-адресом 
* и false в обратном случает.
* 
* @param void
* @return boolean
*/
String.prototype.is_mail = function()
{
    var reg = new RegExp("^\s*([_\.\da-z0-9\-]+@)([\da-z0-9][\da-z0-9\-]+\.)+([a-z]{2,4})\s*$", "i");

    return this.match(reg);
}

/**
* Возвращает имя файла из строки.
* Т.е. из строки-пути C:\documents\Документы\Фотографии\Irachka.jpg
* функция вернёт Irachka.jpg если get_ext установлен в 1 и имя файла
* без расширения в обратном случае.
* 
* @param bolean with_ext возвращать имя файла с расширением
* @return string
*/
String.prototype.getFileName = function(with_ext)
{
    if (!this) {
        return '';
    }

    var filename = this.substring(this.lastIndexOf("\\")+1, this.length);

    // возвратить вместе с расширением
    if (with_ext)
    {
        return filename;
    }

    // возвратить без расширения
    return filename.substring(0, filename.lastIndexOf('.'));
}

/**
* Преобразует первый символ строки в прописной.
* @param void
* @return string
*/
String.prototype.ucfirst = function()
{
    var s1 = this.charAt(0).toUpperCase();
    var s2 =  this.substring(1, this.length);
    return s1 + s2;
}

/**
* Ищет в строке окончания похожее на один из типов изображений,
* перечисленных в массиве CONFIGS["TRUE_IMAGES_TYPES"].
* Возвращает TRUE, если такое окончание найдено, FALSE при неудаче.
* 
* @param string path путь к файлу-изображению
* @return boolean
*/
String.prototype.hasImageExt = function()
{
    var type = this.substr(this.lastIndexOf(".")+1).toLowerCase();

    return (CONFIG["TRUE_IMAGES_TYPES"].in_array(type) != -1);
}

/*************************************************************
* Функции массива
*************************************************************/

/**
* Метод ищет в массиве значение arg и 
* возвращает индекс элемента, если оно там присутствует
* и -1 если заданного значения в массиве нет
*/
Array.prototype.in_array = function(arg)
{
	for (var i=0; i < this.length; i++)
    {
		if (this[i] == arg)
        {
		    return i;
		}
	}

	return -1;
}

/*************************************************************
* Прочие функции
*************************************************************/

/**
* Функция получает выделение со страницы и возвращает его.
* Если выделение прошло неудачно, возвращает FALSE.
* 
* @param void
* @return string|false
*/
function get_selection()
{
    if (document.getSelection)
    {
        return document.getSelection();
    }
    else if (document.selection && document.selection.createRange && document.selection.type == "Text")
    {
        return document.selection.createRange().text;
    }

    return false;
}

/*function get_select_comment(textarea_id)
{
    var selec = get_selection();

    if (!selec)
	{
        alert("Для вставки цитаты необходимо выделить нужное мышью");
    }
	else
    {
        var name_str = '';
        var lnk = document.getElementById(textarea_id);
        var oldval = lnk.value;     
        lnk.value = oldval + '[Q]' + selec + "[/Q] ";
        lnk.focus();
	}

    return false;
}*/

/**
* Копирование в буфер текста text
* 
* @param string
* @return boolean
*/
function copyInBuffer(text)
{
    if (window.clipboardData)
    {
        window.clipboardData.setData("Text", text);
    }

    return false;
}

// Открытие всплывающего окна с адресом path и размеракми width и height.
function openWindow(path, width, height)
{
    var l = (screen.availWidth - width)/2;
    var t = (screen.availHeight - height)/2;

    var win = window.open(path, '', 'width='+width+', height='+height+',toolbar=0,menubar=0,scrollbars=1,resizable=1,location=0,status=0,left=' + l + ',top=' + t + '');
    win.focus();
}

/**
* Возвращает метку timestamp UNIX
* 
* @param void
* @return int
*/
function getUnixTimestamp()
{
    var now = new Date();
    var str = new String(Date.UTC(now.getUTCFullYear(),
                         now.getUTCMonth(),
                         now.getUTCDate(),
                         now.getUTCHours(),
                         now.getUTCMinutes(),
                         now.getUTCSeconds(),
                         now.getUTCMilliseconds()));
    return str.slice(0, -3);
}