/* (c) Наталья Николаевна Бурнос
 *     2009-2010 Караганда, Казахстан
 *     http://www.diary.ru/~mouse-k/
 *     mouse-karaganda@mail.ru
 *     ВНИМАНИЕ! Данный программный код НЕ предназначен для распространения по сети и может быть использован только с письменного согласия автора!
 */

/* Скрипты для странички-контейнера.
 * Извлечение и обработка параметров из адресной строки браузера.
 */

//Страница является контейнером - отметим это
var isContainer = true;

//Показать во фрейме страницу, запрошенную через параметры
function showPageToFrame () {
	var params = new TStringList (getParams ());
	if (params && params.getPName(0).length > 0) {
		//единственный параметр - имя файла запрошенной страницы
		//alert (params.getPName(0) + '\n' + decodeURIComponent (params.getPName(0)));
		top.frames['viewer'].location.href = decodeURIComponent(decodeURIComponent(params.getPName(0)));
	}
}

//класс - массив строк
function TStringList () {

	//показать содержимое массива строк
	this.showContent = function () {
		document.writeln ('<br><table style="border: 1px dotted red;">');
		for (i in this.hashtable)
			document.writeln ('<tr><td>' + i + '</td><td>&rarr;</td><td>' + this.hashtable [i] + '</td></tr>');
		document.writeln ('</table>');
	}

	//Извлечь имя параметра из массива строк
	this.getPName = function (arrayIndex) {
		var pName = '';
		if (this.content.length > 0 && 0 <= arrayIndex && arrayIndex < this.content.length) {
			//сначала извлечем строку вида "имя_параметра=значение_параметра"
			pName += this.content[arrayIndex];
			//найдем знак "=", разделяющий имя и значение
			var equalSignPos = pName.indexOf ('=');
			if (equalSignPos >= 0)
				pName = pName.substr (0, equalSignPos);
		}
		return pName;
	} 
	
	//Извлечь значение параметра из массива строк
	this.getVName = function (arrayIndex) {
		var vName = '';
		if (this.content.length > 0 && 0 <= arrayIndex && arrayIndex < this.content.length) {
			//сначала извлечем строку вида "имя_параметра=значение_параметра"
			vName += this.content[arrayIndex];
			//найдем знак "=", разделяющий имя и значение
			var equalSignPos = vName.indexOf ('=');
			if (equalSignPos >= 0)
				vName = vName.substr (equalSignPos + 1);
		}
		return vName;
	}
	
	//Извлечь значение параметра по его имени
	this.getValue = function (paramName) {
		var value = '';
		if (this.hashtable && this.hashtable [paramName])
			value += this.hashtable [paramName];
		return value;
	}
	
	//Обеспечить доступ к содержимому не по индексу, а по имени параметра
	this.convertToNameAccess = function () {
		this.hashtable = null;
		this.hashtable = new Array ();
		for (var i = 0; i < this.content.length; i++) {
			var PName = this.getPName(i);
			var VName = this.getVName(i);
			this.hashtable[PName] = VName;
		}
	}
	
	//заполнить внутренний массив данными из внешнего массива
	this.setContent = function (theArray) {
		//уничтожим и очистим прежний внутренний массив
		this.content = null;
		var contentLength = theArray ? (theArray.length || 0) : 0;
		this.content = new Array(contentLength);
		for (var i = 0; i < contentLength; i++) {
			this.content[i] = theArray[i];
		}
		//обеспечим доступ к данным через хэш-таблицу
		this.convertToNameAccess();
	}
	
	//можно заполнить массив строк при его создании
	this.setContent (TStringList.arguments[0]);

	return this;
}

//занести принятые параметры в массив
function getParams () {
	var paramsArray;
	//если не указана строка для разбора - извлечем параметры поиска из адреса страницы
	var fullParamStr = location.search;
	if (arguments.length && arguments.length == 1)
		fullParamStr = arguments [0];
	//если файл открыт без параметров - выходим
	if (fullParamStr.length == 0)
		return;
	else
		//избавимся от вопросительного знака в начале строки
		fullParamStr = fullParamStr.substr(1);
	//избавимся от плюсов в многословных параметрах
	//var re = /\+/g;
	var re = new RegExp("(\\+)", "g");
	//alert ('test = ' + re.test(fullParamStr));
	fullParamStr = fullParamStr.replace (re, ' ');
	//разобьем строку на массив пар "имя_параметра=значение_параметра"
	paramsArray = fullParamStr.split('&');
	return paramsArray;
}

/* Получить последнюю лексему из строки. 
 * По умолчанию разделителем лексем считается "/", но можно указать любой символ как второй параметр
 */
function lastToken (aString) {
	var delimiter = '/'; //разделитель лексем по умолчанию
	//Проверим, не указан ли собственный разделитель во втором параметре
	if (lastToken.arguments.length > 1)
		delimiter = lastToken.arguments[1];
	//Найдём в строке последнюю лексему, отделённую заданным разделителем
	var delimiterPos = aString.lastIndexOf(delimiter);
	if (delimiterPos == -1)
		return aString;
	else
		return aString.substr(delimiterPos + 1);
}

/* =======================================================================
 * Вынесено сюда для использования на страничках фото- и видеоальбомов
 * =======================================================================
 */
 
/* Класс - дата съёмки фотоальбома (месяц и год)
 */
function photoDate (aMonth, aYear) {
	this.month = aMonth;
	this.year = aYear;
	
	//Строковое представление месяцев
	this.sMonths = new Array (
		 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь',
		 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
	);
	
	//Выдаёт строковое представление.
	this.toString = function () {
		var stringDate;
		stringDate = this.sMonths [this.month - 1] + ' ' + this.year;
		return stringDate;
	}
	
	//Извлечь данные из строкового представления
	this.fromString = function (aString) {
		//Найдем номер позиции пробела
		var spacePos = aString.indexOf (' '); 
		//Ищем месяц
		var newMonth = aString.substring (0, spacePos);
		for (var i = 0; i < this.sMonths.length; i++) {
			if (this.sMonths [i] == newMonth) {
				newMonth = '' + (i + 1);
				break;
			}
		}
		var newYear = aString.substring (spacePos + 1);
		return new photoDate (eval (newMonth), eval (newYear));
	}
	
	return this;
}
