iv = { //	Объект с методами просмотрщика
	conf : {
//                 Ключ  |  Значение
                img_root : '/img/',
          previews_count : '3',
             time_format : 'd M Y, H:I',
              save_years : '1',
               zoom_step : '150',
          zoom_max_width : '2000',
          zoom_min_width : '100',
         zoom_max_height : '1000',
         zoom_min_height : '100',
                album_bg : 'bg-0',
        opacity_interval : '3',
      slideshow_interval : '5'
	},
	lang : [ //	Языковые настройки для вывода
		'<b>..</b>',
		'Жизнь в картинках',
		' > ',
		' из ',
		'Картинка',
		'Альбом',
		'Последнее изменение',
		'Размер',
		'Ширина',
		'Высота',
		'Прямая ссылка',
		'Папки и файлы',
		'Назад (Ctrl + &uarr;)',
		'Вперед (Ctrl + &darr;)',
		'Запустить слайдшоу',
		'Пауза',
		'Увеличить',
		'Уменьшить',
		'Отменить изменения',
		'Помощь',
		'показывать превьюшки',
		'не прятать альбомы',
		'запоминать текущую позицию',
		'<i class="show" title="показывать"><!----></i>',
		'по порядку',
		'задом-наперед',
		'в случайном порядке',
		'<i class="clock" title="интервал для слайдшоу"><!----></i>',
		'',
		'Директорий: ',
		'файлов: ',
		'общим весом: ',
		', ',
	],
	errors : [ //	Сообщения об ошибках
		'Изображение не загружено.',
		'Альбом не найден.',
		'Изображение не найдено.',
		'Для запуска слайдшоу необходимо наличие более одного изображения в альбоме.',
	],
//###########################################################
//##           ,       ,          ,                        ##
//##     Пальцами, яйцами и огурцами в код не лазать.      ##
//##     Сам все испорчу :)                                ##
//##                                                       ##
//###########################################################
    glbl : {
		fid : 0,
		album : [],
		image : [],
		count : 0,
		size : 0,
		start : -3,
		prev : -1,
		curr : 0,
		next : 1,
		stop : 3,
		play : false,
		pause : true,
		seconds : false,
		path : '',
		dir : '',
		opac : 0,
		pos : 1000
	}
}
//	Инициировать "движок"
iv.go = function() {
	js.get.cookies();
	js.get.hash();
	if(js.cookies.bg) {document.body.className = js.cookies.bg;}
	iv.glbl.play = (js.cookies['smode'] ? js.cookies['smode'] : 0);
	iv.glbl.seconds = js.cookies['stime'] ? js.cookies['stime'] : iv.conf.slideshow_interval;
	js.set.event(document, 'mousemove', js.set.cursor);
	js.glbl.func = 'iv.keyboard';
	js.set.event(document, 'keyup', js.set.keyboard);
	document.body.className = js.cookies.bg ? js.cookies.bg : iv.conf.album_bg;
	iv.settings();
	iv.menu(js.hash.id ? true : false);
	if(js.hash.fid) {
		iv.glbl.fid = js.hash.fid;
		iv.list(false);
		if(js.hash.id) {
			iv.glbl.curr = js.hash.id;
			iv.album();
			iv.image();
		}
	}
}
//	Сохранить настройку из элемента формы
iv.save = function(el) {
	el.value = el.value == 1 ? 0 : 1;
	js.set.cookie(el.id, el.value, iv.conf.save_years);
	window.location.reload(false);
}
//	Задает урл для адресной строки (для ИЕ, в основном)
iv.url = function() {document.location = '#fid=' + iv.glbl.fid + (iv.glbl.image ? ';id=' + iv.glbl.curr : '');}
//	Изменить общий бэкграунд
iv.bg = function(el) {
	var lcl = {bg : el.className}
	document.body.className = lcl.bg;
	js.set.cookie('bg', lcl.bg, iv.conf.save_years);
}
//	Плавно проявляет картинку
iv.opacity = function() {
	iv.glbl.opac = (iv.glbl.opac - 0) + 0.1;
	js.set.cache('image');
	var lcl = {el : js.get.element('image')}
	js.set.opacity(lcl.el, iv.glbl.opac);
	lcl.el.style.width = iv.glbl.image[3] + 'px';
	lcl.el.style.height = iv.glbl.image[4] + 'px';
	if(iv.glbl.opac < 1) {setTimeout("iv.opacity();", iv.conf.opacity_interval);}
	else {iv.glbl.opac = 0;}
}
//	Увеличить / уменьшить изображение
iv.zoom = function(where) {
	var lcl = {
		el : js.get.element('image'),
		size : 0
	}
	if(where == '+') {lcl.size = iv.conf.zoom_step;}
	else if(where == '-') {lcl.size = where + iv.conf.zoom_step;}
	lcl.w = lcl.el.style.width.replace(/px/i, '') - 0;
	lcl.nw = !where ? iv.glbl.image[3] : Math.round((lcl.w - 0) + (lcl.size - 0));
	lcl.h = lcl.el.style.height.replace(/px/i, '') - 0;
	lcl.nh = !where ? iv.glbl.image[4] : Math.round((lcl.nw * lcl.h) / lcl.w);
	if(lcl.nw < iv.conf.zoom_max_width && lcl.nh < iv.conf.zoom_max_height && lcl.nw > iv.conf.zoom_min_width && lcl.nh > iv.conf.zoom_min_height) {
		lcl.el.style.width = lcl.nw + 'px';
		lcl.el.style.height = lcl.nh + 'px';
	}
}
//	Возвратить текст ошибки по номеру
iv.error = function(num) {return(iv.errors[(num - 0)]);}
//	Показать или спрятать окно и поместить его поверх остальных
iv.hide = function(id) {
	var lcl = {el : js.get.element(id)}
	js.set.pos(lcl.el);
	js.set.cname(lcl.el, 'win', 'hidden');
}
//	Управление "оконным" дизайном
iv.window = function(id, around, esc, counter, content) {
	var lcl = {
		start : '',
		end : ''
	}
	if(around == true) {
		lcl.start = '<div class="dow">';
		lcl.end = '</div>';
	}
	if(counter != false) {lcl.end += '<span class="counter">' + counter + '</span>';}
	if(esc == true) {lcl.end += '<i onclick="js.set.cname(this.parentNode, \'win hidden\', \'win\');" class="link"><!----></i>';}
	js.get.element(id).innerHTML = lcl.start + content + lcl.end;
}
//	Вычислить следующий и предыдущий элементы
iv.set = function() {
	var lcl = {
		all : iv.conf.previews_count * 2,
		count : iv.glbl.count - 1
	}
	lcl.half = Math.floor(lcl.all / 2);
	iv.glbl.prev = iv.glbl.curr - 1;
	iv.glbl.next = (iv.glbl.curr - 0) + 1;
	if(iv.glbl.count > 1) {
		if(iv.glbl.prev < 0) {iv.glbl.prev = iv.glbl.prev + iv.glbl.count;}
		if(iv.glbl.next > iv.glbl.count - 1) {iv.glbl.next = iv.glbl.next - iv.glbl.count;}
		if(iv.glbl.play == 2) {
			iv.glbl.prev = js.get.rand(0, lcl.count);
			iv.glbl.next = iv.glbl.prev;
		} else if(iv.glbl.play == 1) {
			lcl.temp = iv.glbl.prev;
			iv.glbl.prev = iv.glbl.next;
			iv.glbl.next = lcl.temp;
		}
	} else {
		iv.glbl.prev = 0;
		iv.glbl.next = 0;
	}
	if(lcl.all > lcl.count) {
		iv.glbl.start = 0;
		iv.glbl.stop = iv.glbl.count;
	} else {
		iv.glbl.start = iv.glbl.curr - lcl.half;
		iv.glbl.stop = (iv.glbl.curr - 0) + (lcl.all - lcl.half + 1);
		if(iv.glbl.stop > iv.glbl.count - 1) {
			iv.glbl.start = iv.glbl.start - iv.glbl.count;
			iv.glbl.stop = iv.glbl.stop - iv.glbl.count;
		}
	}
}
//	Все изображения текущего альбома
iv.album = function() {
	iv.glbl.count = 0;
	iv.glbl.size = 0;
	iv.glbl.album = [];
	for(var i in iv.files) {
		if(iv.files[i][0] == iv.glbl.fid) {
			iv.glbl.album[iv.glbl.count] = iv.files[i];
			iv.glbl.count++;
			iv.glbl.size += iv.files[i][1];
		}
	}
}
//	Путь в заголовке страницы и на сервере
iv.path = function(fid) {
	if(fid == iv.glbl.fid) {
		iv.glbl.path = '';
		iv.glbl.dir = '';
		if(iv.glbl.image) {iv.glbl.path = iv.glbl.image[7];}
	}
	var lcl = {sep : (iv.glbl.path != '' ? iv.lang[2] : '')}
	if(fid != 0) {
		iv.glbl.path = iv.folders[fid][2] + lcl.sep + iv.glbl.path;
        iv.glbl.dir = iv.folders[fid][1] + iv.glbl.dir;
		iv.path(iv.folders[fid][0]);
	} else {
		iv.glbl.path = iv.lang[1] + lcl.sep + iv.glbl.path;
		iv.glbl.dir = iv.conf.img_root + iv.glbl.dir;
		document.title = iv.glbl.path;
	}
}
//	Информация о картинке
iv.info = function() {
	var lcl = {
		start : '<h5><b>' + ((iv.glbl.curr - 0) + 1) + iv.lang[3] + iv.glbl.count + '</b></h5><table cellspacing="0">',
		end : '</table>'
	}
	lcl.res = lcl.start +
	'<tr><th>' + iv.lang[4] + '</th><td>' + iv.glbl.image[7] + '</td></tr>' +
	'<tr><th>' + iv.lang[5] + '</th><td>' + iv.folders[iv.glbl.image[0]][2] + '</td></tr>' +
	'<tr><th>' + iv.lang[6] + '</th><td>' + js.get.fdate(iv.glbl.image[2], iv.conf.time_format) + '</td></tr>' +
	'<tr><th>' + iv.lang[7] + '</th><td>' + js.get.fsize(iv.glbl.image[1]) + '</td></tr>' +
	'<tr><th>' + iv.lang[8] + '</th><td>' + iv.glbl.image[3] + ' px</td></tr>' +
	'<tr><th>' + iv.lang[9] + '</th><td>' + iv.glbl.image[4] + ' px</td></tr>' +
	'<tr><td class="end" colspan="2"><a href="' + iv.glbl.dir + iv.glbl.image[6] + '">' + iv.lang[10] + '</a></td></tr>' +
	lcl.end;
	iv.window('info-holder', true, true, false, lcl.res)
}
//	Настройки
iv.settings = function() {
	var lcl = {
		checks : [
			['previews', iv.lang[20]],
			['list', iv.lang[21]],
		],
		start : '<ul>',
		end : '</ul><div class="clear"><!----></div>'
	}
	lcl.res = lcl.start;
	for(var i in lcl.checks) {
		lcl.curr = js.cookies[lcl.checks[i][0]] ? js.cookies[lcl.checks[i][0]] : 0;
		lcl.check = lcl.curr == 1 ? ' checked' : '';
		lcl.cname = i == 0 ? ' class="start"' : '';
		lcl.res += '<li' + lcl.cname + '><input id="' + lcl.checks[i][0] + '" class="cbx" type="checkbox"' + lcl.check + ' onclick="iv.save(this);" value="' + lcl.curr + '" /> <label for="' + lcl.checks[i][0] + '">' + lcl.checks[i][1] + '</label></li>';
	}
	lcl.res += '<li>';
    for(var i = 0; i < 9; i++) {
		lcl.res += '<b class="bg-' + i + '" onclick="iv.bg(this);"><!----></b>';
    }
	lcl.res += '</li><li>' + iv.lang[23] + '<select class="lng" onchange="js.set.cookie(\'smode\', this.value, iv.conf.save_years); window.location.reload(false);">';
	for(var i = 0; i < 3; i++) {
		lcl.res += '<option' + (iv.glbl.play == i ? ' selected' : '') + ' value="' + i + '">' + iv.lang[(24 + i)] + '</option>';
	}
	lcl.res += '</select></li><li class="end">' + iv.lang[27] + '<select class="int" onchange="js.set.cookie(\'stime\', this.value, iv.conf.save_years); window.location.reload(false);">';
	for(var i = 1; i < 11; i++) {
		lcl.res += '<option' + (i == iv.glbl.seconds ? ' selected' : '') + ' value="' + i + '">' + i + iv.lang[28] + '</option>';
	}
	lcl.res += '</select></li>' + lcl.end;
	iv.window('settings-holder', false, false, false, lcl.res)
}
//	Меню
iv.menu = function(links) {
	var lcl = {
		menu : {
			folders : [iv.lang[11], 'iv.list(false);', '#fid=' + iv.glbl.fid],
			prev : [iv.lang[12], (iv.glbl.count > 1 ? 'iv.prev();' : ''), '#fid=' + iv.glbl.fid + ';id=' + iv.glbl.prev],
			next : [iv.lang[13], (iv.glbl.count > 1 ?'iv.next();' : ''), '#fid=' + iv.glbl.fid + ';id=' + iv.glbl.next],
			play : [iv.lang[14], 'iv.play();'],
			pause : [iv.lang[15], 'iv.pause();'],
			zin : [iv.lang[16], 'iv.zoom(\'+\');'],
			zout : [iv.lang[17], 'iv.zoom(\'-\');'],
			zback : [iv.lang[18], 'iv.zoom(false);'],
			help : [iv.lang[19], 'iv.hide(\'help-holder\');']
		},
		start : '<ul>',
		end : '</ul>'
	}
	lcl.res = lcl.start;
	for(var i in lcl.menu) {
		lcl.cname = '';
		lcl.action = '';
		lcl.res += '<li>';
		if(i == 'folders' || i == 'help' || links == true) {
			lcl.cname = 'act ';
			lcl.action = ' onclick="' + lcl.menu[i][1] + '"';
			if(i == 'folders' || i == 'prev' || i == 'next') {
				lcl.res += '<a class="' + i + '"' + lcl.action + ' title="' + lcl.menu[i][0] + '" href="' + lcl.menu[i][2] + '"><!----></a>';
			} else {
				lcl.res += '<b class="act ' + i + '"' + lcl.action + ' title="' + lcl.menu[i][0] + '"><!----></b>';
			}
		} else {
			lcl.res += '<b class="' + i + '" title="' + lcl.menu[i][0] + '"><!----></b>';
		}
		lcl.res += '</li>';
	}
	lcl.res += lcl.end;
	iv.window('menu-holder', false, false, false, lcl.res)
}
//	Список превьюшек
iv.previews = function() {
	if(js.cookies.previews == 1) {
		var lcl = {
			start : '<ul>',
			end : '</ul>'
		}
		lcl.res = lcl.start;
		for(var i = iv.glbl.start; i < iv.glbl.stop; i++) {
			lcl.num = i;
			if(lcl.num < 0) {lcl.num = (iv.glbl.count - 0) + (lcl.num - 0);}
			lcl.img = '<img alt="" src="' + iv.glbl.dir + iv.glbl.album[lcl.num][5] + '" />';
			lcl.res += '<li';
			if(lcl.num == iv.glbl.curr) {
				lcl.res += ' class="curr">' + lcl.img;
			} else {
				lcl.res += '><a onclick="iv.to(' + lcl.num + ');" href="#fid=' + iv.glbl.fid + ';id=' + lcl.num + '">' + lcl.img + '</a>';
			}
			lcl.res += '</li>';
		}
		lcl.res += lcl.end;
		js.set.html('previews-holder', lcl.res);

	} else {
		js.set.html('previews-holder', '');
	}
}
//	Список папок и файлов
iv.list = function(hide) {
	var lcl = {
		count : 0,
		start : '<ul>',
		end : '</ul>'
	}
	iv.glbl.image = false;
	if(iv.folders[0][2] != true) {iv.folders.unshift([0, '', true]);}
	lcl.res = lcl.start;
	if(iv.folders[iv.glbl.fid]) {
		if(iv.glbl.fid != 0) {
			lcl.res += '<li class="back"><a onclick="iv.glbl.fid = ' + iv.folders[iv.glbl.fid][0] + '; iv.list(true);" href="#fid=' + iv.folders[iv.glbl.fid][0] + '">' + iv.lang[0] + '</a></li>';
		}
		for(var i in iv.folders) {
			if(i > 0 &&iv.folders[i][0] == iv.glbl.fid) {
				lcl.res += '<li class="folder"><a onclick="iv.glbl.fid = ' + i + '; iv.list(true);" href="#fid=' + i + '">' + iv.folders[i][2] + '</a></li>';
				lcl.count++;
			}
		}
		iv.album();
		if(iv.glbl.count > 0) {
			for(var i in iv.glbl.album) {
				if(iv.glbl.album[i][7] == '') {iv.glbl.album[i][7] = (iv.glbl.album[i][6] + '').substring(0, iv.glbl.album[i][6].length - 4);}
				lcl.res += '<li><a onclick="iv.to(' + i + ');" href="#fid=' + iv.glbl.fid + ';id=' + i + '">' + iv.glbl.album[i][7] + '</a></li>';
			}
		}
		lcl.res += lcl.end;
		iv.path(iv.glbl.fid);
		iv.menu(false);
		js.set.html('previews-holder', '');
		js.set.html('image-holder', '');
		iv.window('folders-holder', true, true, iv.lang[29] + '<b>' + lcl.count + '</b>' + iv.lang[32] + iv.lang[30] + '<b>' + iv.glbl.count + '</b>' + iv.lang[32] + iv.lang[31] + '<b>' + js.get.fsize(iv.glbl.size) + '</b>', lcl.res)
		if(hide == false) {iv.hide('folders-holder');}
	} else {
		alert(iv.error(1));
		iv.glbl.fid = 0;
		iv.url();
		iv.list(false);
	}
}
//	Изображение
iv.image = function() {
	var lcl = {el : js.get.element('folders-holder')}
	iv.glbl.opac = 0;
	iv.glbl.image = iv.glbl.album[iv.glbl.curr];
	if(iv.glbl.image) {
		iv.set();
		if(iv.glbl.image[7] == '') {iv.glbl.image[7] = iv.glbl.image[6];}
		js.set.html('image-holder', '<img style="opacity: 0; -moz-opacity: 0; -khtml-opacity: 0; filter: alpha(opacity=0);" id="image" class="link" width="' + iv.glbl.image[3] + '" height="' + iv.glbl.image[4] + '" onerror="alert(iv.error(0));" onload="iv.opacity();' + (iv.glbl.pause == false ? ' setTimeout(\'iv.slideshow();\', iv.glbl.seconds * 1000);' : '') + '" onclick="iv.hide(\'info-holder\');" alt="' + iv.glbl.image[7] + '" title="' + iv.glbl.image[7] + '" src="' + iv.glbl.dir + iv.glbl.image[6] + '" /><br />')
		iv.previews();
		iv.info();
		iv.path(iv.glbl.fid);
		iv.menu(true);
		js.set.cname(lcl.el, (js.cookies['list'] != 1 ? 'hidden' : 'win'), '');
	} else {
		alert(iv.error(2));
	}
}
//	Слайдшоу
iv.slideshow = function() {
	if(iv.glbl.pause == false) {
		if(iv.glbl.count > 1) {
			iv.next();
		} else {
			alert(iv.error(3));
		}
	}
}
//	Назад
iv.prev = function() {
	iv.glbl.curr = iv.glbl.prev;
	iv.image();
	iv.url();
}
//	Вперед
iv.next = function() {
	iv.glbl.curr = iv.glbl.next;
	iv.image();
	iv.url();
}
//	Перейти к изображению номер...
iv.to = function(num) {
	iv.glbl.curr = num;
	iv.image();
	iv.url();
}
//	Запустить слайдшоу
iv.play = function() {
	if(iv.glbl.pause != false) {
		iv.glbl.pause = false;
		iv.slideshow();
	}
}
//	Остановить слайдшоу
iv.pause = function() {
	iv.glbl.pause = true;
}
//	Интерпретировать нажатия "горячих клавиш"
iv.keyboard = function(event) {
	if(iv.glbl.image && event.ctrlKey) {
		if(event.keyCode == 27) {

		}
		if(iv.glbl.count > 0) {
			if(event.keyCode == 38) {iv.prev();}
			if(event.keyCode == 40) {iv.next();}
		}
	}
}