$(function() {
	Main.Init();
});

var Main = {
	_State: {raw:"",data:null},
	_Title: document.title,
	_Task: null,
	_PrevTask: null,
	_Layers: {Places:[],Boundaries:[]},
	_SelectedLayer: null,
	_MarkerTooltip: null,
	_LoadingTaskState: null,
	TaskInitActions: {},
	TaskLoadActions: {},
	TaskUnloadActions: {},
	TaskStates: {},
	PrintActions: {},
	LayerUpdateActions: [],
	TaskUpdateActions: [],
	LegendLoadActions: [],
	SettingUpdateShown: {},
	SettingUpdateActions: {"assign":[],"households":[]},
	DirectionsActions: {},
	Loaded: false,
	Header: null,
	Toolbar: null,
	Content: null,
	TaskArea: null,
	TaskButtons: null,
	Resizer: null,
	Legend: null,
	Cursors: null,
	MarkerID: null,
	DefaultTask: null,
	Hold: false,
	IsClient: false,
	Init: function() {
		if (!this.Init._init) {
			this.Init._init = true;
			Main.Header = $("#platform-header");
			Main.IsClient = Main.Header.length === 0;
			Main.Toolbar = $("#header");
			Main.Content = $("#content");
			Main.TaskArea = $("#tasks");
			Main.Resizer = $("#resizer a");
			Main.Cursors = {
				Marker:"url('" + $.resolveUrl("images/cursors/marker.png") + "') 13 37, url('" + $.resolveUrl("images/cursors/marker.cur") + "'), crosshair",
				Crosshair:"url('" + $.resolveUrl("images/cursors/crosshair.png") + "') 10 10, url('" + $.resolveUrl("images/cursors/crosshair.cur") + "'), crosshair"
			};
			if (Main.IsClient && $.browser.msie && parseInt($.browser.version)<=7) {
				alert($.resource("error_browser"));
				window.top.location = "http://windows.microsoft.com/en-US/internet-explorer/products/ie/home";
			}
			if ($.browser.mozilla && ($.browser.version.indexOf("1.9.1") === 0 || $.browser.version.indexOf("1.9.2") === 0)) {
				Main.Cursors.Marker = Main.Cursors.Marker.replace(".png') 13 37", "-32.png') 15 27");
			} else if ($.browser.opera) {
				$.each(Main.Cursors, function(i, val) {
					Main.Cursors[i] = val.replace(/.*,\s*/g, "");
				});
			}
			Main.TaskArea.children("h2").each(function() {
				var li = $("<li/>").attr("id", $(this).attr("id"));
				Main.Toolbar.find("ul").append(li.append($(this).children().clone().addClass("button").wrapInner("<span/>")));
				$(this).remove();
			});
			Main.Toolbar.find("ul li:lt(2)").addClass("button-tight");
			Main.TaskButtons = Main.Toolbar.find("ul a");
			Main.LoadScreen(true);
			$(window).unload(Main.SaveMapSettings).resize(Main.Resize).resize();
		}
	},
	Load: function() {
		Main.Init();
		Main.DefaultTask = !Main.IsClient && Util.HasRole("MEMBER") ? "ward" : "find";
		Main.TaskButtons.add(Main.Resizer).add("#legend a").click(Main.UpdateStateHandler);
		$("#marker a").click(Main.MarkPre);
		$("#email a").click(Main.EMail);
		$("#print a").click(Main.Print);
		$("#feedback").click(Util.Popup);

		$.trackMouse();
		$(document).keydown(Util.KeyControls);

		$.history.handler = Main.ExecuteState;
		Main.UpdateState(Util.ParseState($.history()));
	},
	ExecuteState: function() {
		var s = null, sd = null;
		var h = $.history();
		if (h !== Main._State.raw) {
			sd = Util.ParseState(h);
			s = $.diffObjects(sd, Main._State.data);
			Main.RecordState(h, sd);
		}
		if (!$.isEmptyObject(s)) {
			var params = null;
			if (!Main.Loaded || s.m) {
				params = {};
				var d = [];
				if ($.defined(s.lat) && $.defined(s.lng)) {
					params.point = new MapPoint(s.lat, s.lng);
					d.push("lat", "lng");
				}
				if ($.defined(s.z)) {
					params.zoom = s.z;
					d.push("z");
				}
				if ($.defined(s.t)) {
					params.type = s.t;
					d.push("t");
				}
				var layers = [];
				for (var i in Util.LayerTypes) {
					var t = i.toLowerCase();
					if ($.defined(s[t])) {
						$.merge(layers, Main.LayersCompile(t, s[t]));
						d.push(t);
					}
				}
				if (layers.length) {
					params.layers = layers;
				}
				for (var i = 0; i < d.length; i++) {
					delete s[d[i]];
				}
				if (!Main.Loaded) {
					$.extend(params, {events:{click:[Main.MapClick],changeview:[Main.MapUpdate],showcontent:[Main.MapShowContent],hidecontent:[Main.MapUpdate]}});
					Main.Loaded = true;
				}
			}
			var xTask = Main.GetTask();
			if (!$.empty(s[xTask]) && $.empty(s.x)) {
				Main.LoadTaskAction();
			}
			var us = {};
			var p = true;
			for (var i in s) {
				var x = s[i];
				switch (i) {
					case "x":
						if (x) {
							var xSubTask = Main.GetSubTask();
							var loadAction = true;
							Main._PrevTask = Main.GetCurrentTask();
							Main._Task = x;
							var task = Main.GetTask();
							Main._LoadingTaskState = s[task];
							if (Main._PrevTask) {
								var a = Main.TaskUnloadActions[xTask];
								if (a) {
									a(xSubTask);
								}
								Main.Hold = false;
							}
							if (task !== xTask) {
								Util.AbortExecute();
								if (Map.Loaded()) {
									Map.ClearLine();
									Util.MarkersClear();
									Util.LayerSelect();
								}
								document.title = $.format("{0} - {1}", $("#" + task + " a").select(2).text(), Main._Title);
								$(document.body).removeClass("task-" + xTask).addClass("task-" + task);
								var tp = Main.GetTaskPanel(task).height(Main.GetTaskHeight());
								if (Main._PrevTask) {
									var sp = tp.siblings(".task:visible").add(Main.GetTaskPanel(xTask));
									sp.animate({opacity:0}, {queue:false,complete:function() {
										sp.hide();
									}});
									tp.css({opacity:0,display:"block"}).animate({opacity:1}, {queue:false,complete:function() {
										$(this).css({opacity:"",filter:"",zoom:""});
									}});
								} else {
									tp.fadeIn();
								}
								if (!tp.children(".subtask").length) {
									Main.LoadScreen(true);
									$.callback($.format("{0}_RenderTask", $.initCase(task)));
									loadAction = false;
								}
								us.Task = task;
							}
							if (loadAction) {
								Main.LoadScreen(true);
								Main.LoadTask();
							}
							for (var j = 0; j < Main.TaskUpdateActions.length; j++) {
								Main.TaskUpdateActions[j]();
							}
						}
						break;
					case "m":
						if (x) {
							if ($.inArray(x, Util.Data.providers) === -1) {
								x = Util.Data.providers[0];
							}
							Map.Load(x, params);
							Util.NavControl.SelectorUpdate();
							for (var j = 0; j < Util.Data.providers.length; j++) {
								$(document.body).toggleClass($.format("provider-{0}", Util.Data.providers[j].toLowerCase()), x.toLowerCase() === Util.Data.providers[j].toLowerCase());
							}
							us["Map.Provider"] = x;
							if (params && $.defined(params.type)) {
								us["Map.Type"] = params.type;
							}
						}
						break;
					case "lat":
					case "lng":
					case "z":
						if (p && !$.empty(x)) {
							if (!$.empty(s.lat) && !$.empty(s.lng)) {
								Util.DelayUntilMap(function() {
									Map.Position(new MapPoint(s.lat, s.lng), $.empty(s.z) ? undefined : s.z);
								});
								p = false;
							} else {
								switch (i) {
									case "lat":
										Util.DelayUntilMap(function() {
											Map.Latitude(s.lat);
										});
										break;
									case "lng":
										Util.DelayUntilMap(function() {
											Map.Longitude(s.lng);
										});
										break;
									case "z":
										Util.DelayUntilMap(function() {
											Map.Zoom(s.z);
										});
										break;
								}
							}
						}
						break;
					case "t":
						if (x) {
							Util.DelayUntilMap(function() {
								Map.Type(s.t);
							});
							Util.NavControl.SelectorUpdate();
							us["Map.Type"] = s.t;
						}
						break;
					case "places":
					case "boundaries":
						var mls = Main.LayersCompile(i, x);
						for (var j = 0; j < mls.length; j++) {
							Map.Layer(mls[j]);
						}
						for (var j = 0; j < Main.LayerUpdateActions.length; j++) {
							Main.LayerUpdateActions[j]();
						}
						break;
					case "id":
						if (x) {
							var d = x.split(",");
							var ld = Util.LayerByName(d[1]);
							Util_GetEntityDetails(d[0], ld ? ld.layerName : null);
							if (!$.defined(s.s)) {
								if (ld.boundary) {
									Util.LayerSelect(d[0], d[1]);
								} else {
									Util.LayerSelect();
								}
							}
						} else if (Map.Loaded()) {
							Map.HideContent();
						}
						break;
					case "s":
						if (x) {
							var d = x.split(",");
							Util.LayerSelect(d[0], d[1]);
						} else {
							Util.LayerSelect();
						}
						break;
					case "legend":
						if (x == 1 && !Main.Legend) {
							var qp = Util.CompileState(Util.QueryParams(["places","boundaries"]));
							Util.PanelByName("legend?" + qp, function(name, panel) {
								Main.Legend = panel.hide().appendTo(Util.MapArea);
								Main.Legend.find(".close-x").attr("href", "#legend=0").removeAttr("onclick").click(Main.UpdateStateHandler);
								Main.Legend.find(".places input:checkbox, .boundaries input:checkbox").click(function() {
									Main.LayerUpdate($(this).parent().attr("data-id"), $.check($(this)));
								});
								Main.Legend.find("select").change(function() {
									Main.LayerUpdate($(this).closest("li").attr("data-id"), $(this).val());
								});
								Main.Legend.find(".scrollable").css("max-height", Main.Content.height() - 60);
								for (var j = 0; j < Main.LegendLoadActions.length; j++) {
									Main.LegendLoadActions[j]();
								}
								if (Main._State.data.legend == 1) {
									Main.LegendToggle(true);
								}
							});
						}
						Main.LegendToggle(x == 1);
						break;
					case "expand":
						var ex = (x == 1);
						$(document.body).toggleClass(i, ex);
						Main.Resizer.attr("href", $.format("#{0}={1}", i, ex ? 0 : 1));
						if (Map.Loaded()) {
							Map.Resize();
						}
						break;
					case "frame":
						if (x) {
							var f = Mapper.GetExtent(x.split(","));
							Util.DelayUntilMap(function() {
								Map.Frame(f);
							});
						}
						break;
					default:
						if (Main.SettingUpdateActions[i]
								&& (x || Main.SettingUpdateShown[i] === (s.x || Main.GetCurrentTask()) || $.defined(sd[i]))) {
							var sus = {};
							var cse = Util.SettingEnabled(i);
							var xa = x ? x.split(",") : null;
							if (cse.length) {	// cleanup
								for (var j = 0; j < cse.length; j++) {
									if (!xa || $.inArray(cse[j], xa) === -1) {
										sus[$.format("{0}.{1}", $.initCase(i), cse[j])] = false;
									}
								}
							}
							if (xa) {	// add
								for (var j = 0; j < xa.length; j++) {
									if ($.inArray(xa[j], cse) === -1) {
										sus[$.format("{0}.{1}", $.initCase(i), xa[j])] = true;
									}
								}
							}
							if (!$.isEmptyObject(sus)) {
								Util.Settings(sus);
							}

							for (var j = 0; j < Main.SettingUpdateActions[i].length; j++) {
								Main.SettingUpdateActions[i][j]();
							}
						}
						break;
				}
			}
			if (!$.isEmptyObject(us)) {
				Util.Settings(us);
			}
			Main.CaptureWebMetrics(s);
		}
	},
	UpdateState: function(state, hold) {
		var s = {};
		var omit = true;
		var x = state ? state.x : null;
		if (Main.Loaded) {
			$.extend(s, {
				x: x || Main.GetCurrentTask()
			});
			if (Map.Loaded()) {
				$.extend(s, {
					m: Map.Provider().toLowerCase(),
					lat: Map.Latitude(),
					lng: Map.Longitude(),
					z: Map.Zoom(),
					t: Map.Type()
				});
			} else {
				$.extend(s, {
					m: Main._State.data.m,
					lat: Main._State.data.lat,
					lng: Main._State.data.lng,
					z: Main._State.data.z,
					t: Main._State.data.t
				});
			}
			omit = (s.x === Main.GetCurrentTask());
		} else {
			$.extend(s, {
				x: x || (!Main.IsClient ? Util.Settings.Get("Task", Main.DefaultTask) : Main.DefaultTask),
				m: Util.Settings.Get("Map.Provider", Util.Data.providers[0]),
				lat: Util.Settings.Get("Map.Latitude", 0),
				lng: Util.Settings.Get("Map.Longitude", 0),
				z: Util.Settings.Get("Map.Zoom", 2),
				t: Util.Settings.Get("Map.Type", MapTypes.Hybrid)
			});
			Main.Hold = (state && ($.defined(state.lat) || $.defined(state.lng) || $.defined(state.z)));
			if (Main.Hold && $.defined(state.id)) {
				Util.Hold = new MapPoint($.defined(state.lat) ? state.lat : s.lat, $.defined(state.lng) ? state.lng : s.lng);
			}
		}
		for (var i in Util.LayerTypes) {
			var le = Util.LayersEnabled(Util.LayerTypes[i]);
			if (le.length) {
				s[i.toLowerCase()] = le.join();
			}
		}
		for (var i in Main.SettingUpdateShown) {
			if (Main.SettingUpdateShown[i] === s.x) {
				var se = Util.SettingEnabled(i);
				if (se.length) {
					s[i] = se.join();
				}
			}
		}
		if (Main.Legend && Main.Legend.is(":visible")) {
			s.legend = 1;
		}
		if ($(document.body).hasClass("expand")) {
			s.expand = omit ? 1 : 0;
		}
		var bid = Util.BalloonVisibleID();
		if (bid) {
			s.id = omit ? bid : null;
		}
		var sl = Util.LayerSelect.Current();
		if (sl) {
			s.s = omit ? sl : null;
		}
		var t = $.segment(s.x, "/");
		if (Main.TaskStates[t]) {
			var ts = Main.TaskStates[t]($.segment(s.x, "/", 1));
			if (ts) {
				s[t] = ts;
			}
		}
		if (!s[t] && Main._LoadingTaskState) {
			s[t] = Main._LoadingTaskState;
		}
		$.extend(s, state);

		var h = Util.CompileState(s);
		if (hold) {
			Main.RecordState(h, s);
		}
		if (Main.Loaded) {
			$.history(h, omit);
		} else {
			if (h === $.history()) {
				Main.ExecuteState();
			} else {
				$.history(h, true);
			}
		}
	},
	UpdateStateHandler: function(obj) {
		var s = Util.ParseState($.trimStart($.hash($(obj.href ? obj : this)), "#"));
		Main.UpdateState(s);
		return false;
	},
	RecordState: function(raw, data) {
		Main._State = {raw:raw,data:data};
	},
	GetTask: function() {
		return $.segment(Main.GetCurrentTask(), "/");
	},
	GetSubTask: function() {
		var x = Main.GetCurrentTask();
		if (x) {
			return $.segment(x, "/", 1, "main");
		}
		return null;
	},
	GetCurrentTask: function() {
		return Main._Task;
	},
	GetPreviousTask: function() {
		return Main._PrevTask;
	},
	GetTaskPanel: function(task) {
		return $($.format("#{0}\\:task", task || Main.GetTask()));
	},
	GetSubTaskPanel: function(task, subtask) {
		return $($.format("#{0}\\:{1}", task || Main.GetTask(), subtask || Main.GetSubTask()));
	},
	GetTaskHeight: function() {
		return Main.TaskArea.height() - Main.Toolbar.outerHeight();
	},
	RenderTaskComplete: function(request, data) {
		var t = request.options.parameters.task;
		var v = (t === Main.GetTask());
		if (v) {
			Main.LoadScreen(true);
			Main.ResizeTask();
		}
		Main.RenderTaskEvents(Main.GetTaskPanel(t));
		var tl = Main.TaskInitActions[t];
		if (tl) {
			tl(data);
		}
		if (v) {
			Main.LoadTask();
		}
	},
	RenderTaskEvents: function(obj) {
		obj.find("a[href*='='][href*='#']:not([target])").click(Main.UpdateStateHandler);
		obj.find(".task-section.toggle h4 a").unbind("click").click(Util.SelectSection).click();
		obj.find("form:has(input.execute)").each(function() {
			Util.LoadFormEvents(this);
		});
	},
	LoadTask: function() {
		if (Main.LoadTaskAction() !== false) {
			Main.LoadScreen(false);
		}
	},
	LoadTaskAction: function() {
		var t = Main.GetTask();
		var a = Main.TaskLoadActions[t];
		var s = Main._State.data[t];
		Main._LoadingTaskState = null;
		if (a) {
			return a(s);
		}
	},
	MapClick: function(e) {
		var le = Util.LayerInZoom(Util.LayersEnabled());
		if (le.length) {
			le = Util.LayersGisByNames(le);
			if (le.length) {
				Util_GetMapPointDetails($.parseArray(le), e.Point.Latitude, e.Point.Longitude, Map.PixelsToMeters());
			}
		}
	},
	MapUpdate: function() {
		if (Map.Loaded()) {
			Main.UpdateState(null, true);
		}
	},
	MapShowContent: function() {
		Util.MapArea.find(".balloon input:text,.balloon textarea").inputHint();
		var bid = Util.BalloonVisibleID();
		if (bid) {
			var d = bid.split(",");
			var ld = Util.LayerByName(d[1]);
			if (ld.boundary) {
				Util.LayerSelect(d[0], d[1]);
			} else {
				Util.LayerSelect();
			}
		}
		Main.MapUpdate();
	},
	LayerUpdate: function(layer, value) {
		var t = Util.LayerTypeByName(layer);
		if (t) {
			if ($.isBoolean(value)) {
				var le = Util.LayersEnabled(t, true);
				if (($.inArray(layer, le) === -1) === value) {
					Util.Settings($.format("{0}.{1}", Util.LayerTypeName(t), layer), value);
					if (!value) {
						if (layer === "selected") {
							Util.LayerSelect.Enable(false);
						} else {
							Util.MarkersClear(layer);
						}
					}
					$.thread(Main.UpdateState);
				}
			} else {
				Util.Settings($.format("{0}.{1}.Selected", Util.LayerTypeName(t), layer), value);
				$.thread(Main.UpdateState);
			}
		}
	},
	LayersCompile: function(type, names) {
		var mls = [];
		var us = {};
		var t = $.initCase(type);
		// cleanup
		if (Main._Layers[t].length) {
			for (var i = 0; i < Main._Layers[t].length; i++) {
				Map.ClearLayer(Main._Layers[t][i]);
			}
			Main._Layers[t] = [];
		}
		var cle = Util.LayersEnabled(Util.LayerTypes[t], true);
		if (cle.length) {
			var nle = names ? names.replace(/:[a-zA-Z]+/g, "").split(",") : null;
			for (var i = 0; i < cle.length; i++) {
				if (!nle || $.inArray(cle[i], nle) === -1) {
					if (cle[i] === "selected") {
						Util.LayerSelect.Enable(false);
					} else {
						Util.MarkersClear(cle[i]);
					}
					us[$.format("{0}.{1}", t, cle[i])] = false;
				}
			}
		}
		// add
		if (names) {
			var nle = names.split(",");
			var layers = {};
			for (var i = 0; i < nle.length; i++) {
				var ln = nle[i].split(":");
				if (Util.LayerExist(ln[0], Util.LayerTypes[t])) {
					var ld = Util.LayerByName(nle[i]);
					if (ld) {
						if (!layers[ld.opacity]) {
							layers[ld.opacity] = [];
						}
						layers[ld.opacity].push(ld.arcgisLayerAllId);
					} else if (nle[i] === "selected") {
						Util.LayerSelect.Enable(true);
						//TODO: consider checking Main._State.data.id and enabling
					}
					var usn = $.format("{0}.{1}", t, ln[0]);
					if (!$.bool(Util.Settings(usn))) {
						us[usn] = true;
					}
					if (/other.+/.test(nle[i])) {
						usn = $.format("{0}.Selected", usn);
						if (Util.Settings(usn) !== ln[1]) {
							us[usn] = ln[1] || "";
						}
					}
				}
			}
			for (var i in layers) {
				var o = parseFloat(i);
				var ml = new MapLayer(Util.LayerServices[t], layers[i], null, o, Util.LayerOffsets[t] + parseInt(o * 100));
				Main._Layers[t].push(ml.ID());
				mls.push(ml);
			}
		}
		if (!$.isEmptyObject(us)) {
			Util.Settings(us);
		}
		return mls;
	},
	SettingUpdate: function(setting, param, activate) {
		var se = Util.SettingEnabled(setting);
		if (($.inArray(param.toLowerCase(), se) === -1) === activate) {
			Util.Settings($.format("{0}.{1}", $.initCase(setting), param), activate);
			$.thread(Main.UpdateState);
		}
	},
	LoadScreen: function(activate) {
		if (activate) {
			Main.GetTaskPanel().children(".subtask").deselect();
			Util.ProcessMask.prependTo(Main.TaskArea).show();
		} else {
			Main.GetSubTaskPanel().select(1);
			Util.ProcessMask.remove();
		}
	},
	LegendToggle: function(activate) {
		if (Main.Legend) {
			if (activate) {
				Main.LegendUpdate();
				Main.LegendZoomCheck();
				Main.Legend.show();
				$("#legend a").select().attr("href", "#legend=0");
				Main.LayerUpdateActions.push(Main.LegendUpdate);
				Map.Bind("zoomend", Main.LegendZoomCheck);
			} else {
				$.removeItem(Main.LayerUpdateActions, Main.LegendUpdate);
				Map.Unbind("zoomend", Main.LegendZoomCheck);
				Main.Legend.hide();
				$("#legend a").deselect().attr("href", "#legend=1");
			}
		}
	},
	LegendUpdate: function() {
		if (Main.Legend) {
			var le = Util.LayersEnabled(null, true);
			Main.Legend.find(".places li[data-id], .boundaries li[data-id]").each(function() {
				var id = $(this).attr("data-id");
				var cb = $(this).children("input:checkbox");
				var s = $.inArray(id, le) !== -1;
				$(this).toggleSelect(s);
				$.check(cb, s);
				if (s) {
					var sub = $(this).find("select");
					if (sub.length) {
						sub.val(Util.Settings.Get("Boundaries." + id + ".Selected", ""));
					}
				}
			});
		}
	},
	LegendZoomCheck: function() {
		if (Main.Legend) {
			Util.LayerInZoomEnable(Main.Legend.find(".places li[data-id], .boundaries li[data-id]"));
		}
	},
	MarkPreDrag: function(e) {
		$(Map.MarkerPrimitive(e.Marker.ID())).simulate("mouseup");
		Main.MarkPre(true);
	},
	MarkPre: function(dragging) {
		Main.MarkCancel();
		Util.LoadMapMask(Main.MarkPost);
		Util.LoadCursor(Main.Cursors.Marker);
		Util.LoadToolTip($("#marker a").select().attr("title"));
		$.thread(function() {
			$(document).bind((dragging ? "mouseup" : "click") + ".marker", Main.MarkPost);
		});
		return false;
	},
	MarkPost: function(e) {
		var p = Util.WindowToMapPoint(e);
		if (p) {
			Util.MarkerLoad(p);
		}
		$(document).unbind(".marker");
		$("#marker a").deselect();
		Util.LoadMapMask();
		Util.LoadCursor();
		Util.LoadToolTip();
	},
	MarkAction: function(obj) {
		if ($(obj).parent().hasClass("feedback")) {
			Util.Popup(obj);
		} else {
			Main.UpdateStateHandler(obj);
		}
		Main.MarkCancel();
		return false;
	},
	MarkCancel: function() {
		if (Main.MarkerID) {
			Map.ClearMark(Main.MarkerID);
			Main.MarkerID = null;
		}
	},
	Resize: function() {
		var h = $(window).height() - (parseInt($(document.documentElement).css("margin-top")) || 0) - Main.Header.outerHeight(true) - Main.Content.outerHeight() + Main.Content.innerHeight();
		h = h > (parseInt(Main.Content.css("min-height")) || 0) ? h : "";
		Main.Content.height(h);
		if (Map.Loaded()) {
			Map.Resize();
		}
		Main.ResizeTask();
		if (Main.Legend) {
			Main.Legend.find(".scrollable").css("max-height", h - 60);
		}
	},
	ResizeTask: function() {
		Main.GetTaskPanel().show().height(Main.GetTaskHeight());
	},
	EMail: function() {
		var qp = Util.CompileState(Util.QueryParams(["places","boundaries","categories","assign","additionalAssign"]));
		var url = $.format("{0}//{1}{2}{3}#{4}",
				window.location.protocol, window.location.host,
				Main.IsClient ? window.location.pathname.replace(/\/[^\/]*$/g, "/") : window.location.pathname,
				qp ? "?" + qp : "", Main._State.raw);
		var body = $.format($.resource("email_body"), encodeURI(url));
		var subject = $.resource("email_subject");
		window.location = $.format("mailto:?subject={0}&body={1}", escape(subject), escape(body));
		return false;
	},
	Print: function() {
		Main.SaveMapSettings();
		var p = Util.QueryParams(["legend"]);
		var x = Map.Extent();
		p.top = x[0].Latitude;
		p.left = x[0].Longitude;
		p.bottom = x[1].Latitude;
		p.right = x[1].Longitude;
		var bid = Util.BalloonVisibleID();
		if (bid) {
			p.id = bid;
		}
		var sl = Util.LayerSelect.Current();
		if (sl) {
			p.s = sl;
		}
		var t = Main.GetTask();
		var action = Main.PrintActions[t];
		if (action) {
			var tp = action($.segment(Main.GetCurrentTask(), "/", 1));
			if (tp) {
				$.extend(p, {t:t}, tp);
			}
		}
		var url = $.format("{0}?{1}", $(this).attr("href"), Util.CompileState(p));
		window.open(url);
		return false;
	},
	SaveMapSettings: function() {
		var s = {
			"Map.Latitude": Map.Latitude(),
			"Map.Longitude": Map.Longitude(),
			"Map.Zoom": Map.Zoom(),
			"Map.Type": Map.Type()
		};
		Util.Settings(s);
	},
	CaptureWebMetrics: function(s) {
	}
};

Util.InitActions.push(Main.Load);

