// ************************************************************************************************************************
// *** ЭЛЕМЕНТЫ ***
// ************************************************************************************************************************

// Поиск элемента по имени (атрибуту id или name)
function $()
{
	var elements = new Array();
	
	for (var i = 0; i < arguments.length; i++)
	{
		var element = arguments[i];
		if (typeof(element) == "string")
		{
			if (document.getElementById)
			{
				element = document.getElementById(element);
			}
			else if (document.all)
			{
				element = document.all[element];
			}
		}
		
		if (arguments.length == 1)
		{
			return element;
		}
		
		elements.push(element);
	}
	
	if (elements.length == -1)
	{
		elements = null;
	}
	
	return elements;
}

// Поиск элементов по названию класса
function getElementsByClass(node, className, 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;
}

// Вставка нового узла после текущего
function insertAfter(newNode, oldNode)
{
    var parentNode = oldNode.parentNode;
    
    parentNode.insertBefore(newNode, oldNode.nextSibling);
}

// Удаляет дочерние элементы
function removeChildNodes(node)
{
	if (!node)
	{
		return;
	}

	while (node.hasChildNodes())
	{
		node.removeChild(node.firstChild);
	}
}

// Отображает/скрывает объект
function toggle(objectId) 
{
	var currentObject = GetElementByName(objectId);
	
	if (currentObject.style.display != "none")
	{
        currentObject.style.display = "none";
	}
	else 
	{
		currentObject.style.display = "";
	}
}

// ************************************************************************************************************************
// *** COOKIE ***
// ************************************************************************************************************************

// Получает значение элемента Cookie
function getCookie(name)
{
	var cookieString = unescape(document.cookie).trim(); // содержимое Cookie
	var cookieList = null; // список элементов Cookie
	var cookieElement = null; // элемент Cookie
	var result = null; // результирующая переменная
	
	if (cookieString.length > 0)
	{
		cookieList = cookieString.split(";"); 		
		for (var i = 0; i < cookieList.length; i++)
		{
			if (toString(cookieList[i], "").trim().length > 0)
			{
				cookieElement = cookieList[i].split("=");			
				if (toString(cookieElement[0], "").trim() == name)
				{
					result = cookieElement[1];
					break;
				}
			}
		}
	}
	
	cookieElement = null;
	cookieList = null;
	
	return result;
}

// Устанавливает значение элемента Cookie
function setCookie(name, value, expiresDate, path, domain, secure)
{
	document.cookie = name + "=" + escape(value) +
		((isNullOrEmpty(expiresDate) == false) ? "; expires=" + expiresDate.toGMTString() : "") +
		((isNullOrEmpty(path) == false) ? "; path=" + path : "; path=/") +
		((isNullOrEmpty(domain) == false) ? "; domain=" + domain : "") +
		((isNullOrEmpty(secure) == false) ? "; secure" : "");
}

// Удаляет элемент Cookie
function deleteCookie(name, path, domain)
{
	if (toString(getCookie(name), "").length > 0)
	{
		document.cookie = name + "=" +
			((isNullOrEmpty(path) == false) ? " ; path=" + path : "; path=/") +
			((isNullOrEmpty(domain) == false) ? "; domain=" + domain : "") +
			"; expires=Thu, 01 Jan 1970 00:00:01 GMT";
	}
}

// ************************************************************************************************************************
// *** СОБЫТИЯ ***
// ************************************************************************************************************************

// Добавляет событие
function addEvent(control, eventType, userFunction, useCapture)
{
	if (isNullOrEmpty(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 (isNullOrEmpty(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 addLoadEvent(userFunction)
{
	var oldFunction = window.onload;
	if (typeof window.onload != "function")
	{
		window.onload = userFunction;
	}
	else
	{
		window.onload = function()
		{
			oldFunction();
			userFunction();
		}
	}
}

// ************************************************************************************************************************
// *** МАССИВЫ ***
// ************************************************************************************************************************

// Добавляет значение в массив
Array.prototype.add = function(value)
{
	this[this.length] = value;
}

// ************************************************************************************************************************
// *** РИСУНКИ ***
// ************************************************************************************************************************

// Программно создает рисунок (для предварительной загрузки)
function createImage(imagePath)
{
	var newImage = new Image();
	newImage.src = imagePath;
	
	return newImage;
}

// Возвращает путь к рисунку с использованием нового суффикса
function getImageUrl(imageUrl, mode, oldSuffix, newSuffix)
{
	var oldSuffixRegexp = new RegExp("(" + oldSuffix + ")(\.[a-z]+)$", "ig");
	var newSuffixRegexp = new RegExp("(" + newSuffix + ")(\.[a-z]+)$", "ig");
	var newImageUrl = imageUrl;
		
	if (mode == "over")
	{
		if (imageUrl.search(newSuffixRegexp) == -1)
		{
			newImageUrl = imageUrl.replace(oldSuffixRegexp, newSuffix + "$2");
		}
	}
	else if (mode == "out")
	{
		if (imageUrl.search(oldSuffixRegex) == -1)
		{
			newImageUrl = imageUrl.replace(newSuffixRegexp, oldSuffix + "$2");
		}
	}
	
	return newImageUrl;
}


// ************************************************************************************************************************
// *** СТРОКИ ***
// ************************************************************************************************************************

// Преобразование в строку
function toString(value, defaultValue)
{
	var string = null;

	if (isNullOrEmpty(defaultValue) == true)
	{
		defaultValue = "";
	}
	
	if (isNullOrEmpty(value) == false)
	{
		string = value.toString();
	}
	else
	{
		string = defaultValue;
	}
	
	return string;
}

// Проверка является ли значение строкой
function isString(value)
{
	var result = false;
	
	if (isNullOrEmpty(value) == false)
	{
		result = (typeof(value.valueOf()) == "string");
	}

	return result;
}

// Убирает пробелы слева
String.prototype.trimStart = function()
{
	var result = this;	
	if (result.length > 0)
	{
		result = result.replace(/^\s+/, "");
	}
	
    return result;
}

// Убирает пробелы справа
String.prototype.trimEnd = function()
{
	var result = this;
	if (result.length > 0)
	{
		result = result.replace(/\s+$/, "");
	}

    return result;
}

// Убирает оконечные пробелы
String.prototype.trim = function ()
{
	var result = this;
	if (result.length > 0)
	{
		result = result.replace(/^\s+|\s+$/g, "");
	}
	
    return result;
}

// Сравнивает строку с указанным префиксом
String.prototype.startsWith = function(prefix)
{
	return (this.substr(0, prefix.length) === prefix);
}

// Сравнивает строку с указанным суффиксом
String.prototype.endsWith = function(suffix)
{
	return (this.substr(this.length - suffix.length) === suffix);
}

// URL-кодирует строку
function urlEncode(value)
{
    var result = value;
    
    result = result.toString();
    result = encodeURIComponent(result);
    result = result.replace(/%20/g, "+");

    return result;
}

// URL-декодирует строку
function urldecode(value)
{
    var result = value;

    result = result.toString();
    result = result.replace(/\+/g, "%20");
    result = decodeURIComponent(result);

    return result;
}

// Генерирует из случайных символов строку заданной длины
function generateRandomString(stringLength)
{
	var symbolString = "Pravo94ABCDEFGHIJKLMNOQRSTUVWXYZbcdefghijklmnpqstuwxyz01235678"; // строка символов
	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 (isNullOrEmpty(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 (isNullOrEmpty(defaultValue) == true)
	{
		defaultValue = null;
	}

	var number = null;
	
	if (isNullOrEmpty(value) == false)
	{
		number = prepareNumber(value, false);
		if (isNullOrEmpty(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 (isNullOrEmpty(number) == false)
	{
		if (isNaN(number) == false)
		{	
			if (number.toString().indexOf(".") == -1)
			{
				result = true;
			}
		}
	}

	return result;
}

// Преобразование в число двойной точности
function toFloat(value, defaultValue)
{
	if (isNullOrEmpty(defaultValue) == true)
	{
		defaultValue = null;
	}

	var number = null;
	
	if (isNullOrEmpty(value) == false)
	{
		number = prepareNumber(value, false);
		if (isNullOrEmpty(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 (isNullOrEmpty(number) == false)
	{
		if (isNaN(number) == false)
		{	
			result = true;
		}
	}

	return result;
}

// Добавляет необходимое количество нулей к числу
function formatZero(value, count)
{
    var result = ""; // результат
    var zeroString = ""; // строка нулей
    
    for (var i = 1; i <= count; i++ )
    {
        zeroString += 0;
    }
    
    result += zeroString;
    result += value.trim();                
    result = result.substr(result.length - count, count)

    return result;
}

// ************************************************************************************************************************
// *** ЛОГИЧЕСКИЕ ЗНАЧЕНИЯ ***
// ************************************************************************************************************************

// Преобразование значения в логическое значение
function toBoolean(value, defaultValue)
{
	var bool = null;

	if (isNullOrEmpty(defaultValue) == true)
	{
		defaultValue = false;
	}

	if (isBoolean(value) == true)
	{
		return value;
	}

	if (isNullOrEmpty(value) == false)
	{
		bool = value.toString().toLowerCase().trim();
		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 (isNullOrEmpty(value) == false)
	{
		result = (typeof(value.valueOf()) == "boolean");
	}

	return result;
}

// ************************************************************************************************************************
// *** ДАТЫ ***
// ************************************************************************************************************************

// Преобразование значения в дату
function toDate(value, defaultValue)
{
	var dateTime = null;	
	var date = null;
	var time = null;

	if (isNullOrEmpty(defaultValue) == true)
	{
		defaultValue = null;
	}
	
	if (isDate(value) == true)
	{
		return value;
	}

	if (isNullOrEmpty(value) == false)
	{
		dateTime = value.trim();
		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 (isNullOrEmpty(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 (isNullOrEmpty(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 (isNullOrEmpty(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 (isNullOrEmpty(value) == false)
	{
		if (typeof(value) == "object")
		{
			try
			{
				value.getTime();
				result = true;
			}
			catch(e)
			{
				result = false;
			}
		}
	}

	return result;
}

// ************************************************************************************************************************
// *** РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ ***
// ************************************************************************************************************************

// Проверяет корректность формата адреса электронной почты
function checkEmail(email)
{
    var result = false;
    var emailRegExp = new RegExp("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", "ig");
    
    if (email.trim().search(emailRegExp) != -1)
    {
        result = true;
    }
    else
    {
        result = false;
    }
    
    emailRegExp = null
    
    return result;
}

// Проверяет корректность формата URL
function chekUrl(url)
{
    var result = false;
    var urlRegExp = new RegExp("^http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?$", "ig");
    
    if (url.trim().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 (isNullOrEmpty(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();
}

// ************************************************************************************************************************
// *** РАЗНОЕ ***
// ************************************************************************************************************************

// Проверка переменной на пустые значения
function isNullOrEmpty(value)
{
    if (value == undefined || value == null || typeof(value) == "undefined")
    {
        return true;
    }
    else
    {
        return false;
    }
}


function GoToVideoPart(divid, mediapath, mediatime, width, height)
{
	var Div = document.getElementById(divid);
	
	var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
	
	//--------------------------------------------------
	var playerhtml = '';
	playerhtml = '<object id="MediaPlayer1" width="' + width + '" height="' + height + '"' +
	  'classid="CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6"' +
	  'type="application/x-oleobject">' +
		'<param name="URL" value="' + mediapath + '">' +
		'<param name="ShowControls" value="true">' +
		'<param name="VideoBorderWidth" value="0">' +
		'<param name="AutoStart" value="true">' +
		'<param name="EnableContextMenu" value="false">' +
		'<param name="EnablePositionControls" value="true">' +
		'<param name="stretchToFit" value="false">' +
		'<param name="uiMode" value="full">' +
		'<param name="CurrentPosition" value="' + mediatime + '">' +
		'<embed' +
			'src="' + mediapath + '" mce_src="' + mediapath + '"' +
			'height="' + height + '" width="' + width + '"' +
			'autostart="1"' +
			'showcontrols="1"' +
			'videoborderwidth="0"' +
			'uimode="none"' +
			'stretchtofit="0"' +
			'border="0"' +
			'type="application/x-mplayer2"' +
			'CurrentPosition="' + mediatime + '"' +
	  '></embed>' +
	'</object>';
	
	
	Div.innerHTML = '';
	
	
	if(isIE)
	{
		Div.innerHTML = playerhtml;
		document.getElementById('MediaPlayer1').controls.currentposition = mediatime;
	}
	else
	{
		var pObject = document.createElement('object');
		pObject.setAttribute('id', 'MediaPlayer1');
		pObject.setAttribute('width', width);
		pObject.setAttribute('height', height);
		pObject.setAttribute('classid', 'CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6');
		pObject.setAttribute('type', 'application/x-oleobject');
		
		var ObjectParam = document.createElement('param');
		ObjectParam.setAttribute('name', 'URL');
		ObjectParam.setAttribute('value', mediapath);
		pObject.appendChild(ObjectParam);
		
		ObjectParam = document.createElement('param');
		ObjectParam.setAttribute('name', 'ShowControls');
		ObjectParam.setAttribute('value', 'true');
		pObject.appendChild(ObjectParam);
		
		ObjectParam = document.createElement('param');
		ObjectParam.setAttribute('name', 'VideoBorderWidth');
		ObjectParam.setAttribute('value', '0');
		pObject.appendChild(ObjectParam);
		
		ObjectParam = document.createElement('param');
		ObjectParam.setAttribute('name', 'AutoStart');
		ObjectParam.setAttribute('value', 'true');
		pObject.appendChild(ObjectParam);
		
		ObjectParam = document.createElement('param');
		ObjectParam.setAttribute('name', 'EnableContextMenu');
		ObjectParam.setAttribute('value', 'false');
		pObject.appendChild(ObjectParam);
		
		ObjectParam = document.createElement('param');
		ObjectParam.setAttribute('name', 'EnablePositionControls');
		ObjectParam.setAttribute('value', 'true');
		pObject.appendChild(ObjectParam);
		
		ObjectParam = document.createElement('param');
		ObjectParam.setAttribute('name', 'stretchToFit');
		ObjectParam.setAttribute('value', 'false');
		pObject.appendChild(ObjectParam);
		
		ObjectParam = document.createElement('param');
		ObjectParam.setAttribute('name', 'uiMode');
		ObjectParam.setAttribute('value', 'full');
		pObject.appendChild(ObjectParam);
		
		ObjectParam = document.createElement('param');
		ObjectParam.setAttribute('name', 'CurrentPosition');
		ObjectParam.setAttribute('value', mediatime);
		pObject.appendChild(ObjectParam);
		ObjectParam = null
		
		
		var ObjectEmbed = document.createElement('embed');
		ObjectEmbed.setAttribute('src', mediapath);
		ObjectEmbed.setAttribute('mce_src', mediapath);
		ObjectEmbed.setAttribute('width', width);
		ObjectEmbed.setAttribute('height', height);
		ObjectEmbed.setAttribute('autostart', '1');
		ObjectEmbed.setAttribute('showcontrols', '1');
		ObjectEmbed.setAttribute('videoborderwidth', '0');
		ObjectEmbed.setAttribute('uimode', 'none');
		ObjectEmbed.setAttribute('stretchtofit', '0');
		ObjectEmbed.setAttribute('border', '0');
		ObjectEmbed.setAttribute('type', 'application/x-mplayer2');
		ObjectEmbed.setAttribute('CurrentPosition', mediatime);
		pObject.appendChild(ObjectEmbed);
		
		
		
		Div.appendChild(pObject);
	}
}
