/**
 * @author Vlad Yakovlev (red.scorpix@gmail.com)
 * @link www.scorpix.ru
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 * @version 0.2.3
 * @date 2009-10-15
 * @requires jQuery
 * @requires uGallery
 */

/**
 * @param {String|Element|jQuery} previewEl
 * @param {String|Element|jQuery} viewEl
 * @param {Number} imageId
 * @param {String} ajaxUrl
 * @param {String} ajaxParams
 */
function gallery(previewEl, viewEl, imageId, ajaxUrl, ajaxParams) {
	previewEl = $(previewEl);

	var core = uGallery.core({
		previewEl: previewEl,
		previewContainerEl: previewEl.find('.previews .container'),
		previewContentEl: previewEl.find('.previews .content'),
		previewPicturesEl: previewEl.find('.previews .pictures'),
		eventDispatcher: uGallery.eventDispatcher(),
		viewEl: $(viewEl),
		preloaderWidth: previewEl.find('.preloader').innerWidth()
	});

	core.loader = uGallery.ajaxLoader(core, {
		ajaxUrl: ajaxUrl,
		ajaxParams: ajaxParams,
		imageId: imageId
	});

	galleryPictures(core);
	galleryInfoChanger(core);

/*	uGallery.previewRunner(core); */
	uGallery.pictures(core)
	uGallery.previewArrowScrolling(core);
	uGallery.previewDnd(core);
	uGallery.previewMover(core);
	uGallery.previewPreloader(core);
/*	uGallery.history(core); */

	uGallery.state(core, imageId, {
		maxHeight: 55,
		maxWidth: 75,
		margin: 4,
		screens: 0
	});
	
	return {
		core: function() {
			return core;
		}
	};
}

/**
 * Управление информацией о текущей фотографии.
 * @param {uGallery.Core} core Ядро галереи.
 */
function galleryInfoChanger(core) {

	var infoEl = core.viewEl.next('.picture_info');

	core.eventDispatcher.bind('imageSelected', function(evt) {
		update(evt.data.imageInfo);
	});

	function update(info) {
		infoEl.text($(info.info).find('>title').text());
	}
}

/**
 * @param {uGallery.core} core
 * @param {Object} [animateParams] Параметры анимации для jTweener'а.
 */
function galleryPictures(core, animateParams) {
	var
		tweenNsPrev = 'uGalleryPicturePrev' + Math.random(),
		tweenNsNext = 'uGalleryPictureNext' + Math.random();

	animateParams = $.extend({}, { time: .6 }, animateParams);

	var defaultCss = {
		display: '',
		height: '',
		left: '',
		margin: '',
		opacity: '',
		position: '',
		top: '',
		width: ''
	};

	var currentIndex;

	jTweener.addNSAction({
		onComplete: function() {
			onComplete(true);
		}
	}, tweenNsPrev);
	jTweener.addNSAction({
		onComplete: function() {
			onComplete(false);
		}
	}, tweenNsNext);
	core.viewEl.find('.picture').live('click', onPictureClick);
	core.eventDispatcher.bind('previewClick', change);

	function onPictureClick(evt) {
		if (core.busy() || core.animated() || core.paused()) return;

		evt.preventDefault();
		evt.stopPropagation();

		var isPrev = false;

		if ($(this).hasClass('prev_picture')) {
			isPrev = true;
		} else if (!$(this).hasClass('next_picture')) {
			return false;
		}

		var newIndex = isPrev ? core.loader.selectedIndex() - 1 : core.loader.selectedIndex() + 1;

		changeImage({
			current: core.loader.item(newIndex),
			prev: core.loader.item(newIndex - 1),
			next: core.loader.item(newIndex + 1)
		}, isPrev);

		return false;
	}

	function changeImage(imageData, isPrev) {
		var
			rootBlockOffset = core.viewEl.offset(),
			rootWidth = core.viewEl.width(),
			/** Неймспейс анимации. */
			ns,
			oldClass,
			newClass;

		if (isPrev) {
			oldClass = 'next_picture';
			newClass = 'prev_picture';
			ns = tweenNsPrev;
		} else {
			oldClass = 'prev_picture';
			newClass = 'next_picture';
			ns = tweenNsNext;
		}

		core.busy(true);

		/** Достаем текущие значения */
			/* изображение, которое появится */
			var newImage = createTempBlock(isPrev ? imageData.prev : imageData.next, !isPrev);
			/* изображение, которое было главным */
			var currentImage = { el: core.viewEl.find('.cur_picture') };
				currentImage.width = currentImage.el.width();
			/* изображение, которое станет главным */
			var newCurrentImage = { el: core.viewEl.find('.' + newClass) };
				newCurrentImage.offset = newCurrentImage.el.offset();
				newCurrentImage.img = newCurrentImage.el.find('img');
				newCurrentImage.width = newCurrentImage.img.width();
			/* изображение, которое исчезнет */
			var oldImage = { el: core.viewEl.find('.' + oldClass) };
				oldImage.offset = oldImage.el.offset();


		/** Выставляем начальные значения для анимации */
			/* изображение, которое появится */
			newImage.css( {
				left: isPrev ? 'auto' : newCurrentImage.offset.left - rootBlockOffset.left,
				opacity: 0		
			} ).addClass(newClass);
			/* изображение, которое было главным */
			currentImage.el.css( {
				display: 'block',
				left: Math.round((rootWidth - currentImage.width) / 2),
				position: 'absolute'
			} ).removeClass('no_hover');
			/* изображение, которое станет главным */
			newCurrentImage.el.css( {
				left: isPrev
					? newCurrentImage.offset.left - newCurrentImage.width
					: newCurrentImage.offset.left - rootBlockOffset.left,
				right: 'auto'
			} ).addClass('no_hover');
			newCurrentImage.img.css({
				right: 'auto'
			});


		/** Анимация */
		$t(newImage, animateParams).tween({
			opacity: 1,
			namespace: ns
		});
		$t(oldImage.el, animateParams).tween({
			opacity: 0,
			namespace: ns
		});
		$t(currentImage.el, animateParams).tween({
			left: isPrev ? oldImage.offset.left - rootBlockOffset.left : oldImage.offset.left - currentImage.width,
			namespace: ns
		});
		$t(newCurrentImage.el, animateParams).tween({
			left: Math.round((rootWidth - newCurrentImage.width) / 2) - 2,
			namespace: ns
		});
		
		currentIndex = imageData.current.index;
	}

	function change(evt) {
		if (core.busy() || core.animated() || core.paused()) return;

		var
			prevPicture = core.viewEl.find('.prev_picture'),
			curPicture = core.viewEl.find('.cur_picture'),
			nextPicture = core.viewEl.find('.next_picture');

		prevPicture.find('img').removeAttr('src');
		nextPicture.find('img').removeAttr('src');

		if (evt.data.prev) {
			prevPicture.css('visibility', '').find('img').attr('src', '/f/1/global/gallery/preload.gif');
			$('<img />').load( function() { prevPicture.find('img').attr('src', evt.data.prev.image.src); } ).attr('src', evt.data.prev.image.src);
		} else prevPicture.css('visibility', 'hidden');
/*
		evt.data.prev
			? prevPicture
					.css('visibility', '')
					.find('img').attr('src', evt.data.prev.image.src)
			: prevPicture.css('visibility', 'hidden');
*/
		if (evt.data.current) {
			curPicture.find('img').removeAttr('src').attr('src', '/f/1/global/gallery/preload.gif');
			$('<img />').load( function() { curPicture.find('img').attr('src', evt.data.current.image.src); } ).attr('src', evt.data.current.image.src);

/*			curPicture.find('img').removeAttr('src').attr('src', evt.data.current.image.src); */
		}

		if (evt.data.next) {
			nextPicture.css('visibility', '').find('img').attr('src', '/f/1/global/gallery/preload.gif');
			$('<img />').load( function() { nextPicture.find('img').attr('src', evt.data.next.image.src); } ).attr('src', evt.data.next.image.src);
		} else nextPicture.css('visibility', 'hidden');
/*
		evt.data.next
			? nextPicture
					.css('visibility', '')
					.find('img').attr('src', evt.data.next.image.src)
			: nextPicture.css('visibility', 'hidden');
*/

		core.eventDispatcher.dispatch('imageSelect', {
			index: evt.data.current.index,
			imageInfo: evt.data.current
		});
	}

	function createTempBlock(imageEl, isAppend) {
		var el = $('<b class="hid_picture picture"><img alt="" /></b>');

		if (imageEl) {
			var eImageEl = el.find('img');
			eImageEl.attr('src', '/f/1/global/gallery/preload.gif');
			$('<img />').load( function() { eImageEl.attr('src', imageEl.image.src); } ).attr('src', imageEl.image.src);
		} else el.css('visibility', 'hidden');
/*
		imageEl
			? el.find('img').attr('src', imageEl.image.src)
			: el.css('visibility', 'hidden');
*/
		return isAppend ? el.appendTo(core.viewEl) : el.prependTo(core.viewEl);
	}


	function onComplete(isPrev) {
		var
			prevPicture = core.viewEl.find('.prev_picture').not('.hid_picture'),
			curPicture = core.viewEl.find('.cur_picture').not('.hid_picture'),
			nextPicture = core.viewEl.find('.next_picture').not('.hid_picture'),
			hidPicture = core.viewEl.find('.hid_picture');

		curPicture.css(defaultCss).removeClass('cur_picture');

		if (isPrev) {
			prevPicture.css(defaultCss).removeClass('prev_picture').addClass('cur_picture');
			curPicture.addClass('next_picture');
			nextPicture.remove();
		} else {
			nextPicture.css(defaultCss).removeClass('next_picture').addClass('cur_picture');
			curPicture.addClass('prev_picture');
			if (prevPicture.parent(core.viewEl)) prevPicture.remove();
		}
		hidPicture.css(defaultCss).removeClass('hid_picture');

		prevPicture = core.viewEl.find('.prev_picture'),
		prevPicture.css('right', '');
		prevPicture.find('img').css('right', 0);

		core.viewEl.css('height', '');
		core.animated(false);
		core.busy(false);


		core.eventDispatcher.dispatch('imageSelect', {
			index: currentIndex,
			imageInfo: core.loader.item(currentIndex)
		});
	}
	
	return {
		core: function() {
			return core;
		}
	};

}

/*
// В IE < 8 не работает ховер на стрелках.
$.browser.msie && 8 > parseInt($.browser.version) && $(function() {

	var
		prevArrowEl = $('#gallery .prev'),
		nextArrowEl = $('#gallery .next'),
		arrowTop = prevArrowEl.find('.icon ins').position().top;

	var arrowHoverIn = function() {
		$(this).addClass('hover').find('.icon ins').css('top', '');
	};
	var arrowHoverOut = function() {
		$(this).removeClass('hover').find('.icon ins').css('top', arrowTop);
	};

	prevArrowEl.hover(arrowHoverIn, arrowHoverOut);
	nextArrowEl.hover(arrowHoverIn, arrowHoverOut);
});
*/



/**
 * Функции показа и прятания фотогалереи - запускаются с самой страницы
 */
var hGalleryVideoParams = {
	allowFullscreen: "true",
	allowScriptAccess : "sameDomain",
	wmode: "transparent"
};

var aGalleries = [];
function VolshebnikGallery(id, sName, hAjaxParams, sDefaultImageId) {
	this.id = id;
	this.sName = sName;
	this.eLayout = null;
	this.eGallery = null;
	this.eMenuItem = null;
	this.sLayoutID = 'gallery_layout_' + id;
	this.sGalleryID = 'gallery_images_' + id;
	this.oUGallery = null;
	this.hAjaxParams = hAjaxParams;
	this.sDefaultImageId = sDefaultImageId;
	this.isBuiltVideoPlayer = false;
	this.aSubGalleries = [];
	this.sCurrentSubID = null;

	return this;
}

function addProgramGallery(sID, sSubGalleryName, hAjaxParams, sDefaultImageId) {
	if (window.aGalleries) {
		if (!aGalleries['program']) aGalleries['program'] = new VolshebnikGallery('program', null, null, null);
		aGalleries['program'].aSubGalleries[sID] = new VolshebnikGallery(sID, sSubGalleryName, hAjaxParams, sDefaultImageId);
	}
}

var sCurrentGalleryID = null;
function showGallery(sGalleryID, sSubGalleryID, sImageID) {
	if (window.aGalleries && aGalleries[sGalleryID]) {
		var oGallery = aGalleries[sGalleryID];
		/* если эту галлерею еще не показывали - нужно создать слои для нее */
		if (!oGallery.eLayout) { createGalleryElements(oGallery); }

		/* показываем обвязку галлереи */
		$('#gallery_shadow, #' + aGalleries[sGalleryID].sLayoutID).removeClass('hidden');
		/* размещаем ее в поле зрения пользователя */
		$('#' + aGalleries[sGalleryID].sLayoutID).css('top', $('body').get(0).scrollTop);

		/* убираем текущий выбранный пункт */
		if (oGallery.sCurrentSubID && oGallery.aSubGalleries[oGallery.sCurrentSubID]) {
			oGallery.aSubGalleries[oGallery.sCurrentSubID].eGallery.addClass('hidden');
			oGallery.aSubGalleries[oGallery.sCurrentSubID].eMenuItem.removeClass('selected');
			oGallery.sCurrentSubID = null;
		}
		var oCurrentGallery = null;
		/* показываем элементы для галлереи, селектим новый пункт меню */
		if (sSubGalleryID && oGallery.aSubGalleries[sSubGalleryID]) {
			oGallery.aSubGalleries[sSubGalleryID].eMenuItem.addClass('selected');
			oGallery.sCurrentSubID = sSubGalleryID;
			oCurrentGallery = oGallery.aSubGalleries[sSubGalleryID];
		} else if (oGallery.eGallery) {
			oCurrentGallery = oGallery;
		}
		oCurrentGallery.eGallery.removeClass('hidden');

		/* загружаем галлерею */
		if (oCurrentGallery.hAjaxParams) {
			if (!sImageID) sImageID = oCurrentGallery.sDefaultImageId;
			if (!oCurrentGallery.oUGallery) {
				/* если галлерею еще не создавали - нужна новая */
				setTimeout(function() {
					oCurrentGallery.oUGallery = gallery('#' + oCurrentGallery.sGalleryID + ' .gallery_strip', '#' + oCurrentGallery.sGalleryID + ' .big_pictures', sImageID, '/gal/', oCurrentGallery.hAjaxParams);
				}, 1);
			} else {
				/* если галлерея уже была - нужно просто показать картинку */
				var oCore = oCurrentGallery.oUGallery.core();
				oCore.eventDispatcher.dispatch('resume');
				var sImgIndex = oCore.loader.indexById(sImageID);
				oCore.eventDispatcher.dispatch('previewClick', {
					current: oCore.loader.item(sImgIndex),
					prev: oCore.loader.item(sImgIndex - 1),
					next: oCore.loader.item(sImgIndex + 1)
				});
			}
		} else {
			/* если нет hAjaxParams - скорее всего нужно показать видео */
			if (!oCurrentGallery.isBuiltVideoPlayer && window.swfobject && window.hGalleryVideoParams) {
				swfobject.embedSWF(
					"/f/1/global/gallery/player.swf", oCurrentGallery.sGalleryID + '_player',
					"600", "400", "9.0.0", "/f/1/global/gallery/expressInstall.swf",
					hGalleryVideoVars, hGalleryVideoParams
				);
				oCurrentGallery.isBuiltVideoPlayer = true;
			}
		}
		
		sCurrentGalleryID = sGalleryID;
	}
}

function createGalleryElements(oGallery) {
	/* клонируем обвязку для всей галлереи (вместе с подгаллереями) */
	oGallery.eLayout = $('#gallery_layout').clone(true).attr('id', oGallery.sLayoutID).appendTo($('#gallery_layout').parent());
	/* название галлереи */
	$('#' + oGallery.sLayoutID + ' h1 a').text(oGallery.sName);
	/* подгаллереи */
	var bHaveSubGalleries = false;
	for (var sSubID in oGallery.aSubGalleries) {
		createSubGalleryMenuItem(oGallery, sSubID);
		bHaveSubGalleries = true;
	}
	/* если нет подгаллерей - значит нужна просто обвязка для картинок галлереи */
	if (!bHaveSubGalleries) oGallery.eGallery = $('#gallery_images').clone(true).attr('id', oGallery.sGalleryID).appendTo(oGallery.eLayout);
}

function createSubGalleryMenuItem(oGallery, sSubID) {
	/* навигация */
	oGallery.aSubGalleries[sSubID].eMenuItem = $(document.createElement('u')).text(oGallery.aSubGalleries[sSubID].sName).appendTo($('#' + oGallery.sLayoutID + ' .navigation'))
		.click( function() { switchGallery(sSubID); } );
	$(document.createTextNode(' ')).appendTo($('#' + oGallery.sLayoutID + ' .navigation'));
	if (oGallery.aSubGalleries[sSubID].hAjaxParams) {
		/* обвязка для картинок подгаллереи */
		oGallery.aSubGalleries[sSubID].eGallery = $('#gallery_images').clone(true).appendTo(oGallery.eLayout).attr('id', oGallery.aSubGalleries[sSubID].sGalleryID);
	} else {
		/* обвязка для видео... */
		oGallery.aSubGalleries[sSubID].eGallery = $('#gallery_video').clone(true).appendTo(oGallery.eLayout).attr('id', oGallery.aSubGalleries[sSubID].sGalleryID);
		/* ... и элемент для плеера */
		tmp = $(document.createElement('div')).attr('id', oGallery.aSubGalleries[sSubID].sGalleryID + '_player').appendTo(oGallery.aSubGalleries[sSubID].eGallery);
	}
}


function hideGallery() {
	if (sCurrentGalleryID && aGalleries[sCurrentGalleryID]) {
		var oGallery = aGalleries[sCurrentGalleryID];
		var oSubGallery = oGallery.aSubGalleries[oGallery.sCurrentSubID];
		/* находим что это было за галлерея */
		var oCurrentGallery = (oSubGallery)? oSubGallery.oUGallery : oGallery.oUGallery;
		/* останавливаем ее */
		if (oCurrentGallery) {
			var oCore = oCurrentGallery.core();
			oCore.eventDispatcher.dispatch('pause');
		}
		/* скрываем элементы для картинок */
		if (oSubGallery) oSubGallery.eGallery.addClass('hidden');
		else if (oGallery.eGallery) oGallery.eGallery.addClass('hidden');
		/* скрываем всю галлерею */
		oGallery.eLayout.addClass('hidden');
		/* скрываем фон */
		$('#gallery_shadow').addClass('hidden');
		
		sCurrentGalleryID = null;
	} else if (isPhonesShown) {
		/* скрываем телефонов */
		$('#phones_popup').addClass('hidden');
		$('#gallery_shadow').addClass('hidden');
		isPhonesShown = false;
	}
}

function switchGallery(sNewSubGalleryID) {
	if (sCurrentGalleryID && aGalleries[sCurrentGalleryID]) {
		var oGallery = aGalleries[sCurrentGalleryID];
		if (oGallery.sCurrentSubID == sNewSubGalleryID) return;
		
		var oSubGallery = oGallery.aSubGalleries[oGallery.sCurrentSubID];
		var oNewSubGallery = oGallery.aSubGalleries[sNewSubGalleryID];

		if (!oSubGallery || !oNewSubGallery) return;

		if (oSubGallery.oUGallery) {
			var oCore = oSubGallery.oUGallery.core();
			oCore.eventDispatcher.dispatch('pause');
		}
		
		if (oSubGallery.eGallery) oSubGallery.eGallery.addClass('hidden');
		oSubGallery.eMenuItem.removeClass('selected');

		if (oNewSubGallery.eGallery) oNewSubGallery.eGallery.removeClass('hidden');
		oNewSubGallery.eMenuItem.addClass('selected');

		if (oNewSubGallery.oUGallery) {
			var oCore = oNewSubGallery.oUGallery.core();
			oCore.eventDispatcher.dispatch('resume');
		} else if (oNewSubGallery.hAjaxParams) {
			oNewSubGallery.oUGallery = gallery('#' + oNewSubGallery.sGalleryID + ' .gallery_strip', '#' + oNewSubGallery.sGalleryID + ' .big_pictures', oNewSubGallery.sDefaultImageId, '/gal/', oNewSubGallery.hAjaxParams);
		} else if (!oNewSubGallery.isBuiltVideoPlayer && window.swfobject && window.hGalleryVideoParams) {
			swfobject.embedSWF(
				"/f/1/global/gallery/player.swf", oNewSubGallery.sGalleryID + '_player',
				"521", "400", "9.0.0", "/f/1/global/gallery/expressInstall.swf",
				hGalleryVideoVars, hGalleryVideoParams
			);
			oNewSubGallery.isBuiltVideoPlayer = true;
		}

		oGallery.sCurrentSubID = sNewSubGalleryID;

	}
}


var isPhonesShown = false;
function showPhones() {
	/* показываем фон */
	$('#gallery_shadow').removeClass('hidden');
	/* показываем телефонов */
	$('#phones_popup').removeClass('hidden');
	/* размещаем их в поле зрения пользователя */
	$('#phones_popup').css('top', $('body').get(0).scrollTop);
	isPhonesShown = true;
}
