wb = function()
{
	var PAGE_PAD_TOP = 10;
	var PAGE_PAD_LEFT = 10;

	var loaded = false;
	var el_wrap = null;
	var el_wb = null;
	var el_mask = null;
	var el_main_menu = null;
	var el_pic_menu = null;
	var el_pic_loading = null;
	var el_full_pic = null;
	var pages = [];
	var pages_hash = {};
	var drag_happened = false;
	var in_move = false;
	var in_action = false;
	var start_x = 0;
	var start_y = 0;
	var off_top = 0;
	var off_left = 0;
	var bk_off_top = 0;
	var bk_off_left = 0;
	var scroll_top = 0;
	var scroll_left = 0;
	var scroll_page_act = false;
	var scroll_dist = 0;
	var scroll_interval = 0;
	var scroll_dist_add = 0;
	var scroll_page_id = 0;
	var scroll_arr = [];
	var scroll_start = 0;
	var scroll_pos = 0;

	function get_page_id(el)
	{
		return el.id.substr('page_'.length);
	}

	function repos()
	{
		if (off_top > 0) off_top = 0;
		if (off_left > 0) off_left = 0;

		var max_hgt = el_wrap.offsetHeight - el_wb.offsetHeight;
		if (off_top < max_hgt) off_top = max_hgt;

		var max_wdt = el_wrap.offsetWidth - el_wb.offsetWidth;
		if (off_left < max_wdt) off_left = max_wdt;

		el_wb.style.top = Math.round(off_top) + 'px';
		el_wb.style.left = Math.round(off_left) + 'px';
	}

	function activate_page(id)
	{
		var max = pages[0].zIndex;

		for (var i = 1; i < pages.length; i++) {
			if (pages[i].zIndex > max) {
				max = pages[i].zIndex;
			}
		}

		pages_hash[id].zIndex = max + 1;
		pages.sort(function(a,b){ return (a.zIndex - b.zIndex) });

		for (var i = 0; i < pages.length; i++)
		{
			pages[i].zIndex = i;
			pages[i].el.style.zIndex = 10 + i;
		}
	}

	function activate(ev)
	{
		if (!ev) ev = event;
		S.block_event(ev);

		if (!loaded) return;

		if (drag_happened)
		{
			drag_happened = false;
			return;
		}

		do_scroll_to(get_page_id(this));
	}

	function prep_move(ev)
	{
		if (!ev) ev = event;
		S.block_event(ev);

		if (!loaded || in_action) return;

		el_wrap.className = 'move';

		start_x = ev.clientX;
		start_y = ev.clientY;
		bk_off_top = off_top;
		bk_off_left = off_left;

		in_move = true;
		drag_happened = false;
	}

	function on_mouse_move(ev)
	{
		if (!ev) ev = event;
		S.block_event(ev);

		if (!loaded || !in_move) return;

		off_top = bk_off_top + ev.clientY - start_y;
		off_left = bk_off_left + ev.clientX - start_x;

		repos();
	}

	function on_mouse_up(ev)
	{
		if (!ev) ev = event;
		S.block_event(ev);

		if (!loaded || !in_move) return;

		el_wrap.className = '';

		var dist = Math.sqrt((ev.clientY-start_y)*(ev.clientY-start_y) + (ev.clientX-start_x)*(ev.clientX-start_x));
		drag_happened = (dist > 2);

		off_top = bk_off_top + ev.clientY - start_y;
		off_left = bk_off_left + ev.clientX - start_x;

		repos();
		in_move = false;
	}

	function calc_scroll(id)
	{
		page = pages_hash[id];

		var ptop = page.top + PAGE_PAD_TOP;
		var pleft = page.left + PAGE_PAD_LEFT;
		var pheight = page.height - PAGE_PAD_TOP*2;
		var pwidth = page.width - PAGE_PAD_LEFT*2;

		scroll_top = Math.round((el_wrap.offsetHeight - pheight) / 2) - ptop;
		scroll_left = Math.round((el_wrap.offsetWidth - pwidth) / 2) - pleft;

		if (scroll_top < -ptop) scroll_top = -ptop;
		if (scroll_left < -pleft) scroll_left = -pleft;
	}

	function scroll_instant(id)
	{
		activate_page(id);
		calc_scroll(id);

		off_top = scroll_top;
		off_left = scroll_left;

		repos();
	}

	function on_resize()
	{
		repos();
	}

	function on_mouse_wheel(ev)
	{
		if (!ev) ev = event;
		S.block_event(ev);

		if (!loaded || in_move || in_action) return;

		var delta = 0;

		if (ev.wheelDelta)
		{
			delta = ev.wheelDelta.sgn();
			if (ev.opera) delta = -delta;
		}
		else if (ev.detail)
		{
			delta = -ev.detail.sgn();
		}

		if (delta != 0)
		{
			delta *= 32;

			if (ev.axis && ev.axis==1) off_left += delta;
			else off_top += delta;

			repos();
		}
	}

	function on_load()
	{
		S.get('loading').style.display = 'none';

		el_wrap = S.get('wrapper');
		el_wrap.style.display = '';

		el_wb = S.get('workbench');
		el_wb.onmousedown = prep_move;

		el_mask = S.get('mask');
		el_mask.onmousedown = prep_move;

		el_main_menu = S.get('main-menu');
		el_pic_menu = S.get('pic-menu');
		el_pic_loading = S.get('pic-loading');

		for (var i = 0; i < el_wb.childNodes.length; i++)
		{
			var el = el_wb.childNodes[i];
			if (typeof(el.id) == $undef) continue;
			if (el.id.indexOf('page_') != 0) continue;

			var id = get_page_id(el);
			var bg = el.getElementsByTagName('DIV')[0];

			var page = {
				id: id,
				el: el,
				top: el.offsetTop,
				left: el.offsetLeft,
				width: bg.offsetWidth,
				height: bg.offsetHeight,
				zIndex: 0
			};

			pages.push(page);
			pages_hash[id] = page;

			el.onclick = activate;
			el.onmousedown = prep_move;
		}

		document.onmousemove = on_mouse_move;
		document.onmouseup = on_mouse_up;

		if (window.addEventListener) window.addEventListener('DOMMouseScroll', on_mouse_wheel, false);
		window.onmousewheel = document.onmousewheel = on_mouse_wheel;

		el_wb.style.top = '0px';
		el_wb.style.left = '0px';
		activate_page(1);
		scroll_instant(1);

		S.add_handler(window, 'resize', on_resize);
		loaded = true;
	}

	function scroll_it()
	{
		var pos = Math.floor(((new Date()).valueOf() - scroll_start) / 15);
		if (pos == scroll_pos) return;

		scroll_pos = pos;

		if (pos >= (scroll_arr.length - 1))
		{
			clearTimeout(scroll_interval);
			scroll_interval = 0;
			in_action = false;

			pos = scroll_arr.length - 1;
		}

		off_left = scroll_arr[pos].left;
		off_top = scroll_arr[pos].top;
		repos();

		if (scroll_arr[pos].act && !scroll_page_act)
		{
			activate_page(scroll_page_id);
			scroll_page_act = true;
		}
	}

	function calc_scroll_arr()
	{
		scroll_arr = [];
		scroll_dist = 0;

		while (scroll_dist < 1)
		{
			scroll_dist += scroll_dist_add;
			if (scroll_dist > 1) scroll_dist = 1;

			var left = bk_off_left + (scroll_left - bk_off_left) * scroll_dist;
			var top = bk_off_top + (scroll_top - bk_off_top) * scroll_dist;

			scroll_arr.push({ left:left, top:top, act:(scroll_dist > 0.5) });
			scroll_dist_add *= 1.3;
		}
	}

	function unfocus()
	{
		var el = S.get('unfocus');

		el.style.display = '';
		el.focus();
		el.style.display = 'none';
	}

	function preloader()
	{
		preload_list.push('back.jpg');
		preload_list.push('alidad.png');
		preload_list.push('ruler-hor.png');
		preload_list.push('ruler-ver.png');
		preload_list.push('corner.png');
		preload_list.push('loader.gif');
		preload_list.push('main-menu.png');
		preload_list.push('pic-menu.png');

		if (S.is_ie)
		{
			preload_list.push('hor-ie.png');
			preload_list.push('ver-ie.png');
		}
		else
		{
			preload_list.push('hor.png');
			preload_list.push('ver.png');
		}

		var imgs = [];
		var loaded = 0;

		for (var i = 0; i < preload_list.length; i++)
		{
			var img_el = S.create('IMG', null, { position:'absolute', top:'0', left:'0', visibility:'hidden' });
			imgs.push(img_el);

			img_el.onerror = function()
			{
				S.error('Error loading image "{0}"'.format(this.src));
			}

			img_el.onload = function()
			{
				loaded++;
				S.get('loading-progress').style.width = Math.round(loaded / preload_list.length * 198) + 'px';

				if (loaded >= preload_list.length)
				{
					setTimeout(function()
					{
						for (var i = 0; i < imgs.length; i++)
						{
							imgs[i].onerror = null;
							imgs[i].onload = null;
							imgs[i].style.display = 'none';
						}

						imgs = null;
						preload_list = null;
						on_load();
					}, 1);
				}
			}

			document.body.appendChild(img_el);
			img_el.src = 'img/' + preload_list[i];
		}
	}

	function hide_full_pic()
	{
		el_main_menu.style.display = '';
		el_mask.style.display = 'none';
		el_pic_menu.style.display = 'none';
		el_full_pic.style.display = 'none';
	}

	function do_scroll_to(id)
	{
		if (typeof(pages_hash[id]) == $undef) return;

		in_action = true;
		scroll_page_id = id;
		calc_scroll(id);

		bk_off_top = off_top;
		bk_off_left = off_left;
		scroll_dist_add = 0.03;
		calc_scroll_arr();

		scroll_pos = -1;
		scroll_page_act = false;
		scroll_start = (new Date()).valueOf();

		setTimeout(unfocus, 1);
		scroll_interval = setInterval(scroll_it, 15);
	}

	return {
		init: function()
		{
			S.add_handler(window, 'load', preloader);
		},

		scroll_to: function(ev, id, ignore_drag)
		{
			if (!ev) ev = event;
			S.block_event(ev);

			if (in_action) return;

			if (drag_happened)
			{
				drag_happened = false;
				if (typeof(ignore_drag)==$undef || !ignore_drag) return;
			}

			do_scroll_to(id);
		},

		show_pic: function(ev, name)
		{
			if (!ev) ev = event;
			S.block_event(ev);

			if (drag_happened)
			{
				drag_happened = false;
				return;
			}

			el_main_menu.style.display = 'none';
			el_mask.style.display = '';
			el_pic_loading.style.display = '';

			if (el_full_pic == null)
			{
				el_full_pic = S.create('IMG', { className:'full-pic' });
				el_wb.appendChild(el_full_pic);

				el_full_pic.onload = function()
				{
					el_full_pic.style.display = '';
					el_pic_loading.style.display = 'none';
					el_pic_menu.style.display = '';

					var top = Math.round((el_wrap.offsetHeight - el_full_pic.offsetHeight) / 2) - el_wb.offsetTop;
					var left = Math.round((el_wrap.offsetWidth - el_full_pic.offsetWidth) / 2) - el_wb.offsetLeft;

					if (top < 5 - el_wb.offsetTop) top = 5 - el_wb.offsetTop;
					if (left < 5 - el_wb.offsetLeft) left = 5 - el_wb.offsetLeft;

					if (top < 10) top = 10;
					if (left < 10) left = 10;

					if (top + el_full_pic.offsetHeight > el_wb.offsetHeight) top = el_wb.offsetHeight - el_full_pic.offsetHeight - 10;
					if (left + el_full_pic.offsetWidth > el_wb.offsetWidth) left = el_wb.offsetWidth - el_full_pic.offsetWidth - 10;

					if (top < 0) top = 0;
					if (left < 0) left = 0;

					el_full_pic.style.top = top + 'px';
					el_full_pic.style.left = left + 'px';
				}

				el_full_pic.onerror = function()
				{
					S.error('Error loading image "{0}"'.format(this.src));
				}

				el_full_pic.onclick = function(ev)
				{
					if (!ev) ev = event;
					S.block_event(ev);

					if (drag_happened)
					{
						drag_happened = false;
						return;
					}

					hide_full_pic();
				}
			}

			el_full_pic.style.display = 'none';

			if (S.is_chrome) el_full_pic.src = '';
			el_full_pic.src = 'img/full/{0}.png'.format(name);
		},

		hide_pic: function(ev)
		{
			if (!ev) ev = event;
			S.block_event(ev);

			hide_full_pic();
			setTimeout(unfocus, 1);
		},

		go_to: function(ev, url, ignore_drag)
		{
			if (!ev) ev = event;
			S.block_event(ev);

			if (in_action) return;

			if (drag_happened)
			{
				drag_happened = false;
				if (typeof(ignore_drag)==$undef || !ignore_drag) return;
			}

			if (ev.ctrlKey || ev.shiftKey) {
				window.open(url);
			} else {
				window.location.href = url;
			}
		}
	};
}();

wb.init();
