// Функция-конструктор: создает объект Cookie для указанного документа с указанным именем и необязательными атрибутами.
// Аргументы:
//    document: Объект Document, для которого сохраняется cookie. Обязательный.
//    name:   Строка, задающая имя cookie. Обязательный.
//    hours:  Необязательное число, задающее количество часов, по прошествии которых cookie должен закончить свое действие.
//    path:   Необязательная строка, задающая атрибут path для cookie.
//    domain:  Необязательная строка, задающая атрибут domain для cookie.
//    secure:  Необязательное логическое значение, которое, будучи равно true, требует защиты при передаче cookie.
var flag = true;
function Cookie(document, name, hours, path, domain, secure)
{
	// Все предопределенные свойства этого объекта начинаются с символа '$' отличить их от других свойств, являющихся значениями, предназначенными для хранения в cookie. 
	this.$document = document;
	this.$name = name; 
	if (hours) this.$expiration = new Date((new Date()).getTime() + hours*3600000); else this.$expiration = null;
	if (path) this.$path = path; else this.$path = null; 
	if (domain) this.$domain = domain; else this.$domain = null; 
	if (secure) this.$secure = true; else this.$secure = false;
}

// Эта функция является методом store() объекта Cookie.
Cookie.prototype.store = function () 
{
	// Сначала выполняем цикл по свойствам объекта Cookie и собираем значение cookie. Так как cookie используют знаки равенства и точки с запятой в качестве разделителей, 
	// для индивидуальных переменных состояния, хранящихся в одном значении cookie, мы будем использовать двоеточния и амперсанды. Обратите внимание, что мы кодируем каждую 
	// переменную состояния с помощью функции escape() на тот случай, если она содержит знаки пунктуации или другие недопустимые символы. 
	var cookieval = ""; 
	for (var prop in this)
	{
		// Игнорирует свойства с именами, начинающимися с '$', а также методы 
		if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function')) continue;
		if (cookieval != "") cookieval += '&'; 
		cookieval += prop + ':' + escape(this[prop]);
	}
	
	// Теперь, когда у нас есть значение cookie, собираем вместе полную строку cookie, включающую имя и различные атрибуты, указанные при создании объекта Cookie. 
	var cookie = this.$name + '=' + cookieval; 
	if (this.$expiration) cookie += '; expires=' + this.$expiration.toGMTString();
	if (this.$path) cookie += '; path=' + this.$path; 
	if (this.$domain) cookie += '; domain=' + this.$domain; 
	if (this.$secure) cookie += '; secure';

	// Теперь сохраняем cookie, устанавливая "магическое" свойство Document.cookie.
	this.$document.cookie = cookie;
}


// Эта функция является методом load() объекта Cookie
Cookie.prototype.load = function()
{	
	// Сначала получаем список всех cookie, относящихся к этому документу.
	// Мы делаем это путем чтения "магического" свойства Document.cookie. 
	var allcookies = this.$document. cookie; 
	if (allcookies == "") return false;
	
	// Теперь извлекаем из этого списка только cookie с указанным именем.
	var start = allcookies.indexOf(this.$name + '=');
	if (start == -1) return false;  // Для этой страницы cookie не определены
	start += this.$name.length +1; // Пропускаем имя и знак равенства
	var end = allcookies.indexOf(';', start);
	if (end == -1) end = allcookies.length;
	var cookieval = allcookies.substring(start, end);
	
	// После извлечения значения указанного cookie мы должны разбить
	// это значение на несколько отдельных переменных состояния.
	// Пары имя/значение отделяются друг от друга амперсандами, а
	// отдельные имена отделяются от значений двоеточиями. Для всех
	// этих операций мы используем метод split().
	var a = cookieval.split('&'); // Разбиваем на элементы массива пар "имя/значение"
	for(var i=0; i < a.length; i++) a[i] = a[i].split(':'); // Разбиваем каждую пару на два элемента массива
	
	// После разбора значения cookie устанавливаем все имена и значения 
	// переменных состояния в объекте в данном объекте Cookie. Обратите 
	// внимание на использование функции unescape() для значения свойства; 
	// она нужна потому, что при сохранении значений мы вызывали escape(). 
	for(var i = 0; i < a.length; i++) this[a[i][0]] = unescape(a[i][1]);
	
	// Все готово, поэтому возвращаем код успешного завершения 
	return true;
}


// Эта функция является методом remove() объекта Cookie 
Cookie.prototype.remove = function() 
{
	var	cookie;
	cookie = this.$name + '=';
	if (this.$path) cookie += '; path=' + this.$path;
	if (this.$domain) cookie += '; domain=' + this.$domain;
	cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT';
	this.$document.cookie = cookie;
}
