
var myCheckFunctions = new CheckFunctions();
var myFormChecker = new FormChecker();

//////////////////////////////////////////////////////////////////////////////////////////////////
function spg() {
//////////////////////////////////////////////////////////////////////////////////////////////////
	var time=new Date();
	return('<img src="/images/spg' + time.getDay() + '.gif" width=120 height=26 align=top>');
}

//////////////////////////////////////////////////////////////////////////////////////////////////			
function CheckFunctions () {
//////////////////////////////////////////////////////////////////////////////////////////////////
	var ReturnFieldValue=function(Obj) {
		switch (Obj.type) {
			case "text": 
				return Obj.value;
				break;
			case "textarea": 
				return Obj.value;
				break;
			case "hidden": 
				return Obj.value;
				break;
			case "password": 
				return Obj.value;
				break;
			case "select-one": 
				return Obj.options[Obj.options.selectedIndex].value;
				break;
			case "radio": 
				if (Obj.checked==true) {
					return Obj.value;
				} else {
					return "";
				}
				break;
			case "checkbox": 
				if (Obj.checked==true) {
					return true;
				} else {
					return "";
				}
				break;
			case "select-multiple":
				var returnVals = [];
				for (var i=0; i<Obj.options.length; i++) {
					if(Obj.options[i].selected==true) {
						returnVals[returnVals.length]=Obj.options[i].value
					}
				}
				return returnVals;
				break;
		}
		// IE radio
		if (!Obj.type && Obj.length) {
			for (var i=0; i<Obj.length; i++) {
				if (Obj[i].checked==true) {
					return (Obj[i].value);
				}
			}
		}
		return "";
	}

	var CharsetValidator=function(Charset,FieldValue) {
		var ReturnValue=true;
		for (var i=0;i<FieldValue.length;i++) {
			ReturnValue = ReturnValue && (Charset.indexOf(FieldValue.charAt(i)) != -1)
		}
		return ReturnValue;
	}

	////////////////////////////////////////////////////////////////
	// Правило о максимальной длине слова
	////////////////////////////////////////////////////////////////

	var MaxWordLength = 30;
	this.SetMaxWordLength=function(NewMaxWordLength) {
		MaxWordLength = NewMaxWordLength || MaxWordLength;
	}
	this.GetMaxWordLength=function() {
		return (MaxWordLength);
	}

	this.MaxLengthOfWord=function(Field) {
		var re = new RegExp("[\\QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбюёЁ1234567890-_,.]{"+(MaxWordLength+1)+"}", "g");
		return !re.test(ReturnFieldValue(Field));
	}


	////////////////////////////////////////////////////////////////
	// Набор символов для логина
	////////////////////////////////////////////////////////////////

	var LoginCharset='abcdefghijklmnopqrstuvwxyz0123456789-_';
	this.ToLoginCharset=function(Field) {
		return CharsetValidator(LoginCharset, ReturnFieldValue(Field));
	}

	////////////////////////////////////////////////////////////////
	// Набор символов для ввода целых чисел
	////////////////////////////////////////////////////////////////

	var IntegerCharset='0123456789-';
	this.ToIntegerCharset=function(Field) {
		return CharsetValidator(IntegerCharset, ReturnFieldValue(Field));
	}

	////////////////////////////////////////////////////////////////
	// Набор символов для ввода чисел с плавающей запятой
	////////////////////////////////////////////////////////////////


	// Опеределим с к р ы т о е свойство, в котором будет хранится
	// разделитель целой и дробной части
	var FloatSeparator=".";
	this.SetFloatSeparator=function(NewValue) {
		FloatSeparator = NewValue || FloatSeparator;
	}

	var FloatCharset='0123456789-';
	this.ToFloatCharset=function(Field) {
		return CharsetValidator(FloatCharset + FloatSeparator, ReturnFieldValue(Field));
	}


	// Приведение к виду float. 
	// 1. Выбрасывать сообщение об ошибке если в поле набрана буква (кроме запятой и точки).
	// 2. Первое вхождение запятой заменять на точку, все остальные - удалять.
	this.ToFloatCharset=function(Field) {
		var str = ReturnFieldValue(Field);
		var FirstComma = false;
		var new_str = "";
		if (CharsetValidator(FloatCharset + ",.", ReturnFieldValue(Field))==true) {
			for (var i=0; i<str.length; i++) {
				if ((str.charAt(i)=="," || str.charAt(i)==".") && FirstComma == false) {
					new_str += ".";
					FirstComma = true;
				} else {
					if (str.charAt(i)!="," && str.charAt(i)!=".") {
						new_str += str.charAt(i);
					}
				}
			}
			Field.value = new_str;
			return(true);
		} else {
			return (false);
		}
	}

	////////////////////////////////////////////////////////////////
	// Неотрицательное число
	////////////////////////////////////////////////////////////////

	this.NonNegativeNumber=function(Field) {
		var x=ReturnFieldValue(Field)+0;
		return (x>=0);
	}

	////////////////////////////////////////////////////////////////
	// Не нуль
	////////////////////////////////////////////////////////////////

	this.NonZeroNumber=function(Field) {
		var x=ReturnFieldValue(Field)+0;
		return (x!=0);
	}
	
	////////////////////////////////////////////////////////////////
	// Проверка e-mail на корректность
	////////////////////////////////////////////////////////////////

	this.TheCorrectEMail=function (Field) {
		var x=ReturnFieldValue(Field);
		if (x=="") return true;
		var a=/([^A-Za-z0-9_@\.\-\[\]])|(\.\.|@\.|\s)|(^@|^\.|@$|\.$)/;
		var b=/@/;
		var c=/\./;
		var d=/^(.+)@(.+)$/;
		var e=x.match(d);
		if ((a.test(x)) || (e==null)) {
			return false;	
		}
		var f=e[1];
		var g=e[2];
		if ((!(c.test(g)))||(b.test(f))){
			return false;
		}
		var h=/[^0-9\.\[\]]/;
		var j=/^\[?(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]?$/;
		var k=g.match(j);
		if (!(h.test(g))&&(k!=null)) {
			if ((k[1]>255)||(k[2]>255)||(k[3]>255)||(k[4]>255)) {
				return false;
			} else {
				return true;
			}
		} else {
			var m=/\[|\]/;
			if (m.test(x)) {
				return false;
			}
			var n = /^(.+)\.(.+)$/;
			var p=g.match(n);
			var q=p[2];
			var r=/[^A-Za-z]/;
			var s=/info|name|coop|aero/i;
			var t=/museum/i;
			var v=/biz|pro|com|net|org|edu|gov|mil/i;
			if (((q.length==2) && (!(r.test(q)))) ||
				(q.length==3) && (v.test(q)) ||
				((q.length==4)&&(s.test(q))) ||
				((q.length==6)&&(t.test(q))))
	 		{
				return true;
			}
			return false;
		}
	}

	////////////////////////////////////////////////////////////////
	// Короткий текст
	////////////////////////////////////////////////////////////////


	// Опеределим с к р ы т о е свойство, в котором будет хранится
	// максимальная длина короткого текста
	var MaxSizeOfShortText=128;
	
	// и функцию, которая будет осуществлять проверка на то, 
	// является ли ислледуемый текст коротким, т.е. по длине
	// не большим чем MaxSizeOfShortText
	
	// Т.о. получили первое правило "Короткий текст"
	this.TheShortText=function(Field) {
		return ((ReturnFieldValue(Field)+'').length<=MaxSizeOfShortText)
	}

	// Теперь напишем ещё два метода для чтения/записи скрытого
	// параметра MaxSizeOfShortText
	this.GetMaxSizeOfShortText=function() { return MaxSizeOfShortText; }
	this.SetMaxSizeOfShortText=function(NewValue) { MaxSizeOfShortText=NewValue; }

	////////////////////////////////////////////////////////////////
	// Длинный текст
	////////////////////////////////////////////////////////////////

	// Теперь определим с к р ы т о е свойство, хранящее в себе
	// максимальную длину длинного текста
	var MaxSizeOfLongText=10240;

	// ... и  о т к р ы т у ю функцию проверки в 
	// соответствии с данным свойством
	this.TheLongText=function (Field){
		return ((ReturnFieldValue(Field)+'').length<=MaxSizeOfLongText)
	}
	
	// Открытые методы чтения/записи MaxSizeOfLongText
	this.GetMaxSizeOfLongText=function() { return MaxSizeOfLongText; }
	this.SetMaxSizeOfLongText=function(NewValue) { MaxSizeOfLongText=NewValue }

	////////////////////////////////////////////////////////////////
	// Не пустой текст
	////////////////////////////////////////////////////////////////

	// Проверка на то, является ли исследуемый текст непустым
	this.NotTheEmptyText=function(Field) {
		return (ReturnFieldValue(Field)!='')
	}
	
}


// конструктор контроллёра корректности ввода формы
//////////////////////////////////////////////////////////////////////////////////////////////////
function FormChecker() {
//////////////////////////////////////////////////////////////////////////////////////////////////
	// скрытый массив "ссылок" на правила
	// Каждая "ссылка" будем иметь вид:
	// {       Rule: "Имя ПРАВИЛА, в экземляре комплекта правил",
	//   WorkObject: "Указатель на обрабатываемый объект-элемент формы",
	// ErrorMessage: "Сообщение об ошибке, если данное правило не выполняется"
	// }
	var Rules				= new Array();


	// определим сообщение об ошибке по умолчанию
	// (скрытое свойство)
	var DefaultErrorMessage = "Ошибка!";

	// ... и открытые методы его переопределения
	this.SetDefaultErrorMessage=function(NewErrorMessage) {
		// если NewErrorMessage пуст или неопределён, то 
		// сообщение по умолчанию не менять
		DefaultErrorMessage = NewErrorMessage || DefaultErrorMessage;
	}

	this.GetDefaultErrorMessage=function() {
		return DefaultErrorMessage;
	}
	
	// открытый метод добавления "ссылок" на правила
	this.AddRule			= function (Rule, WorkObject, ErrorMessage) {
		Rules[Rules.length]	= {
			'Rule'			:Rule,
			'WorkObject'	:WorkObject,
			// если сообщение не определено, то поставим вместо 
			// него системное сообщение
			'ErrorMessage'	:ErrorMessage
		};
	}

	// открытый метод проверки выполнения всех условий корректности формы
	this.CheckIt			= function (CheckFunctionsSET) {
		// по умолчанию форма введена корректно
		var Flag = true;
		
		// последовательно проверяем все заявленные правила на корректность.
		for (var i = 0; i < Rules.length; i++) {
			// вызываем заявленное правило Rules[i].Rule для объекта Rules[i].WorkObject
			if (!CheckFunctionsSET[Rules[i].Rule]) {
				alert('Внимание!\n\nПопытка вызвать несуществующее правило '+Rules[i].Rule);
				continue;
			}
			Flag = Flag && CheckFunctionsSET[Rules[i].Rule](Rules[i].WorkObject);
			
			// Если возникла ошибка, сообщаем об этом пользователю и заканчиваем работу
			if (Flag==false) {
				Message(Rules[i]);
				if (document.all) {
					Rules[i].WorkObject.style.COPYbackground=Rules[i].WorkObject.style.background;
					Rules[i].WorkObject.style.COPYcolor=Rules[i].WorkObject.style.color;

					Rules[i].WorkObject.style.background='#F0F0F0';
					Rules[i].WorkObject.style.color='black';
				}
				break;
			} else {
				if (document.all) {
					if (Rules[i].WorkObject.style.COPYbackground) {
						Rules[i].WorkObject.style.background=Rules[i].WorkObject.style.COPYbackground;
					} else {
						Rules[i].WorkObject.style.background='white';
					}
					
					if (Rules[i].WorkObject.style.COPYcolor) {
						Rules[i].WorkObject.style.color=Rules[i].WorkObject.style.COPYcolor;
					} else {
						Rules[i].WorkObject.style.color='black';
					}
				}
			}
		}

		// возвращаем разрешение продолжить посыл формы
		return Flag;

	}
	
	// скрытый метод сообщения пользователю об ошибке
	function Message(Rule) {
		alert(Rule.ErrorMessage || DefaultErrorMessage);
		Rule.WorkObject.select();
		Rule.WorkObject.focus();
	}

}

// утилиты

// поиск элемента формы со сложным именем
//////////////////////////////////////////////////////////////////////////////////////////////////
function GetFormElementByName(FormObj,ElementName) {
//////////////////////////////////////////////////////////////////////////////////////////////////	
	for (var i=0; i<FormObj.elements.length; i++) {
		if (FormObj.elements[i].name==ElementName) {
			return (FormObj.elements[i]);
		}
	}
	alert("ВНИМАНИЕ!\n\nПопытка обратиться к несуществующему полю "+ElementName+" формы "+FormObj.name+"!");
	return null;
}

//////////////////////////////////////////////////////////////////////////////////////////////////
function GetFormElementByName(FormObj,ElementName) {
//////////////////////////////////////////////////////////////////////////////////////////////////
	for (var i=0; i<FormObj.elements.length; i++) {
		if (FormObj.elements[i].name==ElementName) {
			return (FormObj.elements[i]);
		}
	}
	return null;
}

//////////////////////////////////////////////////////////////////////////////////////////////////
function insertCodes(cod) {
//////////////////////////////////////////////////////////////////////////////////////////////////		
	var str = prompt("Введите текст для подстановки. Адреса страниц и картинок должны начинаться с http://", "");
	
	if ((str != null) & (str != "")) {
		if (cod == 1) {(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+'[b]'+str+'[/b]';}
		if (cod == 2) {(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+'[i]'+str+'[/i]';}
		if (cod == 3) {(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+'[u]'+str+'[/u]';}
		if (cod == 4) {(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+'[big]'+str+'[/big]';}
		if (cod == 5) {(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+'[small]'+str+'[/small]';}
		if (cod == 6) {(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+'[sup]'+str+'[/sup]';}
		if (cod == 7) {(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+'[sub]'+str+'[/sub]';}
		if (cod == 8) {(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+'[a target="_blank" href='+str+']'+str+'[/a]';}
		if (cod == 9) {(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+'[img src='+str+']';}
	}
}
	
//////////////////////////////////////////////////////////////////////////////////////////////////
function insertSmile(smile) {
//////////////////////////////////////////////////////////////////////////////////////////////////
	(GetFormElementByName(document.forms.form1,'1.TEXT')).value=(GetFormElementByName(document.forms.form1,'1.TEXT')).value+smile;
}

var caution = false;
	
//////////////////////////////////////////////////////////////////////////////////////////////////
function setCookie(name, value, expires, path) {
//////////////////////////////////////////////////////////////////////////////////////////////////
        var curCookie = name + "=" + escape(value) +
                ((expires) ? "; expires=" + expires.toGMTString() : "") +
                ((path) ? "; path=" + path : "");
        if (!caution || (name + "=" + escape(value)).length <= 4000)
                document.cookie = curCookie
        else
                if (confirm("Cookie exceeds 4KB and will be cut!"))
                        document.cookie = curCookie
}
	
var good_exp=new Date();
good_exp.setYear(good_exp.getYear()+1);

//////////////////////////////////////////////////////////////////////////////////////////////////
function getCookie(name) {
//////////////////////////////////////////////////////////////////////////////////////////////////
        var prefix = name + "="
        var cookieStartIndex = document.cookie.indexOf(prefix)
        if (cookieStartIndex == -1)
                return null
        var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length)
        if (cookieEndIndex == -1)
                cookieEndIndex = document.cookie.length
        return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex))
}

//////////////////////////////////////////////////////////////////////////////////////////////////
function DeleteMessage(item_id, remark) {
//////////////////////////////////////////////////////////////////////////////////////////////////
	if (confirm('Вы действительно хотите удалить это сообщение?')) {
		document.all('item_id_element').value=item_id;
		document.forms.DeleteForm.submit();
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////
function DeleteCookie(name)
//////////////////////////////////////////////////////////////////////////////////////////////////
{
	var path='/';
	var expires = new Date();
	var curCookie = name + "=" + 0 + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "");
	document.cookie = curCookie;
}
