// wnditm_viewer.js

var _viewerBoxPadding = 0;
var _viewImgPopupID = 0;
var _viewerList = new List();

//---------------------------------------------------------------------
var curtainPopup_itms = 
	[
	{label:"No Curtains", func:setCurtainOpacity, data:0},
	{label:"Light", func:setCurtainOpacity, data:.3},
	{label:"Medium", func:setCurtainOpacity, data:.6},
	{label:"Dark", func:setCurtainOpacity, data:.8},
	];
//---------------------------------------------------------------------
var curtainPopup = 
	{
	itms:curtainPopup_itms
	};
//---------------------------------------------------------------------
var viewImgPopup_itms = 
	[
	{label:"Set as desktop", func:setAsDesktop}
	];
//---------------------------------------------------------------------
var viewImgPopup = 
	{
	width:110,
	itms:viewImgPopup_itms
	};
	
//------------------------------------------------------------
function wnditm_viewer_add(itm, wnd)
	{
	if (_viewImgPopupID == 0) _viewImgPopupID = menu_registerPopup(viewImgPopup);
	var viewer = wnditm_div_add(itm, wnd).addClass("viewer");
	var viewerItems = wnditm_div_add({klass:"viewerItems"}, viewer);
	if (gParElem) var parWndID = gParElem.attr("parWnd"); 
	var photos;
	if (parWndID) photos = $("#"+parWndID).find(".photos");
	else if (gParElem) photos = gParElem.parent();
	if (photos)
		{
		var boxes = photos.children();	
		var ht = viewer.height();
		var size = ps_getSizeFromHt(ht);
		var rect = ps_getRect(size);
		if (rect.width == 0) 
			{
			rect.height = ht;
			rect.width = (640 * ht) / 480;
			}
		boxes.each(function()
			{
			var srcImg = $(this).children(".photoBox").children(".photo");
			var src = ps_fixpathFromSize(srcImg.attr("src"), size);
			var imgBox = wnditm_div_add({klass:"viewerItem", rect:rect}, viewerItems)
				.attr("photo_id", $(this).attr("photo_id"));
			rect.move(0, rect.left+rect.width);
			var img = wnditm_img_add({klass:"viewerImg", src:src}, imgBox)
			.attr({h:srcImg.attr("h"), w:srcImg.attr("w")});
			});
		wnditm_viewer_resetIdx(wnd)
		.attr("boxW", rect.width)
		.attr("total", boxes.length);
		wnditm_viewer_addCurtains(wnd);
		wnditm_viewer_set(wnd);
		}
	else viewer_init_noPar(wnd);
	}
//------------------------------------------------------------
function wnditm_viewer_resize(wnd)
	{
	var viewer = wnd.find(".viewer");
	if (viewer)
		{
		var viewerItems = viewer.children();
		if (viewerItems)
			{
			var wasVis = viewer_getmap(wnd);
			viewer_hideZoomMap(wnd);
			var ht = viewer.height();
			var size = ps_getSizeFromHt(ht);
			var rect = ps_getRect(size);
			if (rect.width == 0) {rect.height = ht;rect.width =((640*ht)/480)+_viewerBoxPadding;}

			viewerItems.children().each(function(idx)
				{
				var imgBox = $(this).removeAttr("zoom");
				rect.setElem(imgBox);
				var img = imgBox.children(".viewerImg");
				if (img.length>0)
					{
					img.attr("src", ps_fixpathFromSize(img.attr("src"), size));
					viewer_centerImg(img);
					rect.move(0, rect.left+rect.width);
					}
				});
			wnd.attr("boxW", rect.width);
			wnditm_viewer_set(wnd, wnditm_viewer_getIdx(wnd));
			wnditm_viewer_addCurtains(wnd);
			}
		}
	}
//------------------------------------------------------------
function wnditm_viewer_idxToPhotoID(wnd, idx)
	{
	return wnditm_viewer_getbox(wnd, idx).attr("photo_id");
	}
//------------------------------------------------------------
function wnditm_viewer_set(wnd, slideIdx)
	{
	var oldIdx = wnd.attr("slideIdx");
	if (slideIdx==undefined) slideIdx = oldIdx;
	
	var oldBox = wnditm_viewer_getbox(wnd);
	photo_blog_add_comment(wnd);
	var vWidth = wnd.find(".viewer").width();
	var boxW = wnd.attr("boxW");
	var hoffset = (vWidth-boxW)/2;
	var itms = wnd.find(".viewerItems");
	
	wnd.attr("photo_id", wnditm_viewer_idxToPhotoID(wnd, slideIdx));
//	if (_SESS.slideSpeed == undefined) _SESS.slideSpeed = 400;
//	itms.stop().animate({left:-(boxW*slideIdx)+hoffset}, _SESS.slideSpeed, "linear");
	itms.css({left:-(boxW*slideIdx)+hoffset});
	if (oldBox) 
		{
		oldBox
			.removeClass("vsel")
			.removeAttr("popup")
			.unbind("contextmenu")
			.unbind("dblclick");
		oldBox.children().draggable("destroy");
		}
	var newBox = wnditm_viewer_getbox(wnd, slideIdx);
	newBox.addClass("vsel")
	.attr("popup", _viewImgPopupID)
	.bind("contextmenu", menu_contextPopup)
	.bind("dblclick", viewer_photo_dblclick);
	wnditm_viewer_setIdx(wnd, slideIdx)
	photo_blog_redraw(wnd);

	newBox.children(".viewerImg").draggable({start:viewer_dragStart,drag:viewer_drag,stop:viewer_dragStop});
	var prev = wnd.attr("prev");
	if (prev)
		{
		var parElem = gWndLinks.getremove(prev);
		if (parElem)
			{
			var newPar = parElem.wnd().find(".photos").children(":eq("+slideIdx+")");
			if (newPar.length>0) wnd.attr("prev", gWndLinks.add(newPar));
			gParElem = newPar;
			}
		}

	wnd.trigger("setslide", wnd);
	}
//------------------------------------------
function wnditm_viewer_setPhotoID(wnd, photo_id)
	{
	wnd.find(".viewerItems").children().each(function(idx)
		{
		if ($(this).attr("photo_id")==photo_id)
			{
			wnditm_viewer_set(wnd, idx);
			return false;
			}
		return true;
		});
	}

//------------------------------------------
function wnditm_viewerPar_photoIDToIdx(wnd, photo_id)
	{
	var photos = wnd.find(".photos");
	var foundIdx = 0;
	
	if (photos.length>0)
		{
		photos.children().each(function(idx){
			if ($(this).attr("photo_id") == photo_id) {
				foundIdx = idx;
				return false;
			}
		});
		return foundIdx;
		}
	return -1;
	}
//------------------------------------------
function wnditm_viewer_photoIDToIdx(wnd, photo_id)
	{
	var theIdx = -1;
	var viewer = wnd.find(".viewer");
	if (viewer)
		{
		var viewerItems = viewer.find(".viewerItems");
		if (viewerItems)
			{
			var itms = viewerItems.children();
			if (itms)
				{
				itms.each(function(idx)
					{
					if ($(this).attr("photo_id")==photo_id)
						{
						theIdx = idx;
						return false;
						}
					});
				}
			}
		}
	return theIdx;
	}

//------------------------------------------------------------
function wnditm_viewer_resetIdx(wnd)
	{
	var prev = wnd.attr("prev");
	if (prev)
		{
		var parElem = gWndLinks.get(prev);
		if (parElem)
			{
			var idx = wnditm_viewerPar_photoIDToIdx(parElem.wnd(), parElem.attr("photo_id"));
			if (idx > -1) wnditm_viewer_setIdx(wnd, idx);
			}
		}
	else
		{
		var photo_id = wnd.attr("photo_id");
		if (photo_id)
			{
			var idx = wnditm_viewer_photoIDToIdx(wnd, photo_id);
			if (idx > -1) wnditm_viewer_setIdx(wnd, idx);
			}
		}
	return wnd;
	}

//------------------------------------------------------------
function wnditm_viewer_getIdx(wnd)
	{
	return wnd.attr("slideIdx");
	}
//------------------------------------------------------------
function wnditm_viewer_setIdx(wnd, idx)
	{
	return wnd.attr("slideIdx", idx);
	}
//------------------------------------------------------------
function wnditm_viewer_getbox(wnd, slideIdx)
	{
	if (slideIdx == undefined) slideIdx = wnditm_viewer_getIdx(wnd);
	if (slideIdx != undefined) return wnd.find(".viewerItems").children("div:eq("+slideIdx+")");
	}

//------------------------------------------------------------
function wnditm_viewer_get(wnd, slideIdx)
	{
	return wnditm_viewer_getbox(wnd, slideIdx).children();
	}

//------------------------------------------------------------
function wnditm_viewer_first(wnd)
	{
	wnditm_viewer_set(wnd, 0);
	}
//------------------------------------------------------------
function wnditm_viewer_next(wnd)
	{
	var idx = parseInt(wnd.attr("slideIdx"));
	if (idx < (parseInt(wnd.attr("total"))-1)) wnditm_viewer_set(wnd, idx+1);
	}
//------------------------------------------------------------
function wnditm_viewer_prev(wnd)
	{
	var idx = parseInt(wnd.attr("slideIdx"));
	if (idx > 0) wnditm_viewer_set(wnd, idx-1);
	}
//------------------------------------------------------------
function wnditm_viewer_last(wnd)
	{
	wnditm_viewer_set(wnd, parseInt(wnd.attr("total"))-1);
	}

//------------------------------------------------------------
function wnditm_viewer_addCurtains(wnd)
	{
	var leftCurt, rtCurt;
	var viewer = wnd.find(".viewer");
	var curtains = viewer.children(".curtain");
	if (curtains.length>0)
		{
		leftCurt = $(curtains[0]);
		rtCurt = $(curtains[1]);
		}
	else
		{
		if (_SESS.curtOpac==undefined) _SESS.curtOpac = .6;
		leftCurt = wnditm_div_add({klass:"curtain", popupMe:curtainPopup}, viewer)
			.css({zIndex:32760, opacity:_SESS.curtOpac, left:0});	
		rtCurt = wnditm_div_add({klass:"curtain", popupMe:curtainPopup}, viewer)
			.css({zIndex:32760, opacity:_SESS.curtOpac, right:0});
		}
	var width = (viewer.width()-parseInt(wnd.attr("boxW")))/2;
	leftCurt.css({width:width});
	rtCurt.css({width:width});
	}
//----------------------------------------------------------------------
function wnditm_viewer_getPhotoID(wnd)
	{
	var photo_id = wnd.attr("photo_id");
	if (!photo_id)
		{
		if (wnd.attr("prev"))
			{
			var parElem= gWndLinks.get(wnd.attr("prev"));
			if (parElem) 
				{
				var idx = wnd.attr("slideIdx");
				parElem = parElem.parent().children("div:eq("+idx+")");
				photo_id = parElem.attr("photo_id");
				}
			}
		}
	return photo_id;
	}

//----------------------------------------------------------------------
function viewer_centerImg(img)
	{
	if (img.length>0)
		{
		var imgRect = new Rect(0, 0, img.attr("h"), img.attr("w"));
		var boxRect = new Rect().getElem(img.parent()).move(0,0);
		imgRect.centerInRect(boxRect);
		imgRect.setElem(img);
		delete imgRect, boxRect;
		}
	}
//----------------------------------------------------------------------
function setCurtainOpacity()
	{
	gMenuPopupTarget.parent().children(".curtain").css({
		opacity:$(this).attr("data")
	});
	}
//----------------------------------------------------------------------
function setAsDesktop()
	{
	var src = ps_origpath(gMenuPopupTarget.children().attr("src"));
	wnd_desktop_setBkgndImg(src, true);
	}
//----------------------------------------------------------------------
function viewer_dragStart()
	{
	}
//----------------------------------------------------------------------
function viewer_drag(event, ui)
	{
	var img = $(this);
	var r = new Rect().getElem(img);
	var box = new Rect().getElem(img.parent());
	var topLim = box.height-r.height;
	var leftLim = box.width-r.width;
	if (ui.position.top < topLim) ui.position.top = topLim;
	else if (ui.position.top > 0) ui.position.top = 0;
	if (ui.position.left < leftLim) ui.position.left = leftLim;
	else if (ui.position.left > 0) ui.position.left = 0;
	delete r, box;
	viewer_updateZoomMap(img.wnd());
	}
//----------------------------------------------------------------------
function viewer_dragStop()
	{
	}
//----------------------------------------------------------------------
function viewer_getmap(w)
	{
	var map = w.find(".zoomMap");
	if (map.length>0) return map;
	}
//----------------------------------------------------------------------
function viewer_getmaprect(w)
	{
	var map = viewer_getmap(w);
	if (map)
		{
		return map.parent().children(".zoomMapRect");
		}
	}
	
//----------------------------------------------------------------------
function mapRect_drag(event, ui)
	{
	var maprct = $(this);
	var w = maprct.wnd();
	var box = wnditm_viewer_getbox(w);
	if (box)
		{
		var img = box.children(".viewerImg");
		var map = viewer_getmap(w);
		var mapInRect = new Rect().getElem(maprct);
		var boxRect = new Rect().getElem(box).move(0,0);
		var mapRect = new Rect(0,0,48,64)
		.mapRect(mapInRect, boxRect)
		.setElem(img);
		delete imgRect, mapRect, boxRect;
		}
	}
//----------------------------------------------------------------------
function viewer_showZoomMap(w)
	{
	var box = wnditm_viewer_getbox(w);
	if (box)
		{
		box.children(".zoomMap").remove();
		box.children(".zoomMapRect").remove();
		var img = box.children(".viewerImg");
		var src = img.attr("src");
		src = ps_fixpathFromSize(src, {h:48,w:64});
		var map = wnditm_img_add({klass:"zoomMap", src:src}, box);	
		var imgRect = new Rect().getElem(img);
		var mapRect = new Rect(0,0,48,64);
		var boxRect = new Rect().getElem(box)
		.move(0,0)
		.mapRect(imgRect, mapRect);
	
		wnditm_div_add({klass:"zoomMapRect", rect:boxRect}, box)
		.draggable({containment:map, drag:mapRect_drag});
		delete imgRect, mapRect, boxRect;
		}
	}
//----------------------------------------------------------------------
function viewer_updateZoomMap(w, iRect)
	{
	var box = wnditm_viewer_getbox(w);
	if (box)
		{
		var img = box.children(".viewerImg");
		var map = viewer_getmap(w);
		var maprct = viewer_getmaprect(w);
		if (iRect) var imgRect = iRect;
		else var imgRect = new Rect().getElem(img);
		var mapRect = new Rect(0,0,48,64);
		var boxRect = new Rect().getElem(box)
		.move(0,0)
		.mapRect(imgRect, mapRect)
		.setElem(maprct);
		delete imgRect, mapRect, boxRect;
		}
	}
//----------------------------------------------------------------------
function viewer_hideZoomMap(w)
	{
	var map = viewer_getmap(w);
	var mapr = viewer_getmaprect(w);
	if (mapr) mapr.remove(); 
	if (map) map.remove();
	}

//----------------------------------------------------------------------
function wnditm_viewer_getData(w, data)
	{
	data.zoom = 0;
	data.zoom_x=data.zoom_y=0;
	var box = wnditm_viewer_getbox(w);
	if (box)
		{
		if (box.attr("zoom"))
			{
			var r = new Rect().getElem(box);
			var cent = r.getCenterOffset();
			r.getElem(box.children(".viewerImg"));
			
			data.zoom = 1;
			data.zoom_x = cent.left - r.left;
			data.zoom_y = cent.top - r.top;
			delete r;
			}
		}
	}
//----------------------------------------------------------------------
function viewer_photo_dblclick(e)
	{
	var box = $(this);
	var zoom = box.attrZero("zoom");
	if (zoom=="max")
		{
		wnditm_viewer_zoomOff(box.wnd());
		}
	else
		{
		box.attr("zoom","max");
		var img = box.children(".viewerImg");
		var imgRect = new Rect().getElem(img);
		var imgOff = img.offset();
		var pt = {top: e.pageY - imgOff.top, left: e.pageX - imgOff.left};
		var oldT = pt.top;
		var oldL = pt.left;
		var newRect = new Rect(0,0,img.attr("h"),img.attr("w"));
		imgRect.mapPt(pt, newRect);
		newRect.move(oldT-pt.top, oldL-pt.left);
		newRect.animElem({elem:img});
		var wnd = box.wnd();
		image_resetPhotoSrc(img);
		viewer_showZoomMap(wnd);
		viewer_updateZoomMap(wnd, newRect);
		delete imgRect, newRect, imgOff;
		}
	}

//----------------------------------------------------------------------
function wnditm_viewer_zoomOff(w, o)
	{
	var box = wnditm_viewer_getbox(w);
	var zoom = box.attrZero("zoom");
	if (zoom != 0)
		{
		var img = box.children(".viewerImg");
		if (!o) var o = {};
		o.elem = img;
		box.removeAttr("zoom");
		var boxRect = new Rect().getElem(box);
		var imgRect = new Rect(0,0,img.attr("h"),img.attr("w"))
		.centerInRect(boxRect).animElem(o);
		image_resetPhotoSrc(img);
		viewer_hideZoomMap(box.wnd());
		}
	}
//----------------------------------------------------------------------
function wnditm_viewer_zoom(w,x,y)
	{
	var box = wnditm_viewer_getbox(w);
	var zoom = box.attrZero("zoom");
/*
 	if (zoom != 0)
		{
		var o = {arg: {box: box, x:x, y:y},func:wnditm_viewer_finishZoom};
		wnditm_viewer_zoomOff(w, o);	
		}
	else
		{
*/
		box.attr("zoom","max");
		var img = box.children(".viewerImg");
		var boxRect = new Rect().getElem(box);
		var cent = boxRect.getCenterOffset();
		var imgRect = new Rect(0,0,img.attr("h"),img.attr("w"))
		.move(cent.top-y, cent.left-x)
		.animElem({elem:img});
		viewer_showZoomMap(box.wnd());
		image_resetPhotoSrc(img);
//		}
	}

//----------------------------------------------------------------------
function wnditm_viewer_finishZoom(o)
	{
	var box = o.box;
	box.attr("zoom","max");
	var img = box.children(".viewerImg");
	var boxRect = new Rect().getElem(box);
	var cent = boxRect.getCenterOffset();
	var imgRect = new Rect(0,0,img.attr("h"),img.attr("w"))
	.move(cent.top-o.y, cent.left-o.x)
	.animElem({elem:img});
	viewer_showZoomMap(box.wnd());
	image_resetPhotoSrc(img);
	}
//----------------------------------------------------------------------
function wnditm_viewer_refresh(w)
	{
	wnd_kill(w);
	}

//----------------------------------------------------------------------
function viewer_init_noPar(w)
	{
	var more = w.wndMore();
	if (more)
		{
		w.attr({delayComplete:true, 
		folder_id:more.folder_id,
		photo_id:more.photo_id,
		blog_id:more.blog_id});
		
		var data = new Object();
		data.command = "get_album";
		data.user_id = more.user_id;
		data.folder_id = more.folder_id;
		data.photo_id = more.photo_id;
		data.blog_id = more.blog_id;
		data.wnd = _viewerList.add(w);
		var dataString = $.toJSON(data);
		delete data;
		$.post("photo.php", {data: dataString}, done_viewer_init_noPar);
		}
	}
//----------------------------------------------------------------------
function done_viewer_init_noPar(res)
	{
	var obj = $.evalJSON(res);
	if (!obj.recs) return;
	var recs = $.evalJSON(obj.recs);
	var wnd = _viewerList.getremove(obj.wnd);
	wnd.attr("nopar", true);
	wnd.attr("photo_id", obj.photo_id);
	if (recs) 
		{
		var viewer = wnd.find(".viewer");
		var viewerItems = wnd.find(".viewerItems");
		var ht = viewer.height();
		var size = ps_getSizeFromHt(ht);
		var rect = ps_getRect(size);
		if (rect.width == 0) 
			{
			rect.height = ht;
			rect.width = (640 * ht) / 480;
			}
		total = recs.length;
		for (var idx = 0; idx < total; ++idx) 
			{
			var rec = recs[idx];
			var src = ps_fixpathFromSize(rec["src"], size);
			var imgBox = wnditm_div_add({klass:"viewerItem", rect:rect}, viewerItems)
				.attr("photo_id", rec["photo_id"]);
			rect.move(0, rect.left+rect.width);
			var img = wnditm_img_add({klass:"viewerImg", src:src}, imgBox)
			.attr({h:rec["imgH"], w:rec["imgW"]});
			}
		var idx = wnditm_viewer_photoIDToIdx(wnd, obj.photo_id);
		if (idx > -1) wnditm_viewer_setIdx(wnd, idx);
		wnditm_viewer_resetIdx(wnd)
		.attr("boxW", rect.width)
		.attr("total", total);
		wnditm_viewer_addCurtains(wnd);
	//	wnditm_viewer_set(wnd);
		}
	wnd_complete(wnd);
	wnd.wndtitle(obj.foldername);
	delete obj;
	}