var MODE_NONE = -1;
var MODE_LIST = 0;
var MODE_THUMBS = 1;
var OVERLAY_NONE = -1;
var OVERLAY_PARTS = 0;
var OVERLAY_IMG = 1;

var meta = []; /* main metadata file */
var currentMode = MODE_NONE; /* what is actually drawn */
var currentOverlay = OVERLAY_NONE; /* what is actually drawn */
var hash = false; /* currently used hash */
var hashClose = "_"; /* hash to use when window closes */

var Settings = { /* user-settable */
	monthWidth:160,
	overlayOpacity:0.7,
	thumbnailSize:150,
	bottomSpace:15,
	root:"./",
	mapEps:0.05
}

var List = { /* fetch, parse and draw list of galleries */
	drawn:false,
	TL: {
		obj:false,
		scrollTo:function(event) {
			var tl = List.TL.obj;
			var dims = OAT.Dom.getWH(tl.port);
			var left = tl.position;
			var right = left + dims[0];
			var pos = event.x1;
			
			if (pos > left && pos+30 < right) { return; }
			
			var limit = tl.slider.options.maxValue;
			if (pos < 0) { pos = 0; }
			if (pos > limit) { pos = limit; }
			tl.scrollTo(pos);
			tl.slider.slideTo(pos);
		},
		options: {
			formatter:false,
			resize:false,
			timeStepOverride:"_months",
			lineHeight:18,
			noIntervals:true,
			timeTitleOverride:function(date) {
				return date.format("j.n.Y");
			},
			timeLabelOverride:function(date) {
				var result = "";
				var m = date.getMonth();
				if (!m) { result += date.getFullYear()+"<br/>"; }
				result += OATG_LANG['MONTHS'][m];
				return result;
			}
		},
		attach:function(elm,gallery) {
			OAT.Dom.attach(elm,"mouseover",function() {
				for (var i=0;i<gallery.parts.length;i++) {
					var part = gallery.parts[i];
					if (part.marker) { part.marker.setImage("themes/marker_green.png"); }
				}
			});
			OAT.Dom.attach(elm,"mouseout",function() { 
				for (var i=0;i<gallery.parts.length;i++) {
					var part = gallery.parts[i];
					if (part.marker) { part.marker.setImage("http://www.google.com/intl/en_ALL/mapfiles/marker.png"); }
				}
			});
		},
		draw:function() {
			OAT.TlScale.defWidth = Settings.monthWidth;
			var tl = new OAT.Timeline("timeline",List.TL.options);
			List.TL.obj = tl;
			tl.addBand(0,false,false);

			for (var i=0;i<meta.length;i++) {
				var g = meta[i];
				if (g.obsolete) { continue; }
				var d = OAT.Dom.create("div",{},"timeline_item");
				var ball = OAT.Dom.create("div",{},"timeline_ball");
				var a = OAT.Dom.create("a");
				a.href = "#"+g.shortcut;
				a.innerHTML = g.title;
				OAT.Dom.append([d, ball, a]);
				g.event = tl.addEvent(0,g.start,g.end,d,"#ddd");
				List.TL.attach(a,g);
			}
			
			var bl = OAT.Dom.create("span");
			var last = tl.addEvent(0,new Date(),false,bl,"");
			tl.draw();
			List.TL.scrollTo(last);
		}
	}, /* List.TL */
	Map: {
		obj:false,
		optimalZoom:function() {
			List.Map.obj.setZoom(List.Map.obj.getBoundsZoomLevel(List.Map.bounds));
			List.Map.obj.setCenter(List.Map.bounds.getCenter());
		},
		attach:function(marker,list) { /* list == list of parts for this marker */
			var ref = function() {
				var table = OAT.Dom.create("table");
				var tbody = OAT.Dom.create("tbody");
				var td_img = OAT.Dom.create("td",{verticalAlign:"middle",textAlign:"center",width:Settings.thumbnailSize+"px",height:Settings.thumbnailSize+"px"});
				td_img.rowSpan = list.length;
				var img = OAT.Dom.create("img",{verticalAlign:"middle"});
				
				function overRef(part) {
					return function() {
						var g = part.gallery;
						List.TL.scrollTo(g.event);
						img.src = Settings.root+"data/"+part.dir+"/"+Settings._thumbs+"/"+part.promo+".jpg";
						for (var i=0;i<meta.length;i++) { 
							var gal = meta[i];
							if (!gal.event) { continue; }
							OAT.Dom.removeClass(gal.event.elm,"event_active"); 
						}
						OAT.Dom.addClass(g.event.elm,"event_active");
					}
				}
				overRef(list[list.length-1])();
				
				for (var i=list.length-1;i>=0;i--) {
					var tr = OAT.Dom.create("tr");
					var part = list[i];
					var g = part.gallery;
					
					var item = OAT.Dom.create("td");
					var a = OAT.Dom.create("a");
					var start = g.start.split(":");
					a.innerHTML = part.fullTitle+" ("+start[0]+")";
					a.href = "#"+part.shortcut;
					OAT.Dom.append([item,a],[tr,item],[tbody,tr]);
					OAT.Dom.attach(a,"mouseover",overRef(part));
					if (i==list.length-1) { tr.appendChild(td_img); }
				}
				OAT.Dom.append([td_img,img],[table,tbody]);
				marker.openInfoWindow(table);
			}
			GEvent.addListener(marker,"click",ref);
		},
		draw:function() {
			Misc.sync();
			var m = new GMap2($('map'));
			List.Map.obj = m;
			m.addControl(new GSmallMapControl());
			m.addControl(new GMapTypeControl());
			m.setCenter(new GLatLng(0,0),2);
			var bounds = new GLatLngBounds();
			List.Map.bounds = bounds;
			
			var groups = [];
			/* analyze positions */
			for (var i=0;i<meta.length;i++) {
				var g = meta[i];
				if (g.obsolete) { continue; }
				for (var j=0;j<g.parts.length;j++) {
					var p = g.parts[j];
					if (!p.promo) { continue; }
					var lat = p.lat;
					var lon = p.lon;
					var index = -1;
					for (var k=0;k<groups.length;k++) {
						/* find group for this marker */
						var grp = groups[k][0]; /* group leader*/
						var dx = lat - grp.lat;
						var dy = lon - grp.lon;
						var dist = Math.sqrt(dx*dx+dy*dy);
						if (dist <= Settings.mapEps) { index = k; }
					}
					if (index != -1) {
						groups[index].push(p);
					} else {
						groups.push([p]);
					}
				} /* for all parts */
			} /* for all galleries */
			/* draw pins */
			for (var i=0;i<groups.length;i++) {
				var grp = groups[i];
				var point = new GLatLng(grp[0].lat,grp[0].lon);
				bounds.extend(point);
				var marker = new GMarker(point);
				m.addOverlay(marker);
				List.Map.attach(marker,grp);
				for (var j=0;j<grp.length;j++) { grp[j].marker = marker; }
			} /* for all groups */
			if (Settings._position.length > 1) {
				var lat = parseFloat(Settings._position[0]);
				var lon = parseFloat(Settings._position[1]);
				var zoom = parseFloat(Settings._position[2]);
				m.setCenter(new GLatLng(lat,lon),zoom);
			} else { List.Map.optimalZoom(); }
		} /* List.Map.draw() */
	}, /* List.Map */
	request:function() {
		OAT.AJAX.GET(Settings.root+"data/meta.xml","",List.receive,{type:OAT.AJAX.TYPE_XML});
	},
	receive:function(xmlDoc) {
		Data.parse(xmlDoc);
		OAT.Dom.hide("throbber");
		Director.start(); /* start periodic listener */
		if (window.customInit) { window.customInit(); }
	},
	draw:function() {
		OAT.Dom.show("list");
		OAT.Dom.hide("thumbs");
		$("title").removeAttribute("href");
		document.title = Settings._title;
		currentMode = MODE_LIST;
		if (!List.drawn) {
			if (Settings._disable.find("timeline") == -1) { List.TL.draw(); }
			if (Settings._disable.find("map") == -1 && GBrowserIsCompatible()) { List.Map.draw(); }
			List.drawn = true;
		} else {
			Misc.sync();
			if (List.Map.obj) { List.Map.obj.checkResize(); }
		}
	}
}

var Thumbs = { /* draw thumbnails or part selection overlay */
	drawnPart:false,
	drawThumbs:function(part,idString) {
		var t = OAT.Dom.create("table");
		var tb = OAT.Dom.create("tbody");
		var tr = OAT.Dom.create("tr");
		var counter = 0;
		for (var i=0;i<part.images.length;i++) {
			counter++;
			var image = part.images[i];
			var a = OAT.Dom.create("a");
			a.href = "#"+idString+":"+image.file;
			var img = OAT.Dom.create("img");
			var td = OAT.Dom.create("td");
			img.src = Settings.root+"data/"+part.dir+"/"+Settings._thumbs+"/"+image.file+".jpg";
			
			var label = OAT.Dom.text(image.label ? image.label : image.file);
			OAT.Dom.append([td,a],[a,img,OAT.Dom.create("br"),label],[tr,td]);
			if (counter == Settings._columns) {
				tb.appendChild(tr);
				tr = OAT.Dom.create("tr");
				counter = 0;
			}
		}
		if (counter) {
			for (var i=counter;i<Settings._columns;i++) {
				var td = OAT.Dom.create("td");
				tr.appendChild(td);
			}
			tb.appendChild(tr);
		}
		OAT.Dom.append([t,tb],["thumbs_content",t]);
	},
	draw:function(part,idString) {
		OAT.Dom.hide("list");
		OAT.Dom.show("thumbs");
		$("title").href = "#_";
		currentMode = MODE_THUMBS;
		document.title = part.fullTitle + ' - ' + Settings._title;
		if (Thumbs.drawnPart != part) {
			Thumbs.drawnPart = part;
			OAT.Dom.clear("thumbs_content");
			OAT.Dom.clear("thumbs_title");
			var t1 = part.gallery.title;
			var t2 = part.title;
			if (part.gallery.parts.length > 1) {
				/* multiple parts */
				var link = OAT.Dom.create("a");
				link.href = "#"+part.gallery.shortcut;
				link.innerHTML = (t2 ? t1 + ":" : t1);
				$("thumbs_title").appendChild(link);
				if (t2) { $("thumbs_title").appendChild(OAT.Dom.text(" "+t2)); }
			} else {
				/* simple */
				$("thumbs_title").innerHTML = t1 + (t2 ? ": "+t2 : "");
			}
			var t1 = Misc.formatDate(part.gallery.start);
			var t2 = Misc.formatDate(part.gallery.end);
			$("thumbs_date").innerHTML = "(" + t1 + (t2 != t1 ? " - "+t2 : "") + ")";
			Thumbs.drawThumbs(part,idString);
		}
		if (part.images.length) { Img.preload(part.images[0]);	} /* preload first image */
	},
	drawParts:function(gallery) {
		currentOverlay = OVERLAY_PARTS;
		var ul = $("parts_content");
		OAT.Dom.clear(ul);
		
		$("parts_title").innerHTML = gallery.title;
		$("parts_reason").innerHTML = OATG_LANG["MULTIPLE_PARTS"];
		for (var i=0;i<gallery.parts.length;i++) {
			var part = gallery.parts[i];
			var li = OAT.Dom.create("li");
			var a = OAT.Dom.create("a");
			a.innerHTML = '#'+(i+1)+' '+part.title;
			a.href = "#"+part.shortcut;
			OAT.Dom.append([ul,li],[li,a]);
		}
		
		OAT.Dimmer.show("parts_overlay",{opacity:Settings.overlayOpacity});
		OAT.Dom.center("parts_overlay",1,1);
	},
	request:function(part) {
		OAT.Dom.show("throbber");
		var ref = function(xmlDoc) {
			Data.parseP(xmlDoc,part);
			OAT.Dom.hide("throbber");
			Director.decide();
		}
		OAT.AJAX.GET(Settings.root+"ajax/?list="+part.dir+"&exif="+Settings._exif,"",ref,{type:OAT.AJAX.TYPE_XML});
	}
}

var Img = { /* single image */
	image:false,
	fake:false,
	loaded:false,
	
	resize:function() { /* fix image size & position */
		var img = $("img_content").firstChild;
		var image = Img.image;
		
		var port = OAT.Dom.getViewport();
		var dims = OAT.Dom.getWH("img_overlay");
		
		var dw = port[0] - (dims[0] + 10);
		var dh = port[1] - (dims[1] + 10);
		
		var cw = (img.width + dw) / img.width;
		var ch = (img.height + dh) / img.height;
		var c = Math.min(cw,ch);
		/* new needed dimensions */
		var w = img.width * c;
		var h = img.height * c;

		if (w >= image.width || h >= image.height) { 
			w = image.width; 
			h = image.height; 
		}
		img.width = w;
		img.height = h; 
		$("img_nav").style.width = w+"px";
		OAT.Dom.center("img_overlay",1,1);
	},
	preload:function(image) {
		var img = OAT.Dom.create("img");
		img.src = image.source;
	},
	onload:function() {
		OAT.Dom.hide("throbber_img");
		Img.loaded = true;
		var image = Img.image;
		var parent = $("img_content");
		
		var img = OAT.Dom.create("img");
		img.src = image.source;
		OAT.Dom.clear(parent);
		parent.appendChild(img);

		OAT.Dom.clear(Img.fake);
		if (currentOverlay != OVERLAY_IMG) { return; } /* do nothing if canceled */

		$("img_label").innerHTML = image.label ? image.label : image.file;
		$("img_exif").innerHTML = image.exifString;
		$("img_desc").innerHTML = image.desc;
		$("nav_desc").style.visibility = (image.desc ? "visible" : "hidden");
		
		Img.resize();
		Misc.actualizeNav();
		if (image.next) { Img.preload(image.next); } /* preload next */
		if (image.prev) { Img.preload(image.prev); } /* preload previous */
	},
	init:function() { /* prepare to appear */
		currentOverlay = OVERLAY_IMG;
		OAT.Dom.clear("img_content");
		
		$("img_label").innerHTML = "";
		OAT.Dimmer.show("img_overlay",{opacity:Settings.overlayOpacity});
		OAT.Dom.center("img_overlay",1,1);
	},
	draw:function(image) { /* go for one image */
		OAT.Dom.show("throbber_img");
		Img.image = image;
		Img.loaded = false;
		
		var fake = OAT.Dom.create("img");
		OAT.Dom.attach(fake,"load",Img.onload);
		fake.src = image.source;
		Img.fake.appendChild(fake);
	}
}

var Data = { /* parser */
	parseP:function(xmlDoc,part) { /* parse one part's images */
		part.images = [];
		var images = xmlDoc.documentElement.getElementsByTagName("image");
		for (var i=0;i<images.length;i++) {
			var image = images[i];
			var desc = image.getElementsByTagName("desc")[0];
			var o = {
				file:image.getAttribute("file"),
				label:image.getAttribute("label"),
				width:parseInt(image.getAttribute("width")),
				height:parseInt(image.getAttribute("height")),
				desc:(desc.firstChild ? desc.firstChild.nodeValue : ""),
				exif:{},
				prev:false,
				next:false,
				part:part
			}
			o.source = Settings.root+"data/"+part.dir+"/"+o.file+".jpg";
			var exifs = image.getElementsByTagName("exif");
			for (var j=0;j<exifs.length;j++) {
				var exif = exifs[j];
				var name = exif.getAttribute("name");
				var value = exif.getAttribute("value");
				o.exif[OATG_LANG["EXIF_"+name]] = value;
			}
			var arr = [];
			for (var p in o.exif) {
				arr.push("<strong>"+p+":</strong> "+o.exif[p]);
			}
			o.exifString = arr.join("<br/>");
			if (!o.exifString) { o.exifString = OATG_LANG['ERROR_NOEXIF']; }
			part.images.push(o);
		}
		for (var i=0;i<part.images.length;i++) {
			var image = part.images[i];
			if (i) { image.prev = part.images[i-1]; }
			if (i+1 < part.images.length) { image.next = part.images[i+1]; }
		}
	},
	parseG:function(node,parent) { /* parse one gallery's parts */
		var list = [];
		var ps = node.getElementsByTagName("part");
		for (var i=0;i<ps.length;i++) {
			var p = ps[i];
			var o = {
				title:p.getAttribute("title"),
				dir:p.getAttribute("directory"),
				shortcut:p.getAttribute("shortcut"),
				images:false,
				lat:false,
				lon:false,
				promo:false,
				marker:false,
				gallery:parent
			}
			if (!o.shortcut) { o.shortcut = ps.length == 1 ? parent.shortcut : parent.shortcut + "~" + i; }
			if (o.title == parent.title) { o.title = false; }
			o.fullTitle = parent.title + ( o.title ? ": "+o.title : "");
			var lat = p.getAttribute("lat");
			var lon = p.getAttribute("lon");
			var promo = p.getAttribute("map");
			
			if (!i && !lat) { lat = node.getAttribute("lat"); }
			if (!i && !lon) { lon = node.getAttribute("lon"); }
			if (!i && !promo) { promo = node.getAttribute("map"); }
			if (lat && lon && promo) {
				o.lat = parseFloat(lat);
				o.lon = parseFloat(lon);
				o.promo = promo;
			}
			
			var r = false;
			if ((r = o.promo.toString().match(/([^\/]+)\.jpg$/))) { o.promo = r[1]; } /* obsolete promo string */


			list.push(o);
		}
		return list;
	},
	parse:function(xmlDoc) { /* parse metafile */
		var pg = xmlDoc.documentElement;
		Settings._title = pg.getAttribute("title");
		Settings._exif = pg.getAttribute("exif");
		Settings._thumbs = pg.getAttribute("thumbs");
		var dis = pg.getAttribute("disable");
		Settings._disable = (dis ? dis.split(",") : []);
		var pos = pg.getAttribute("position")
		Settings._position = (pos ? pos.split(",") : []);
		var col = pg.getAttribute("columns");
		Settings._columns = (col ? parseInt(col) : 4);
		
		var gs = pg.getElementsByTagName("gallery");
		for (var i=0;i<gs.length;i++) {
			var g = gs[i];
			var o = {
				title:g.getAttribute("title"),
				start:g.getAttribute("start"),
				end:g.getAttribute("end"),
				shortcut:g.getAttribute("shortcut"),
				obsolete:g.getAttribute("obsolete") == "1",
				event:false,
				parts:[]
			}
			o.parts = Data.parseG(g,o);
			meta.push(o);
		} /* for all galleries */
	}, /* Data.parse(); */
	findGP:function(arr) { /* find gallery:part:image triple for given hash array */
		/* 1. there is no such gallery/shortcut -> [false,false,false] */
		/* 2. there is such gallery with 1 child, or there is a gallery with 1 such child -> [gallery,part,img/false] */
		/* 3. there is such gallery but has multiple children -> [gallery,false,false] */
		var s = arr[0];
		var g_ = false;
		var p_ = false;
		var i_ = false;
		for (var i=0;i<meta.length;i++) {
			var gallery = meta[i];
			if (gallery.shortcut == s) { /* gallery match */
				g_ = gallery;
				if (g_.parts.length == 1) { p_ = g_.parts[0]; }
			} else for (var j=0;j<gallery.parts.length;j++) {
				var part = gallery.parts[j];
				if (s == part.shortcut || s == gallery.shortcut+"~"+j) { 
					g_ = gallery;
					p_ = part;
				} /* part match */
			} /* for all parts */
		} /* for all galleries */
		if (arr.length > 1 && p_ && p_.images) for (var i=0;i<p_.images.length;i++) {
			var img = p_.images[i];
			if (img.file == arr[1]) { i_ = img; }
		}
		return [g_,p_,i_];
	} /* Data.findGP */
}

var Misc = { /* miscellaneous */
	hideOverlay:function(doNotHash) { /* hide overlay if visible */
		currentOverlay = OVERLAY_NONE;
		OAT.Dom.hide("img_exif");
		OAT.Dom.hide("img_desc");
		OAT.Dimmer.hide();
		if (!doNotHash) { window.location.hash = hashClose; }
		Img.loaded = false;
	},
	formatDate:function(date) { /* convert date format from yyyy:mm:dd to dd.mm.yyyy */
		var r = date.match(/^([^:]+):([^:]+):([^:]+)$/);
		return r[3]+"."+r[2]+"."+r[1];
	},
	sync:function() { /* sync map/image dimensions with browser's viewport */
		if (currentMode == MODE_LIST) { 
			if (List.TL.obj) { List.TL.obj.sync(); }
			if (Settings._disable.find("map") == -1 && Settings.bottomSpace != -1) { /* sync map container only when map is not disabled */
				var port = OAT.Dom.getViewport();
				var pos = OAT.Dom.position("map_container");
				var h = port[1]-pos[1]-Settings.bottomSpace;
				$("map_container").style.height = Math.max(h,10) + "px";
			}
		}
		if (currentOverlay == OVERLAY_IMG && Img.loaded) { Img.resize(); }
	},
	prev:function() { /* switch to previous image */
		if (currentOverlay != OVERLAY_IMG || !Img.image.prev) { return; }
		var i = Img.image;
		window.location.hash = i.part.shortcut+":"+i.prev.file;
	},
	next:function() { /* switch to next image */
		if (currentOverlay != OVERLAY_IMG || !Img.image.next) { return; }
		var i = Img.image;
		window.location.hash = i.part.shortcut+":"+i.next.file;
	},
	imageClick:function(event) { /* clicked on image */
		switch (event.button) {
			case 0:
			case 1:	Misc.next(); break;
			case 2: Misc.prev(); break;
		} /* switch */
	},
	actualizeNav:function() {
		var i = Img.image;
		var common = "#"+i.part.shortcut+":";
		var prev = $("nav_prev");
		var first = $("nav_first");
		var next = $("nav_next");
		var last = $("nav_last");

		if (i.prev) {
			OAT.Dom.removeClass(prev,"inactive");
			OAT.Dom.removeClass(first,"inactive");
			prev.href = common+i.prev.file;
			first.href = common+i.part.images[0].file;
		} else {
			OAT.Dom.addClass(prev,"inactive");
			OAT.Dom.addClass(first,"inactive");
			prev.removeAttribute("href");
			first.removeAttribute("href");
		}
		if (i.next) {
			OAT.Dom.removeClass(next,"inactive");
			OAT.Dom.removeClass(last,"inactive");
			next.href = common+i.next.file;
			last.href = common+i.part.images[i.part.images.length-1].file;
		} else {
			OAT.Dom.addClass(next,"inactive");
			OAT.Dom.addClass(last,"inactive");
			next.removeAttribute("href");
			last.removeAttribute("href");
		}
	}
}

var Director = { /* takes care of correct function switching */
	delay:100,
	decide:function() {
		var h = window.location.hash;
		if (!h || h == "#" || h == "#_") {
			if (currentOverlay != OVERLAY_NONE) { Misc.hideOverlay(); } 
			hashClose = "_";
			List.draw();
			return;
		}
		h = h.substring(1).split(":");
		var results = Data.findGP(h);
		var gallery = results[0];
		var part = results[1];
		var image = results[2];
		if (gallery && part) { /* we can continue */
			if (!part.images) { /* request part metadata */
				Thumbs.request(part);
			} else if (image) { /* draw image */
				if (currentOverlay != OVERLAY_IMG) {
					Misc.hideOverlay(true);
					Img.init();
				}
				Img.draw(image);
				if (currentMode == MODE_NONE) { 
					hashClose = part.shortcut;
					Thumbs.draw(part,h[0]);
				}
			} else { /* draw thumbnails */
				Misc.hideOverlay(true);
				hashClose = part.shortcut;
				Thumbs.draw(part,h[0]);
			}
		} else { /* something is wrong */
			if (gallery) { /* multiple choice */
				if (currentOverlay == OVERLAY_IMG) { Misc.hideOverlay(); }
				if (currentMode == MODE_NONE) { List.draw(); }
				Thumbs.drawParts(gallery);
			} else { /* wrong input */
				alert(OATG_LANG['ERROR_NONEXISTENT']);
			}
		}
	}, /* Director.decide() */
	start:function() {
		hash = window.location.hash;
		Director.decide();
		Director.checker();
	},
	checker:function() {
		var h = window.location.hash;
		if (h != hash) {
			hash = h;
			Director.decide();
		}
		setTimeout(Director.checker,Director.delay);
	}
}

function init() {
	/* basic init, regardless of operation mode */
	OAT.Dom.hide("parts_overlay");
	OAT.Dom.hide("img_overlay");
	OAT.Dom.hide("img_exif");
	OAT.Dom.hide("img_desc");
	$("img_content").setAttribute("oncontextmenu","return false;");
	$("parts_overlay").style.visibility = "visible";
	$("img_overlay").style.visibility = "visible";
	if (window.GBrowserIsCompatible && !GBrowserIsCompatible()) { alert("Your browser doesn't support Google maps. You will get crippled experience."); }

	OAT.Dom.attach("parts_close","click",function() {Misc.hideOverlay(); });
	OAT.Dom.attach("img_close","click",function() {Misc.hideOverlay(); });
	OAT.Dom.attach("img_content","click",Misc.imageClick);
	OAT.Dom.attach("img_content","contextmenu",Misc.imageClick);
	OAT.Dom.attach("nav_exif","mouseover",function(){OAT.Dom.show("img_exif");});
	OAT.Dom.attach("nav_exif","mouseout",function(){OAT.Dom.hide("img_exif");});
	OAT.Dom.attach("nav_desc","mouseover",function(){OAT.Dom.show("img_desc");});
	OAT.Dom.attach("nav_desc","mouseout",function(){OAT.Dom.hide("img_desc");});
	OAT.Dom.attach(window,"resize",Misc.sync);
	OAT.Dom.attach(document,"keypress",function(event) {
		if (event.keyCode == 27) { Misc.hideOverlay(); }
		if (event.keyCode == 37 || event.keyCode == 38) { Misc.prev(); }
		if (event.keyCode == 39 || event.keyCode == 40) { Misc.next(); }
	});
	
	$("nav_first").title = OATG_LANG['NAV_FIRST'];
	$("nav_prev").title = OATG_LANG['NAV_PREV'];
	$("nav_next").title = OATG_LANG['NAV_NEXT'];
	$("nav_last").title = OATG_LANG['NAV_LAST'];
	$("nav_exif").title = OATG_LANG['NAV_EXIF'];
	
	if (window._Settings) {
		for (var p in window._Settings) { Settings[p] = window._Settings[p]; }
	}
	
	Img.fake = OAT.Dom.create("div",{position:"absolute",overflow:"hidden",left:"-1000px",top:"-1000px",width:"1px",height:"1px"});
	document.body.appendChild(Img.fake);
	List.request(); /* we cannot do anything without meta.xml */
}

