var tag = 'a';
var cls = 'jsps';
var bigPost = '';
var txtPost = '';
var padding = 52;
var shade_opacity = 0.7;
var shade_smooth = true;
var pic_smooth = false;
var size_step = 14;
var opacity_step = 0.1;
var fps = 30;
var ttrs = 500;
var pic;
var theOne = true;
var isIE, isIE6 = false, isIE7 = false, isWebkit, isWebkit419, isWebkit420, isGecko, isOpera;//, isKhtml;

var xpath = !!(document.evaluate);
//if ( window.ActiveXObject )
if ( navigator.userAgent.indexOf ("MSIE") != -1 )
{
	isIE = true;
	isIE6 = !(isIE7 = navigator.userAgent.indexOf ("MSIE 7") != -1);
}
else if (document.childNodes && !document.all && !navigator.taintEnabled)
{
	isWebkit = true;
	if ( xpath ) isWebkit420 = true;
	else isWebkit419 = true;
}
else if (document.getBoxObjectFor != null) isGecko = true;
else isOpera = true;
//isKhtml = isWebkit;
/*
var log_wnd;
function log ( msg )
{
	if ( log_wnd == null )
	{
		log_wnd = window.open("", "Lexx JS Log");
	}
	log_wnd.document.write(msg + '<br/>');
}
*/
function setOpacity (obj, opacity)
{
	if (opacity == 0){
		if (obj.style.visibility != "hidden") obj.style.visibility = "hidden";
	} else {
		if (obj.style.visibility != "visible") obj.style.visibility = "visible";
	}
	if (!obj.currentStyle || !obj.currentStyle.hasLayout) obj.style.zoom = 1;
	if (isIE) obj.style.filter = (opacity == 1) ? '' : "alpha(opacity=" + opacity * 100 + ")";
	obj.style.opacity = opacity;
	obj.opacity = opacity;
}

function getStyle (obj, prop)
{
	if ( /*prop.constructor == Array || prop.constructor == Object || typeof prop == 'array' || */typeof prop == 'object' )
	{
		var style = [];
		for ( var i = 0; i < prop.length; i++ )
		{
			style[i] = getStyle(obj, prop[i]);
		}
		return style;
	}
	else
	{
		if ( isIE ) return obj.currentStyle[prop];
		else return obj.style[prop];
	}
	
}

function setStyle (obj, prop, value)
{
	if ( /*prop.constructor == Array || prop.constructor == Object || typeof prop == 'array' || */typeof prop == 'object' ) for ( var i = 0; i < prop.length; i++ )
	{
		setStyle(obj, prop[i], value[i]);
	}
	else
	{
		obj.style[prop] = value;
	}
}

function getScrollHeight ()
{
	if (isIE) return document.documentElement.scrollHeight;
	if (isWebkit) return document.body.scrollHeight;
	return document.documentElement.scrollHeight;
}

function getScrollWidth ()
{
//	alert(document.documentElement.offsetWidth+' - '+document.documentElement.scrollWidth);
//	if (isIE) return Math.min(document.documentElement.offsetWidth, document.documentElement.scrollWidth);
	if (isIE) return document.documentElement.scrollWidth;
	if (isWebkit) return document.body.scrollWidth;
	return document.documentElement.scrollWidth;
}

function getWidth ()
{
	if (isWebkit419) return window.innerWidth;
	if (isOpera) return document.body.clientWidth;
	return document.documentElement.clientWidth;
}

function getHeight ()
{
	if (isWebkit419) return window.innerHeight;
	if (isOpera) return document.body.clientHeight;
	return document.documentElement.clientHeight;
}

function addEvent ( el, ev, fn )
{
	if ( el.addEventListener )
		el.addEventListener(ev, fn, false);
	else
		el['on'+ev] = fn;
}

function cEl ( tag, id, cls, op )
{
	var el = document.createElement(tag);
	if (id) el.id = id;
	if (cls) el.className = cls;
	if(typeof op=='number')
		setOpacity(el, op);
	return el;
}

function getEl ( tag, cls )
{
	var tmp = document.getElementsByTagName(tag);
	var f = [];
	var j = 0;
	for ( var i = 0; i < tmp.length; i++ )
	{
		if ( tmp[i].className == cls )
			f[j++] = tmp[i];
	}
	return f;
}

function show ( obj, how, opacity )
{
	setStyle(obj, 'display', how ? how : 'block');
	setOpacity(obj, (opacity ? opacity : 1));
}

function hide ( obj, opacity )
{
	setStyle(obj, 'display', 'none');
	setOpacity(obj, opacity ? opacity : 0);
}

function stepOpacity(obj, so, ostep, nums, i)
{
	var os = ostep*nums;
	var s = (Math.PI/2) / (nums);
	
	obj.timer[i] = setTimeout(function(){
		setOpacity(obj, so + os * Math.sin(s*i));
	}, i * 1000 / fps);
}

function sOpacity ( obj, opacity, fn )
{
	if ( typeof obj.timer == 'object' && obj.timer.length > 0)
	{
		for (var i in obj.timer)
			clearTimeout(obj.timer[i]);
	}
	obj.timer = new Array();
	if ( obj.opacity != opacity )
	{
		var time = Math.abs(obj.opacity - opacity) * 300;
		var nums = Math.ceil(time / 1000 * fps);
		time = nums * 1000 / fps;
		var ostep = (opacity - obj.opacity) / nums;
		for (var i = 0; i <= nums; i++)
		{
			stepOpacity(obj, obj.opacity, ostep, nums, i);
		}
		if ( typeof fn == 'function' )
			obj.timer[i+1] = setTimeout(function(){ fn(obj); }, (i+1)*1000/fps);
	}
	else
		if ( typeof fn == 'function' ) fn(obj);
}

function stepSize(obj, sw, sh, wstep, hstep, nums, i)
{
	var ws = wstep*nums;
	var hs = hstep*nums;
	var s = (Math.PI/2) / (nums);
	
	obj.timer[i] = setTimeout(function(){
		obj.style.width = sw + Math.round(ws * Math.sin(s*i))+'px';
		obj.style.marginLeft = - Math.round((parseInt(obj.style.width) + padding / 2) / 2) + 'px';
		obj.style.height = sh + Math.round(hs * Math.sin(s*i))+'px';
		obj.style.marginTop = - Math.round((parseInt(obj.style.height) + padding / 2) / 2) + 'px';
	}, i * 1000 / fps);
}

function sSize(obj, time, width, height, fn)
{
	if ( typeof obj.timer == 'object' && obj.timer.length > 0)
	{
		for (var i in obj.timer)
			clearTimeout(obj.timer[i]);
	}
	obj.timer = new Array();
	var obj_width = parseFloat(getStyle(obj, 'width'));
	var obj_height = parseFloat(getStyle(obj, 'height'));
	if ( obj_width != width || obj_height != height)
	{
		time = Math.max(Math.abs((width - obj_width)) * 2, Math.abs(height - obj_height) * 2);
		var nums = Math.ceil(time / 1000 * fps);
		time = nums * 1000 / fps;
		var wstep = (width - obj_width + 4) / nums;
		var hstep = (height - obj_height + 4) / nums;
//		alert('width: '+width+' height: '+height+' ow: '+obj_width+' oh: '+obj_height);
//		alert(wstep+' '+hstep+' nums: '+nums+' time: '+time);
		for (var i = 0; i <= nums; i++)
		{
			stepSize(obj, obj_width, obj_height, wstep, hstep, nums, i);
		}
		if ( typeof fn == 'function' )
			obj.timer[i+1] = setTimeout(function(){ fn(obj); }, (i+1)*1000/fps);
	}
	else if ( typeof fn == 'function' )
		fn (obj);

}

function hidePic (fn)
{
	canShow = false;
	if ( typeof fn != 'function' )
	{
		shade_smooth ? sOpacity(shade, 0, hide) : hide(shade);
		hide(psf);
		hide(nav);
		setStyle(psf, ['marginLeft', 'marginTop', 'width', 'height'], ['-160px', '-160px', '300px', '300px']);
		nav.style.marginTop = nav.style.width = '';
	}
	else
		sOpacity(pic, 0, fn);
}

var shade = cEl('div', 'jsps_shade', '', 0);
setStyle(shade, ['width', 'height', 'display'], [getScrollWidth() + 'px', getScrollHeight() + 'px', 'none']);
var tmp = document.body.firstChild;
document.body.insertBefore(shade, tmp);

var psf = cEl('div', 'jsps_psf', '', 0);
setStyle(psf, ['marginLeft', 'marginTop', 'width', 'height', 'display'], ['-160px', '-160px', '300px', '300px', 'none']);
document.body.appendChild(psf);
if (isIE6)
{
	var ifrm = cEl('iframe', '', '', -1);
	ifrm.frameborder = 0;
	ifrm.scrolling = 'no';
	ifrm.src = 'javascript: document.write(""); document.close();';
	setStyle(ifrm, ['position', 'width', 'height'], ['absolute', '100%', '100%']);
	shade.appendChild(ifrm);
}

var btnClose = new Image();
btnClose.id = 'jsps_close';
btnClose.src = '/images/psclose.png';
//setOpacity(loader, 0);
psf.appendChild(btnClose);
addEvent(btnClose, 'click', function(){
	hidePic();
});

var loader = new Image();
loader.id = 'jsps_loader';
loader.src = '/images/loader.gif';
setOpacity(loader, 0);
psf.appendChild(loader);
//addEvent(loader, 'click', hidePic);

var pics = new Object();
var texts = new Object();
var canShow = false;

function showPic ( sa )
{
	if ( canShow )
	{
		//hide(psf);
		sa = sa || (shade.style.display == 'block'); //sa = (!sa ? shade.style.display == 'block' : true);
		var st = ['marginLeft', 'marginTop', 'width', 'height'];
		var ss = getStyle(psf, st);
		//setOpacity(pic, 0);
		psf.style.marginLeft = psf.style.marginTop = psf.style.width = psf.style.height /*= pic.style.width = pic.style.height */ = text.style.width = '';
		psf.style.display = 'block';
		if (isOpera) pic.style.display = 'block';
		if (!pic.origWidth) pic.origWidth = pic.width;

		if (!pic.origHeight) pic.origHeight = pic.height;
		var pic_width = pic.origWidth;
		var pic_height = pic.origHeight;
		if ( pic.width + padding > getWidth() )
		{
			pic_width = getWidth() - padding;
			pic_height = pic.height * (pic_width / pic.width);
		}
		setStyle(pic, ['width', 'height'], [pic_width + 'px', pic_height + 'px']);
		setStyle(psf, ['marginLeft', 'width'], ['-' + pic_width / 2 + 'px', pic_width + 'px']);

		var textHeight = 0;
		var navHeight = 0;
		if ( theOne )
		{
//			if ( text.innerHTML )
//			{
				show(text);
				textHeight = text.offsetHeight;
//			}
		}
		else
		{
			text.innerHTML = texts[pic.src].innerHTML;
			show(text);
			textHeight = text.offsetHeight;
			show(nav);
			navHeight = nav.offsetHeight;
		}
		
		if ( pic_height + textHeight + navHeight + padding > getHeight() )
		{
			pic_height = getHeight() - textHeight - navHeight - padding;
			pic_width = pic.width * (pic_height / pic.height);
			setStyle(pic, ['width', 'height'], [pic_width + 'px', pic_height + 'px']);
		}
		if ( pic_width < 200 )
		{
			pic_width = 200;
			pic_height = pic.height * (pic_width / pic.width);
			setStyle(pic, ['width', 'height'], [pic_width + 'px', pic_height + 'px']);
		}
		pic.style.display = nav.style.display = text.style.display = 'none';
		setStyle(psf, st, ss);
		text.style.marginTop = pic_height + 'px';
		setStyle(nav, ['width', 'marginTop'], [pic_width + 'px', (pic_height + textHeight - padding / 2) / 2 + 'px']);
		if ( sa )
		{
			sSize(psf, ttrs, parseInt(pic_width), parseInt(pic_height + textHeight + navHeight), function()
			{
				text.style.width = pic_width + 'px';
				pic.style.display = nav.style.display = text.style.display = 'block';
				hide(loader);
				sOpacity(pic, 1)
			});
			if ( pic_smooth )
				sOpacity(psf, 1);
			else
				show(psf);
		}
		else
		{
			setStyle(psf, ['marginTop', 'height'], ['-' + (pic_height + textHeight + navHeight + padding / 2) / 2 + 'px', pic_height + textHeight + navHeight + 'px']);
		}
		canShow = false;
	}
	else
		canShow = true;
	return canShow;
}

function cPic ()
{
	if (typeof pic == 'object')
	{
		pic.parentNode.removeChild(pic);
		delete pic;
	}
	pic = new Image();
	pic.id = 'jsps_pic';
	setOpacity(pic, 0);
	psf.appendChild(pic);
	addEvent(pic, 'load', showPic);
	addEvent(pic, 'click', function(){
		hidePic(imgs.length > 1 && !theOne ? function(){
			loadPic(imgs_index[pic.src] < imgs.length ? imgs[imgs_index[pic.src]] : imgs[0]);
			return false;
		} : null);
	});
}

var text = cEl('div', 'jsps_text', '', 0);
psf.appendChild(text);

var nav = cEl('div', 'jsps_nav', '', 0);
psf.appendChild(nav);

var prev = cEl('div', 'jsps_prev');
nav.appendChild(prev);
prev.innerHTML = '« <span>Назад</span>';
addEvent(prev, 'click', function()
{
	hidePic(function(){loadPic(imgs[imgs_index[pic.src] - 2])});
});

var next = cEl('div', 'jsps_next');
nav.appendChild(next);
next.innerHTML = '<span>Вперёд</span> »';
addEvent(next, 'click', function()
{
	hidePic(function(){loadPic(imgs[imgs_index[pic.src]])});
	return false;
});

var num = cEl('div', 'jsps_num');
nav.appendChild(num);

var imgs = getEl(tag, cls);
var imgs_index = [];

function loadPic(obj, one)
{
	theOne = true;
//	pic.style.width = pic.style.height = '';
	cPic();
	shade.style.display = 'block';
	if ( shade_smooth )
	{
		sOpacity(shade, shade_opacity, function(){ getImage(obj); });
	}
	else
	{
		show(shade, 'block', shade_opacity);
		getImage(obj);
	}
	return false;
}

function getImage(obj)
{
	show(loader);
	hide(text);
	if ( !theOne )
	{
		show(nav);
		num.innerHTML = imgs_index[obj.href] + ' из ' + imgs.length;
		if ( imgs_index[obj.href] == 1 )
			setStyle(prev, 'visibility', 'hidden');
		else
			setStyle(prev, 'visibility', 'visible');
		if ( imgs_index[obj.href] == imgs.length )
			setStyle(next, 'visibility', 'hidden');
		else
			setStyle(next, 'visibility', 'visible');
	}
	hide(pic);
	setStyle(psf, ['top', 'left'], [(window.pageYOffset || document.documentElement.scrollTop) + getHeight() / 2 + 'px', (window.pageXOffset || document.documentElement.scrollLeft) + getWidth() / 2 + 'px']);
	show(psf);
	if ( theOne )
	{
		canShow = true;
		text.innerHTML = obj.title;
		pic.src = obj.href;
		//showPic(false, obj, one);
	}
	else
	{
		if ( pics[obj.href] && pics[obj.href].width && pics[obj.href].height )
		{
			pic.src = pics[obj.href].src;
			pic.alt = obj.title;
			canShow = true;
			showPic();
		}
		else
		{
			canShow = true;
			pics[obj.href] = new Image();
			pics[obj.href].src = pic.src = obj.href + bigPost;
			pic.alt = obj.title;
			texts[obj.href] = cEl('div');
//			ajs(txtPref + obj.href + txtPost, '', texts[obj.href], showPic);
		}
	}
}

for ( var i = 0; i < imgs.length; i++ )
{
	imgs_index[imgs[i].href] = i + 1;
	addEvent(imgs[i], 'click', function(e)
	{
		e = e || window.event;
		loadPic(this);
		e.returnValue = false;
		if(e.preventDefault) e.preventDefault();
		return false;
	});
}

addEvent(window, 'scroll', function()
{
	setStyle(psf, ['top', 'left'], [(window.pageYOffset || document.documentElement.scrollTop) + getHeight() / 2 + 'px', (window.pageXOffset || document.documentElement.scrollLeft) + getWidth() / 2 + 'px']);
});

addEvent(window, 'resize', function()
{
	setStyle(shade, ['width', 'height'], [getWidth() + 'px', getScrollHeight() + 'px']);
	setStyle(psf, ['top', 'left'], [(window.pageYOffset || document.documentElement.scrollTop) + getHeight() / 2 + 'px', (window.pageXOffset || document.documentElement.scrollLeft) + getWidth() / 2 + 'px']);
	if (psf.style.display == 'block' && psf.opacity == 1) { canShow = true; showPic(false); }
});