// учим jQuery.val() правильно учитывать плэйсхолдер
$.fn.value=$.fn.val;$.fn.val=function(b){var a=$.fn.value.apply(this,arguments);if(!b&&this.attr("placeholder")==a)return"";return a};

/** Обработка плэйсхолдеров в инпутах (inputDefaults)
 *
 * @author Amal Samally [amal.samally(at)gmail.com]
 * @version 1.2
 */
$.fn.inputDefaults=function(d){return this.filter("input,textarea").each(function(){if(typeof d=="string")d={text:d};var a=$(this),b=$.extend({cl:"inactive",text:a.attr("placeholder")},d);b.text&&a.attr("placeholder",b.text).focusin(function(){var c=$.trim(a.value());if(c==""||c==b.text)a.val("");a.removeClass(b.cl)}).focusout(function(){var c=$.trim(a.value());if(c==""||c==b.text)a.val(b.text).addClass(b.cl)}).focusin().focusout()})};

/* Пространство имен для набора общих функций */
var commonFunctions = {
	/*
	 *  Функция для проверки валидности email
	 */
	checkEmail: function(email) {
		return /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.test(email.toLowerCase());
	},

	/*
	 *  Функция для проверки валидности даты в различных форматах
	 *
	 *  1 - dd.mm.yyyy
	 *  2 - dd.mm.yy
	 *  3 - dd/mm/yyyy
	 *  4 - dd/mm/yy
	 */
	checkDate: function(date, type) {
		var pattern = null;
		switch (type) {
			case 1:
				pattern = /^[\d]{2}[.][\d]{2}[.][\d]{4}$/;
				break;
			case 2:
				pattern = /^[\d]{2}[.][\d]{2}[.][\d]{2}$/;
				break;
			case 3:
				pattern = /^[\d]{2}[\/][\d]{2}[\/][\d]{4}$/;
				break;
			case 4:
				pattern = /^[\d]{2}[\/][\d]{2}[\/][\d]{2}$/;
				break;
		}

		// Проверка соответствия регулярному выражению
		if (date.match(pattern)) {
			var splitChar = '.';
			if (type > 2) {
				splitChar = '/';
			}
			var date_array = date.split(splitChar),
				day = date_array[0],
				month = date_array[1] - 1,
				year = date_array[2],
				yearInt = parseInt(year, 10);
			if (yearInt < 100) {
				if (yearInt < 70) {
					year = '20' + year;
				} else {
					year = '19' + year;
				}
			}
			// Проверка корректности даты
			var sourceDate = new Date(year, month, day);
			if ((sourceDate.getFullYear() != year) ||
				(sourceDate.getMonth() != month) ||
				(sourceDate.getDate() != day)) {
				return false;
			}
		} else {
			return false;
		}
		return true;
	},

	/*
	 *  Функция для проверки валидности времени
	 */
	checkTime: function(time) {
		var strTime = time.match(/[\d]{2}/g);
		if (strTime)
			if (strTime.length == 2) {
				if ((parseInt(strTime[0], 10) < 0) || (parseInt(strTime[0], 10) > 23))
					return false;
				else
					if ((parseInt(strTime[1], 10) < 0) || (parseInt(strTime[1], 10) > 59))
						return false;
			}
			else
				return false;
		else
			return false;
		return true;
	},

	/*
	 *  Функция для проверки валидности интервала времени
	 */
	checkInterval: function(time) {
		// Разбиваем строку на два времени
		var strTimeArray = time.match(/[\d]{1,2}\:[\d]{2}/g);
		if (strTimeArray)
			if (strTimeArray.length == 2) {
				for (var i = 0; i < 2; i++) {
					var strTime = strTimeArray[i].match(/[\d]{2}/g);
					if (strTime)
						if (strTime.length == 2) {
							if ((parseInt(strTime[0], 10) < 0) || (parseInt(strTime[0], 10) > 23))
								return false;
							else
								if ((parseInt(strTime[1], 10) < 0) || (parseInt(strTime[1], 10) > 59))
									return false;
						}
						else
							return false;
					else
						return false;
				}
				if (strTimeArray[0] >= strTimeArray[1])
					return false;
			}
			else
				return false;
		else
			return false;
		return true;
	},

	/*
	 *  Функция для проверки валидности телефонного номера в различных форматах
	 *
	 *  1: +x(xxx)xxxxxx
	 *  2: +x (xxx) xxxxxx
	 *  3: +x(xxx)xx-xx-xx
	 *  4: +x (xxx) xx-xx-xx
	 *  5: (xxx)xxxxxx
	 *  6: (xxx) xxxxxx
	 *  7: (xxx)xx-xx-xx
	 *  8: (xxx) xx-xx-xx
	 *  9: xxxxxx
	 *  10: xx-xx-xx
	 */
	checkPhone: function(phone, type) {
		var pattern = null;

		switch (type) {
			case 1:
				pattern = /^\+[\d]\([\d]{3,5}\)[\d]{5,7}$/;
				break;
			case 2:
				pattern = /^\+[\d]\s\([\d]{3,5}\)\s[\d]{5,7}$/;
				break;
			case 3:
				pattern = /^\+[\d]\([\d]{3,5}\)[\d]{1,3}[-][\d]{2}[-][\d]{2}$/;
				break;
			case 4:
				pattern = /^\+[\d]\s\([\d]{3,5}\)\s[\d]{1,3}[-][\d]{2}[-][\d]{2}$/;
				break;
			case 5:
				pattern = /^\([\d]{3,5}\)[\d]{5,7}$/;
				break;
			case 6:
				pattern = /^\([\d]{3,5}\)\s[\d]{5,7}$/;
				break;
			case 7:
				pattern = /^\([\d]{3,5}\)[\d]{1,3}[-][\d]{2}[-][\d]{2}$/;
				break;
			case 8:
				pattern = /^\([\d]{3,5}\)\s[\d]{1,3}[-][\d]{2}[-][\d]{2}$/;
				break;
			case 9:
				pattern = /^[\d]{5,7}$/;
				break;
			case 10:
				pattern = /^[\d]{1,3}[-][\d]{2}[-][\d]{2}$/;
				break;
		}
		return !!phone.match(pattern);
	},

	/*
	 *  Функция для проверки валидности значения по регулярному выражению
	 */
	checkByPattern: function(value, pattern) {
		var status = false;
		try {
			status = !!value.match(pattern);
		} catch(e) {}
		return status;
	},

	/*
	 *  Функция для проверки наличия значения в массиве
	 */
	inArray: function(needle, haystack, strict) {
		var found = false;
		strict = !!strict;
		for (var key in haystack) {
			if ((strict && haystack[key] === needle) ||
				(!strict && haystack[key] == needle)) {
				found = true;
				break;
			}
		}
		return found;
	},

	/**
	 * Функция, конвертирующая дату из формата %d.%m.%Y в %Y-%m-%d
	 */
	convertDateToMySql: function(date) {
		var dateMatched = date.match(/^([\d]{2})[.]([\d]{2})[.]([\d]{4})$/);
		if (dateMatched)
			return dateMatched[3] + '-' + dateMatched[2] + '-' + dateMatched[1];
		return '';
	},

	/**
	 * Функция для подсветки ошибок в выпадающих списках
	 */
	setSelectError: function($field, message) {
		var fakeField = $field.closest('.b-field'),
			fakeFieldSelectedTxt = fakeField.find('.selectedTxt');
		// Выделяем текст ошибки цветом
		fakeField.addClass('g-error');
		// Выводим текст ошибки в выпадающий список
		fakeFieldSelectedTxt.text(message);
		// Убираем сообщение об ошибке, если выбран судья из списка
		/*$field.change(function() {
			$(this).unbind('change');
			fakeField.removeClass('g-error');
			fakeFieldSelectedTxt.text('');
		});*/
	}
};
