// $Id: previewer.js 7495 2009-05-19 08:48:20Z lexa $

var bottom_height = 145;
var enable_animation = false;

$(document).bind('click', function(e)
{
	return previewer_init(e);
});


//add previewer to href & area elements that have a class of .previewer
function previewer_init(e)
{
	var jelm = $(e.target);
	var elm = e.target;

	if ((e.type == 'click' || e.type == 'mousedown') && jQuery.browser.mozilla && e.which != 1) {
		return true;
	}

	// Dispatch click event
	if (e.type == 'click') {
		if (jelm.hasClass('cm-thumbnails')) {
			var link = jelm.parent('a');
			if (link.length) {
				var a = $(link).attr('href') || link.alt;
				var t = $(link).attr('rev') || '';
				previewer_show(t, a, jelm);
				jelm.blur();
			}

			return false;

		} else if (jelm.hasClass('cm-thumbnails-mini') || jelm.parent('a').hasClass('cm-thumbnails-mini')) {
			jelm = jelm.parent('a').hasClass('cm-thumbnails-mini') ? jelm.parent('a') : jelm;
			
			$('.cm-cur-item').removeClass('cm-cur-item');
			jelm.addClass('cm-cur-item');
			$('.cm-thumbnails').hide();
			$('.cm-thumbnails').eq($('.cm-thumbnails-mini').index(jelm)).show();
			$('.cm-thumbnails-opener').parent().hide();
			if ($('.cm-thumbnails-opener').eq($('.cm-thumbnails-mini').index(jelm)).attr('href')) {
				$('.cm-thumbnails-opener').parent().eq($('.cm-thumbnails-mini').index(jelm)).show();
			}
			jelm.blur();
			return false;

		} else if (jelm.hasClass('cm-thumbnails-opener')) {
			$('.cm-thumbnails:visible', jelm.parent().parent()).click();
			jelm.blur();
			return false;
		}
	}
}

//function called when the user clicks on a previewer link
function previewer_show(caption, url, owner)
{

	try {
		if (typeof document.body.style.maxHeight == 'undefined') {//if IE 6
			$('body', 'html').css({height: '100%', width: '100%'});
			$('html').css('overflow', 'hidden');
			if (!$('#previewer_hide_select').get(0)) {//iframe to hide select elements in ie6
				$('body').append('<iframe id="previewer_hide_select"></iframe><div id="previewer_overlay"></div><div id="previewer_window"></div>');
				$('#previewer_overlay').click(previewer_remove);
			}
		} else {//all others
			if (!$('#previewer_overlay').get(0)) {
				$('body').append('<div id="previewer_overlay"></div><div id="previewer_window"></div>');
				$('#previewer_overlay').click(previewer_remove);
			}
		}

		var previewer_thumbs = '';
		if (!owner.hasClass('cm-single')) {
			var previewer_thumbs_elm = $(".cm-thumbnails").parent('a');
			if (previewer_thumbs_elm.length > 1) {
				previewer_thumbs_elm = $(".cm-thumbnails");
				previewer_thumbs = '<div class="viewer-container"><table cellpadding="0" cellspacing="0" border="0"><tr><td><div id="prev_btn" class="hand"><img src="' + images_dir + '/icons/prev_btn.gif" width="17" height="17" border="0" alt=""  /></div></td><td><div id="viewer"><div id="thumbs_frame">';
				for (var i = 0; i < previewer_thumbs_elm.length; i++) {
					var thmb = previewer_thumbs_elm.eq(i);
					if (thmb.parent('a').length) {
						previewer_thumbs += '<img ' + (thmb.parent().attr('href') == url ? 'class="cm-current-thumb" ' : '') + 'src="' + thmb.attr('src') + '" alt="' + thmb.attr('alt') + '" onclick="previewer_change_image(this, \'' + thmb.parent().attr('href') + '\', \'' + thmb.parent().attr('rev') + '\'); return false;">';
					}
				}
				previewer_thumbs += '</div></div></td><td><div id="next_btn" class="hand"><img src="' + images_dir + '/icons/next_btn.gif" width="17" height="17" border="0" alt=""  /></div></td></tr></table></div>';
			}
		}

		img_preloader = new Image();
		img_preloader.onload = function() {
			img_preloader.onload = null;

			P_HEIGHT = 500;
			P_WIDTH = 400;

			$('#previewer_window').append('<div class="scroller-container"><div id="scroller_holder" style="width: 100%; height:' + P_WIDTH + 'px; overflow:hidden;"><div id="previewer_scroller" style="width: 100%; height:' + P_WIDTH + 'px; overflow:hidden;"><img id="previewer_image" src="' + url + '" alt="' + caption + '"/></div></div></div><div class="clear-both"></div><table id="preview_control" border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td align="center">' + previewer_thumbs + '</td></tr></table><div id="previewer_close"><span class="float-right">' + lang.press_esc_to + ' <a href="#" id="previewer_close_button" class="tool-link" title="' + lang.close + '">' + lang.close + '</a></span>' + (previewer_thumbs ? '* ' + lang.click_on_images_text : '') + '</div>');

			if (previewer_thumbs) {
				$("#viewer").imageScroller({
					next: 'prev_btn',
					prev: 'next_btn',
					frame: 'thumbs_frame',
					child: 'img'
				});
			}

			$('#previewer_image').bind('mousedown', function(e) {
				e = (e) ? e : window.event;
				var elm = e.target;
				try {
					e.preventDefault();
				} catch(error) {
				}

				var start_x = e.clientX;
				var start_y = e.clientY;
				var orig_x = $('#previewer_scroller').get(0).scrollLeft;
				var orig_y = $('#previewer_scroller').get(0).scrollTop;

				elm.onselectstart = function()
				{
					return false;
				};

				document.onmouseup = function()
				{
					elm.onmousemove = null;
					document.onmouseup = null;
				};

				elm.onmousemove = function(e)
				{
					e = (e) ? e : window.event;
					var k = 1.4;

					$('#previewer_scroller').get(0).scrollLeft = orig_x + (start_x - e.clientX) * k;
					$('#previewer_scroller').get(0).scrollTop = orig_y + (start_y - e.clientY) * k;
					
					return false;
				};

				return false;
			});

			$("#previewer_close_button").click(previewer_remove);

			document.onkeydown = function(e){ 	
				if (e == null) { // ie
					keycode = event.keyCode;
				} else { // mozilla
					keycode = e.which;
				}
				if(keycode == 27){ // close
					previewer_remove();
				}
			};

			$("#previewer_window").css({display: "block"});
			previewer_position(img_preloader);
		};

		img_preloader.src = url;

	} catch(e) {
		//nothing here
	}
}

function previewer_change_image(target, url, alt)
{
	$('#thumbs_frame img').removeClass('cm-current-thumb');
	$(target).addClass('cm-current-thumb');

	img_preloader = new Image();
	img_preloader.onload = function(){		
		img_preloader.onload = null;
		$('#previewer_scroller').get(0).scrollLeft = 0;
		$('#previewer_scroller').get(0).scrollTop = 0;
		$('#previewer_image').attr('src', url).attr('alt', alt);
		previewer_position(img_preloader, true);
	};
	img_preloader.src = url;
}

function previewer_init_control(skip_animation)
{
	var margin_top = $('#previewer_image').height() < $('#previewer_scroller').height() ? ($('#previewer_scroller').height() - $('#previewer_image').height()) / 2 : 0;
	if (skip_animation || !enable_animation) {
		$('#previewer_image').css('margin-top', margin_top + 'px');
	} else {
		$('#previewer_image').animate({marginTop: margin_top}, 200);
	}

	if ($('#previewer_scroller').height() >= $('#previewer_image').height() && $('#previewer_scroller').width() >= $('#previewer_image').width()) {
		$('#previewer_image').css('cursor', '');
	} else {
		$('#previewer_image').css('cursor', 'move');
	}
}

function previewer_init_scroller(skip_animation)
{
	var size = $('#thumbs_frame img:first').outerWidth(true);
	var thumb_count = $('#thumbs_frame img').length;
	var vis_count = Math.floor((P_WIDTH - 2 * $('#prev_btn').width() - 100) / size);
	$('#thumbs_frame').width(size * thumb_count);
	var count = thumb_count;
	if (thumb_count > vis_count) {
		count = vis_count;
		$('#prev_btn').css('visibility', 'visible');
		$('#next_btn').css('visibility', 'visible');
	} else {
		$('#prev_btn').css('visibility', 'hidden');
		$('#next_btn').css('visibility', 'hidden');
	}
	if (skip_animation || !enable_animation) {
		$('#viewer').css('width', count * size + 'px');
	} else {
		$('#viewer').animate({width: count * size});
	}
}

function previewer_remove()
{
	$('#previewer_close_button').unbind('click');
	$('#previewer_window').hide();
	$('#previewer_window, #previewer_overlay, #previewer_hide_select').trigger('unload').unbind().remove();

	if (typeof document.body.style.maxHeight == 'undefined') {//if IE 6
		$('body', 'html').css({height: 'auto', width: 'auto'});
		$('html').css('overflow', '');
	}
	document.onkeydown = '';
	document.onkeyup = '';
	return false;
}

function previewer_position(img, amimate)
{
	var pagesize = jQuery.get_window_sizes();
	var padding_side = 100; // padding (sum) from screen top and bottom
	var max_previewer_width = 940; // maximum previewer width
	var min_width = 400; // minimum image holder width
	var min_height = 450; // minimum image holder height
	var scrollbar_size = 17; 
	var h_diff = $('#previewer_window').height() - $('#scroller_holder').height();
	var w_diff = $('#previewer_window').width() - $('#scroller_holder').width();
	var max_width_limit = pagesize.view_width > max_previewer_width ? pagesize.view_width : max_previewer_width;
	var h_padding_size = $('#previewer_window').outerHeight() - $('#previewer_window').height();

	P_HEIGHT = img.height + h_diff + padding_side > pagesize.view_height ? pagesize.view_height - padding_side : img.height + h_diff;
	P_WIDTH = img.width + w_diff > max_previewer_width ? max_previewer_width : img.width + w_diff;
	P_HEIGHT = min_height > P_HEIGHT ? min_height : P_HEIGHT;
	P_WIDTH = min_width > P_WIDTH ? min_width : P_WIDTH;

	if (amimate && enable_animation) {
		$('#scroller_holder').animate({height: P_HEIGHT - h_diff + 'px'}, 400);
		$('#previewer_scroller').animate({height: P_HEIGHT - h_diff + 'px'}, 400, function() {$("#previewer_scroller").css({overflow: "hidden"});});

		previewer_init_scroller();

		var new_params = {marginLeft: '-' + parseInt((P_WIDTH / 2) + scrollbar_size, 10) + 'px', width: P_WIDTH + 'px', height: P_HEIGHT + 'px'};
		if (!(jQuery.browser.msie && parseInt(jQuery.ua.version, 10) < 8)) {
			new_params['marginTop'] = '-' + ((h_padding_size + P_HEIGHT) / 2) + 'px';
		}
		$('#previewer_window').animate(new_params, 400, previewer_init_control);
		
	} else {
		$('#scroller_holder').height(P_HEIGHT - h_diff);
		$('#previewer_scroller').height(P_HEIGHT - h_diff);

		$('#previewer_window').css({marginLeft: '-' + parseInt((P_WIDTH / 2) + scrollbar_size, 10) + 'px', width: P_WIDTH + 'px', height: P_HEIGHT + 'px'});
		if (!(jQuery.browser.msie && parseInt(jQuery.ua.version, 10) < 8)) {
			$('#previewer_window').css({marginTop: '-' + ((h_padding_size + P_HEIGHT) / 2) + 'px'});
		}
		previewer_init_scroller(true);
		previewer_init_control(true);
	}
}

jQuery.fn.imageScroller = function(params){
	var p = params;
	var btn_next = $('#' + p.next);
	var btn_prev = $('#' + p.prev);
	var img_frame = $('#' + p.frame);
	var child = p.child;

	var turn_up = function(){
		btn_prev.unbind('click', turn_up);
		img_frame.animate({marginLeft: - img_frame.find(child + ':first').width()}, 'fast', '', function(){
			img_frame.css('marginLeft', 0);
			img_frame.find(child + ':first').clone().appendTo(img_frame).show();
			img_frame.find(child + ':first').remove();
			btn_prev.bind('click', turn_up);
		});
	};

	var turn_down = function(){
		btn_next.unbind('click', turn_down);
		img_frame.find(child + ':last').clone().show().prependTo(img_frame);
		img_frame.css('marginLeft', - img_frame.find(child + ':first').width());
		img_frame.animate({marginLeft: 0}, 'fast', '', function(){
			img_frame.find(child + ':last').remove();
			btn_next.bind('click', turn_down);
		});
	};

	btn_next.css('cursor', 'hand').click(turn_down);
	btn_prev.css('cursor', 'hand').click(turn_up);
};