/*
// Copyright (c) 2006-2008 Finam.ru | http://www.finam.ru
// Author - Andrey Taritsyn
*/

// ************************************************************************************************************************
// *** ЭЛЕМЕНТЫ ***
// ************************************************************************************************************************

//Поиск элемента по имени (атрибуту id или name)
function GetElementByName(controlId)
{
    var control = document.getElementById(controlId);
    
    if (IsEmpty(control) == true)
    {
        control = document.getElementsByName(controlId)[0];
    }

    return control;
}

//Поиск элементов по названию класса
function GetElementsByClass(className, node, tagName)
{
	var classElements = new Array();
	
	if (node == null)
	{
		node = document;
	}
	
	if (tagName == null || tagName.length == 0)
	{
		tagName = "*";
	}
	
	var elementList = node.getElementsByTagName(tagName);
	var elementCounter = elementList.length;	
	var regExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
	
	for (var i = 0, j = 0; i < elementCounter; i++) 
	{
		if (regExp.test(elementList[i].className)) 
		{
			classElements[j] = elementList[i];
			j++;
		}
	}
	
	return classElements;
}

//Возвращает значение поля формы (тэги input и textarea)
function GetFieldValue(controlId)
{
    var result = null;
    var control = GetElementByName(controlId);
    var controlTagName = ToString(control.nodeName).toUpperCase();
    var controlType = ToString(control.getAttribute("type")).toLowerCase();
    
    if (controlTagName == "INPUT" && controlType == "checkbox")
    {
        result = control.checked;
    }
    else if(controlTagName == "INPUT" && controlType == "radio")
    {
		var controlList = document.getElementsByName(controlId);
		
		for (i = 0; i < controlList.length; i++)
		{
			if (controlList[i].checked == true)
			{
				result = controlList[i].value;
				break;
			}
		}
    }
    else if (controlTagName == "INPUT"
        || controlTagName == "TEXTAREA")
    {
        result = control.value;
    }
    else if (controlTagName == "SELECT")
    {
		result = control.options[control.selectedIndex].value;
    }
    
    return result;
}

//Задает значение поля формы (тэги input, textarea и select)
function SetFieldValue(controlId, controlValue)
{
    var control = GetElementByName(controlId);
    var controlTagName = ToString(control.nodeName).toUpperCase();
    var controlType = ToString(control.getAttribute("type")).toLowerCase();
    
    if (controlTagName == "INPUT" && controlType == "checkbox")
    {
        control.checked = controlValue;
    }
    else if (controlTagName == "INPUT"
        || controlTagName == "TEXTAREA"
        || controlTagName == "SELECT")
    {
        control.value = controlValue;
    }
}

//Возвращает значение, выбранное в раскрывающемся списке (тэг select)
function GetDropDownListValue(controlId)
{
	var control = GetElementByName(controlId);
	
	return control.options[control.selectedIndex].value;
}

//Возврашает название выбранного пункта раскрывающегося списка (тэг select)
function GetDropDownListText(controlId)
{
	var control = GetElementByName(controlId);
	
	return control.options[control.selectedIndex].text;
}

//Вставка нового узла после текущего
function InsertAfter(newNode, oldNode)
{
    var parentNode = oldNode.parentNode;
    
    parentNode.insertBefore(newNode, oldNode.nextSibling);
}

//Отображает/скрывает объект
function ToggleObject(objectId) 
{
	var currentObject = GetElementByName(objectId);
	
	if (currentObject.style.display != "none")
	{
        currentObject.style.display = "none";
	}
	else 
	{
		currentObject.style.display = "";
	}
}

// ************************************************************************************************************************
// *** СОБЫТИЯ ***
// ************************************************************************************************************************

//Добавляет событие
function AddEvent(control, eventType, userFunction, useCapture)
{
	if (IsEmpty(useCapture) == true)
	{
		useCapture = false;
	}

	if (control.addEventListener)
	{
		control.addEventListener(eventType, userFunction, useCapture);
	}
	else if (control.attachEvent)
	{
		control.attachEvent("on" + eventType, userFunction);
	}
	else
	{
		control["on" + eventType] = userFunction;
	}
}

//Удаляет событие
function RemoveEvent(control, eventType, userFunction, useCapture)
{
	if (IsEmpty(useCapture) == true)
	{
		useCapture = false;
	}
	
	if (control.removeEventListener)
	{  
		control.removeEventListener(eventType, userFunction, useCapture);
	}
	else if (control.detachEvent)
	{
		control.detachEvent("on" + eventType, userFunction);
	}
}

//Отменяет событие
function CancelEvent(e, disablePropagation)
{
	if (!e)
	{
		return;
	}

	e.returnValue = false;
	if (e.preventDefault)
	{
		e.preventDefault();
	}
	
	if (disablePropagation)
	{
		e.cancelBubble = true;
		if (e.stopPropagation)
		{
			e.stopPropagation();
		}
	}
}

//Получает источник события
function GetEventTarget(e)
{
    var e = e || window.event;
    var targ = e.target || e.srcElement;    
    if (targ.nodeType == 3)
    {
    //боремся с Safari
        targ = targ.parentNode;
    }

    return targ;
}

// ************************************************************************************************************************
// *** СТРОКИ ***
// ************************************************************************************************************************

//Преобразование в строку
function ToString(value, defaultValue)
{
	var string = null;

	if (IsEmpty(defaultValue) == true)
	{
		defaultValue = "";
	}
	
	if (IsEmpty(value) == false)
	{
		string = value.toString();
	}
	else
	{
		string = defaultValue;
	}
	
	return string;
}

//Проверка является ли значение строкой
function IsString(value)
{
	var result = false;
	
	if (IsEmpty(value) == false)
	{
		result = (typeof(value.valueOf()) == "string");
	}

	return result;
}

//Убирает пробелы слева
function LeftTrim(value)
{
    var result = String(value);
 
    if (result.length > 0)
    {
        result = result.replace(/^\s+/g, "");
    }

    return result;
}

//Убирает пробелы справа
function RightTrim(value)
{
    var result = String(value);
 
    if (result.length > 0)
    {
        result = result.replace(/\s+$/g, "");
    }

    return result;
}

//Убирает оконечные пробелы
function Trim(value)
{
 return RightTrim(LeftTrim(value));
}

//Генерирует из случайных символов строку заданной длины
function GenerateRandomString(stringLength)
{
	var symbolString = "Finam94ABCDEGHIJKLMNOPQRSTUVWXYZbcdefghjklopqrstuvwxyz01235678"; //строка символов
	var symbolStringLength = symbolString.length; //длина строки символов
	var randomNumber = 0; //случайное число
	var randomSymbol = ""; //случайный символ
	var result = ""; //результирующая переменная

	for (var i = 0; i < stringLength; i++)
	{
		randomNumber = parseInt(symbolStringLength * Math.random());			
		randomSymbol = symbolString.substr(randomNumber, 1);			
		
		result += randomSymbol;
	}
	
	return result;
}

// ************************************************************************************************************************
// *** ЧИСЛА ***
// ************************************************************************************************************************

//Подготавливает значение к преобразованию в число
function PrepareNumber(value, forCheck)
{
	var number = null;
	
	if (IsEmpty(value) == false)
	{
		number = value.toString()
		if (number.length > 0)
		{
			number = number.replace(/\s/igm, "");
			number = number.toLowerCase();
			
			if (forCheck == false)
			{
				if (number == "true")
				{
					number = 1;
					return number;
				}
				else if (number == "false")
				{
					number = 0;
					return number;
				}
			}

			number = number.replace(",", ".");
			number = number.replace(/^0*([0-9]+\.?[0-9]*)$/igm, "$1");
		}
		else
		{
			number = null;
		}
	}
	
	return number;
}

//Преобразование в целое число
function ToInt(value, defaultValue)
{
	if (IsEmpty(defaultValue) == true)
	{
		defaultValue = null;
	}

	var number = null;
	
	if (IsEmpty(value) == false)
	{
		number = PrepareNumber(value, false);
		if (IsEmpty(number) == false)
		{
			if (isNaN(number) == false)
			{
				number = parseInt(number);
			}
			else
			{
				number = null;
			}
		}
		else
		{
			number = null;
		}
	}
	
	if (number == null)
	{
		number = defaultValue;	
	}
	
	return number;
}

//Проверка является ли значение целым числом
function IsInt(value)
{
	var result = false;	
	var number = PrepareNumber(value, true);
	
	if (IsEmpty(number) == false)
	{
		if (isNaN(number) == false)
		{	
			if (number.toString().indexOf(".") == -1)
			{
				result = true;
			}
		}
	}

	return result;
}

//Преобразование в число двойной точности
function ToFloat(value, defaultValue)
{
	if (IsEmpty(defaultValue) == true)
	{
		defaultValue = null;
	}

	var number = null;
	
	if (IsEmpty(value) == false)
	{
		number = PrepareNumber(value, false);
		if (IsEmpty(number) == false)
		{
			if (isNaN(number) == false)
			{
				number = parseFloat(number);
			}
			else
			{
				number = null;
			}
		}
		else
		{
			number = null;
		}
	}
	
	if (number == null)
	{
		number = defaultValue;	
	}
	
	return number;
}

//Проверка является ли значение числом двойной точности
function IsFloat(value)
{
	var result = false;
	var number = PrepareNumber(value, true);
	
	if (IsEmpty(number) == false)
	{
		if (isNaN(number) == false)
		{	
			result = true;
		}
	}

	return result;
}

//Добавляет необходимое количество нулей к числу
function LZero(value, count)
{
    var result = ""; //результат
    var zeroString = ""; //строка нулей
    
    for (var i = 1; i <= count; i++ )
    {
        zeroString += 0;
    }
    
    result += zeroString;
    result += Trim(value);                
    result = result.substr(result.length - count, count)

    return result;
}

// ************************************************************************************************************************
// *** ЛОГИЧЕСКИЕ ЗНАЧЕНИЯ ***
// ************************************************************************************************************************

//Преобразование значения в логическое значение
function ToBoolean(value, defaultValue)
{
	var bool = null;

	if (IsEmpty(defaultValue) == true)
	{
		defaultValue = false;
	}

	if (IsBoolean(value) == true)
	{
		return value;
	}

	if (IsEmpty(value) == false)
	{
		bool = Trim(value.toString().toLowerCase());
		if (bool.length > 0)
		{
			if (bool == "true")
			{
				bool = true;
			}
			else if (bool == "false")
			{
				bool = false;
			}
			else
			{
				bool = ToInt(bool);
				if (bool > 0)
				{
					bool = true;
				}
				else
				{
					bool = false;
				}
			}
		}
		else
		{
			bool = null;
		}
	}
	
	if (bool == null)
	{
		bool = defaultValue;
	}
	
	return bool;
}

//Проверка является ли значение логическим значением
function IsBoolean(value)
{
	var result = false;
	
	if (IsEmpty(value) == false)
	{
		result = (typeof(value.valueOf()) == "boolean");
	}

	return result;
}

// ************************************************************************************************************************
// *** ДАТЫ ***
// ************************************************************************************************************************

//Преобразование значения в дату
function ToDate(value, defaultValue)
{
	var dateTime = null;	
	var date = null;
	var time = null;

	if (IsEmpty(defaultValue) == true)
	{
		defaultValue = null;
	}
	
	if (IsDate(value) == true)
	{
		return value;
	}

	if (IsEmpty(value) == false)
	{
		dateTime = Trim(value);
		if (dateTime.length > 0)
		{
			dateTime = dateTime.replace("\/", ".");
			dateTime = dateTime.replace("\\", ".");
			
			var dateTimeRegExp = new RegExp("^(\\d{1,2}\.\\d{1,2}\.\\d{1,4})(\\s\\d{1,2}:\\d{1,2}(:\\d{1,2})?)?$");			
			var dateTimeMatchList = dateTimeRegExp.exec(dateTime);
			
			if (IsEmpty(dateTimeMatchList) == false)
			{
				date = RegExp.$1;
				time = RegExp.$2;
				
				if (date.length > 0)
				{
					var year = 0;
					var month = 0;
					var day = 0;
					var hour = 0;
					var minute = 0;
					var second = 0;
					
					var dateRegExp = new RegExp("(\\d{1,2})\.(\\d{1,2})\.(\\d{1,4})")
					var dateMatchList = dateRegExp.exec(date);
					
					if (IsEmpty(dateMatchList) == false)
					{
						year = RegExp.$3;
						month = RegExp.$2;
						day = RegExp.$1;
						
						if (time.length > 0)
						{
							var timeRegExp = new RegExp("\\s(\\d{1,2}):(\\d{1,2}):?(\\d{1,2})?")
							var timeMatchList = timeRegExp.exec(time);
							
							if (IsEmpty(timeMatchList) == false)
							{
								hour = RegExp.$1;
								minute = RegExp.$2;
								second = RegExp.$3;
							}
							
							timeMatchList = null;
							timeRegExp = null;
						}
						
						year = ToInt(year, 0);
						month = ToInt(month, 0);
						day = ToInt(day, 0);
						hour = ToInt(hour, 0);
						minute = ToInt(minute, 0);
						second = ToInt(second, 0);

						try
						{
							dateTime = new Date(year, month - 1, day, hour, minute, second);
							if ((dateTime.getMonth() + 1) != month)
							{
								throw "Указанная Вами дата имеет некорректный формат!"
							}
						}
						catch(e)
						{
							dateTime = null;
						}
					}
					
					dateMatchList = null;
					dateRegExp = null;
				}
				else
				{
					dateTime = null;
				}
			}
			else
			{
				dateTime = null;
			}

			dateTimeMatchList = null;
			dateTimeRegExp = null;		
		}
		else
		{
			dateTime = null;
		}
	}

	if (dateTime == null)
	{
		dateTime = defaultValue;	
	}
	
	return dateTime;
}

//Проверка является ли значение датой
function IsDate(value)
{
	var result = false;

	if (IsEmpty(value) == false)
	{
		if (typeof(value) == "object")
		{
			try
			{
				value.getTime();
				result = true;
			}
			catch(e)
			{
				result = false;
			}
		}
	}

	return result;
}

// ************************************************************************************************************************
// *** РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ ***
// ************************************************************************************************************************

//Проверяет корректность формата адреса электронной почты
function IsEmail(email)
{
    var result = false;
    var emailRegExp = new RegExp("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", "ig");
    
    if (Trim(email).search(emailRegExp) != -1)
    {
        result = true;
    }
    else
    {
        result = false;
    }
    
    emailRegExp = null
    
    return result;
}

//Проверяет корректность формата URL
function IsUrl(url)
{
    var result = false;
    var urlRegExp = new RegExp("^http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?$", "ig");
    
    if (Trim(url).search(urlRegExp) != -1)
    {
        result = true;
    }
    else
    {
        result = false;
    }
    
    urlRegExp = null
    
    return result;
}

// ************************************************************************************************************************
// *** МАТЕМАТИКА ***
// ************************************************************************************************************************

//Округление чисел
function Round(number, places)
{
	var divider = 1;
	
	for (var i = 1; i < places; i++)
	{
		divider *= 10;
	}	
	
	return Math.round(number * divider) / divider	
}

// ************************************************************************************************************************
// *** ОКНА ***
// ************************************************************************************************************************

//Создание нового окна
function GetWindow(url, windowName, width, height)
{
    if (IsEmpty(windowName) == true)
    {
        windowName = "";
    }

	if (isNaN(width) || isNaN(height)) 
	{
	    width = 300; 
	    height = 650;
    }
    
	var currentWindow = window.open(url, windowName, "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=yes,width=" + width + ",height=" + height);
	currentWindow.focus();
}

// ************************************************************************************************************************
// *** GOOGLE ANALYTICS ***
// ************************************************************************************************************************

//Проверяет является ли ссылка ссылкой на другой сайт
function IsExternalLink(url)
{
	var host = "";
	var hostRegExp = null;
	var hostMatches = null;
	var currentHost = document.location.host.replace(/^www./ig, "");
	var result = false;

	hostRegExp = new RegExp("^http(s)?:\/\/(www\.)?(.[^\/]*)\/?(.*)$", "ig");
	hostMatches = hostRegExp.exec(url);

	if (IsEmpty(hostMatches) == false)
	{
		host = RegExp.$3;
	}
	
	hostMatches = null;
	hostRegExp = null;

	if (host.length > 0)
	{
		if (host != currentHost)
		{
			result = true;
		}
	}
	
	return result;
}

//Проверяет является ли ссылка ссылкой на файл
function IsFileLink(url)
{
	var fileExtensionList = new Array("doc", "xls", "ppt", "mdb", "mpp", "vsd",
		"txt", "csv", "rtf", "mht", "pdf", "djvu", "chm", "hlp",
		"jpg", "gif", "png", "tif", "bmp", "psd",
		"wav", "mid", "mp3",
		"swf", "avi", "wmv",
		"exe", "dll", "msi", "iso", "zip", "rar", "7z");
	var fileRegExp = new RegExp("^(.*)\.(" + fileExtensionList.join("|") + ")$", "ig");
	var result = fileRegExp.test(url);
	
	fileRegExp = null;
	fileExtensionList = null;
		
	return result;
}

//Заносит URL в статистику Google Analytics
function TrackLinkForGoogleAnalytics(url)
{
	pageTracker._trackPageview(url);
}

//Привязывает обработчик к ссылкам на другие сайты и файлы
function AttachLinkTrackerForGoogleAnalytics()
{
	var linkList = document.getElementsByTagName("A");
	var link = null;
	var url = "";
	var externalUrl = "";
	var fileUrl = "";
	
	if (IsEmpty(linkList) == false)
	{
		for (var i = 0; i < linkList.length; i++)
		{
			link = linkList[i];
			try
			{
				url = link.getAttribute("href");
			}
			catch(exception)
			{
				url = "";
			}

			if (IsEmpty(url) == false)
			{
				url = Trim(url);
			}
			else
			{
				url = "";
			}
			
			if (url.length > 0)
			{
				url = url.replace("\\", "\/");
				
				if (IsExternalLink(url) == true)
				{
					externalUrl = "\/outgoing\/" + url.replace(/:\/\//ig, "/").replace(/^http\/www./ig, "http\/");
					AddEvent(link, "click", new Function("TrackLinkForGoogleAnalytics(\"" + externalUrl + "\");"), false);
				}
				else
				{
					if (IsFileLink(url) == true)
					{
						fileUrl = url.replace(/^http(s)?:\/\/(www\.)?(.[^\/]*)/ig, "");
						AddEvent(link, "click", new Function("TrackLinkForGoogleAnalytics(\"" + fileUrl + "\");"), false);
					}
				}
			}
		}
	}
	
	link = null;
	linkList = null;
}

// ************************************************************************************************************************
// *** РАЗНОЕ ***
// ************************************************************************************************************************

//Проверка переменной на пустые значения
function IsEmpty(value)
{
    if (value == undefined || value == null || typeof(value) == "undefined")
    {
        return true;
    }
    else
    {
        return false;
    }
}

//Выводит элемент управления "Календарь"
function GetCalendar(currentDay, 
                    currentMonth, 
                    currentYear, 
                    functionName, 
                    language) 
{		
	var width = 171;
	var height = 169;
	
	var aLeft = 0;
	var aTop = 0;
	
	if (screen)
	{
		aLeft = Math.floor((screen.width - width) / 2);
		aTop = Math.floor((screen.height - height) / 2);
	}
	
	if (isNaN(language))
	{
	    language = 1;
	}
	
	var url = "";
	
	url += "/Calendar.asp?";
	url += "f=" + functionName;
	url += "&day=" + parseInt(currentDay);
	url += "&month=" + parseInt(currentMonth);
	url += "&year=" + parseInt(currentYear);
	url += "&l=" + parseInt(language);
	
	var calendar = window.open(url, "Calendar", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no, left=" + aLeft + "px, top=" + aTop + "px, width=" + width + "px, height=" + height + "px, scrollbars=0");
	calendar.focus();
}