// ************************************************************************************************************************
// *** ПРИВЕДЕНИЕ ТИПОВ ***
// ************************************************************************************************************************

jQuery.extend(
	{
		// Преобразование в строку
		toString: function(value, defaultValue)
		{
			var string = null;

			if (jQuery.isNullOrEmpty(defaultValue) == true)
			{
				defaultValue = "";
			}
			
			if (jQuery.isNullOrEmpty(value) == false)
			{
				string = value.toString();
			}
			else
			{
				string = defaultValue;
			}
			
			return string;
		},
		
		// Проверка является ли значение строкой
		isString: function(value)
		{
			var result = false;
			
			if (jQuery.isNullOrEmpty(value) == false)
			{
				result = (typeof(value.valueOf()) == "string");
			}

			return result;
		},
		
		// Подготавливает значение к преобразованию в число
		prepareNumber: function(value, forCheck)
		{
			var number = null;
			
			if (jQuery.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;
		},
		
		// Преобразование в целое число
		toInt: function(value, defaultValue)
		{
			if (jQuery.isNullOrEmpty(defaultValue) == true)
			{
				defaultValue = null;
			}

			var number = null;
			
			if (jQuery.isNullOrEmpty(value) == false)
			{
				number = jQuery.prepareNumber(value, false);
				if (jQuery.isNullOrEmpty(number) == false)
				{
					if (isNaN(number) == false)
					{
						number = parseInt(number);
					}
					else
					{
						number = null;
					}
				}
				else
				{
					number = null;
				}
			}
			
			if (number == null)
			{
				number = defaultValue;	
			}
			
			return number;
		},
		
		// Проверка является ли значение целым числом
		isInt: function(value)
		{
			var result = false;	
			var number = jQuery.prepareNumber(value, true);
			
			if (jQuery.isNullOrEmpty(number) == false)
			{
				if (isNaN(number) == false)
				{	
					if (number.toString().indexOf(".") == -1)
					{
						result = true;
					}
				}
			}

			return result;
		},
		
		// Преобразование в число двойной точности
		toFloat: function(value, defaultValue)
		{
			if (jQuery.isNullOrEmpty(defaultValue) == true)
			{
				defaultValue = null;
			}

			var number = null;
			
			if (jQuery.isNullOrEmpty(value) == false)
			{
				number = jQuery.prepareNumber(value, false);
				if (jQuery.isNullOrEmpty(number) == false)
				{
					if (isNaN(number) == false)
					{
						number = parseFloat(number);
					}
					else
					{
						number = null;
					}
				}
				else
				{
					number = null;
				}
			}
			
			if (number == null)
			{
				number = defaultValue;	
			}
			
			return number;
		},
		
		// Проверка является ли значение числом двойной точности
		isFloat: function(value)
		{
			var result = false;
			var number = jQuery.prepareNumber(value, true);
			
			if (jQuery.isNullOrEmpty(number) == false)
			{
				if (isNaN(number) == false)
				{	
					result = true;
				}
			}

			return result;
		},
		
		// Преобразование значения в логическое значение
		toBoolean: function(value, defaultValue)
		{
			var bool = null;

			if (jQuery.isNullOrEmpty(defaultValue) == true)
			{
				defaultValue = false;
			}

			if (jQuery.isBoolean(value) == true)
			{
				return value;
			}

			if (jQuery.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 = jQuery.toInt(bool);
						if (bool > 0)
						{
							bool = true;
						}
						else
						{
							bool = false;
						}
					}
				}
				else
				{
					bool = null;
				}
			}
			
			if (bool == null)
			{
				bool = defaultValue;
			}
			
			return bool;
		},
		
		// Проверка является ли значение логическим значением
		isBoolean: function(value)
		{
			var result = false;
			
			if (jQuery.isNullOrEmpty(value) == false)
			{
				result = (typeof(value.valueOf()) == "boolean");
			}

			return result;
		},
		
		// Преобразование значения в дату
		toDate: function(value, defaultValue)
		{
			var dateTime = null;
			var date = null;
			var time = null;

			if (jQuery.isNullOrEmpty(defaultValue) == true)
			{
				defaultValue = null;
			}
			
			if (jQuery.isDate(value) == true)
			{
				return value;
			}

			if (jQuery.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 (jQuery.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 (jQuery.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 (jQuery.isNullOrEmpty(timeMatchList) == false)
									{
										hour = RegExp.$1;
										minute = RegExp.$2;
										second = RegExp.$3;
									}
									
									timeMatchList = null;
									timeRegExp = null;
								}
								
								year = jQuery.toInt(year, 0);
								month = jQuery.toInt(month, 0);
								day = jQuery.toInt(day, 0);
								hour = jQuery.toInt(hour, 0);
								minute = jQuery.toInt(minute, 0);
								second = jQuery.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;
		},
		
		// Проверка является ли значение датой
		isDate: function(value)
		{
			var result = false;

			if (jQuery.isNullOrEmpty(value) == false)
			{
				if (typeof(value) == "object")
				{
					try
					{
						value.getTime();
						result = true;
					}
					catch(e)
					{
						result = false;
					}
				}
			}

			return result;
		},
		
		// URL-кодирует строку
		urlEncode: function(value)
		{
			var result = value;
		    
			result = result.toString();
			result = encodeURIComponent(result);
			result = result.replace(/%20/g, "+");

			return result;
		},
		
		// URL-декодирует строку
		urldecode: function(value)
		{
			var result = value;

			result = result.toString();
			result = result.replace(/\+/g, "%20");
			result = decodeURIComponent(result);

			return result;
		}
	}
);

// ************************************************************************************************************************
// *** РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ ***
// ************************************************************************************************************************
jQuery.extend(
	{
		// Проверяет корректность формата адреса электронной почты
		checkEmail: function(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
		chekUrl: function(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;
		}
	}
);

// ************************************************************************************************************************
// *** МАТЕМАТИКА ***
// ************************************************************************************************************************
jQuery.extend(
	{
		// Округление чисел
		round: function(number, places)
		{
			var divider = 1;
			
			for (var i = 1; i < places; i++)
			{
				divider *= 10;
			}	
			
			return Math.round(number * divider) / divider;
		}
	}
);

// ************************************************************************************************************************
// *** ПРОВЕРКА ВОЗМОЖНОСТЕЙ БРОУЗЕРА ***
// ************************************************************************************************************************
jQuery.extend(
	{
		// Проверяет поддерживает ли броузер CSS-прозрачность
		checkBrowserOpacitySupport: function()
		{
			return !(jQuery.browser.msie && parseInt(jQuery.browser.version) < 6);
		},

		// Проверяет наличие в броузере проблемы с тэгами select, которые 
		// просвечиваются сквозь другие элементы
		checkBrowserTagSelectBugExist: function()
		{
			return (jQuery.browser.msie && parseInt(jQuery.browser.version) < 7);
		}
	}
);

// ************************************************************************************************************************
// *** РИСУНКИ ***
// ************************************************************************************************************************
jQuery.extend(
	{
		// Программно создает рисунок (для предварительной загрузки)
		createImage: function(imagePath)
		{
			var newImage = new Image();
			newImage.src = imagePath;
			
			return newImage;
		},
		
		// Возвращает путь к рисунку с использованием нового суффикса
		getImageUrl: function(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;
		}
	}
);

// ************************************************************************************************************************
// *** ОКНА ***
// ************************************************************************************************************************
jQuery.extend(
	{
		// Создание нового окна
		getWindow: function(url, windowName, width, height)
		{
			if (jQuery.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();
		}	
	}
);

// ************************************************************************************************************************
// *** РАЗНОЕ ***
// ************************************************************************************************************************
jQuery.extend(
	{
		// Проверка переменной на пустые значения
		isNullOrEmpty: function(value)
		{
			if (value == undefined || value == null || typeof(value) == "undefined")
			{
				return true;
			}
			else
			{
				return false;
			}
		},
		
		// Генерирует из случайных символов строку заданной длины
		generateRandomString: function(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;
		},
		
		// Добавляет необходимое количество нулей к числу
		formatZero: function(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;
		}
	}
);

jQuery.fn.extend(
	{
		// Прокручивает окно броузера к началу/концу текущего элемента
		scrollIntoView: function(scrollToTop)
		{
			var control = $(this);
			var offset = control.offset();
			var isScrollToTop = jQuery.toBoolean(scrollToTop, true);
			
			var top = offset.top + 
				jQuery.toInt(control.css("paddingTop"), 0) + 
				jQuery.toInt(control.css("borderTopWidth"), 0);
				
			if (!isScrollToTop)
			{
				top += control.height() + 
					jQuery.toInt(control.css("paddingBottom"), 0) + 
					jQuery.toInt(control.css("borderBottomWidth"), 0);
			}
			
			var left = offset.left + 
				jQuery.toInt(control.css("paddingLeft"), 0) + 
				jQuery.toInt(control.css("borderLeftWidth"));
			
			window.scrollTo(left, top);
			
			offset = null;
			control = null;
		}
	}
);