var onloads = new Array();
var appearStage = 0;
var pageOverlay = {};
var previousBody;
var nameControl = {}
var regions = new Array();
var relationsPanel = {};
var counter = 0;
var Homepage = {};

// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;
var updateCaptcha;

/* Find wrappers on login */
var findWrappers = function(for_what) {
	var wrappers = [];
	var items = document.getElementsByClassName("controls-wrapper");
	for (var i = 0, lim = items.length; i < lim; i++) {
		wrappers.push(items[i].id);
	}
	$("update-wrappers-"+for_what).value = wrappers.join(",");
}

/* labels in search form */
function setSearchValue(id, obj) {
	$(id).focus();
	$(id).value = obj.innerHTML;
}
function initFieldLabel(id)
{
	var obj = $(id);
	obj.observe('focus', function() {obj.previous("label").hide();});
	obj.observe('blur', function() {if (!obj.present()) obj.previous("label").show();});
	if (!obj.present()) obj.previous("label").show();
}

/* Page overlay */
var pageOverlay = {
show: function(id, message) {
	onloads.push(function(id, message){
		return function() {pageOverlay.show(id, message);}
	}(id, message));	
},
init: function(shadow, container, layer) {
	this.shadow = $(shadow);
	this.container = $(container);
	this.layer = $(layer);
},
show: function(id, message) {
	this.empty();
	if (!$(id)) id = "read-only"
	if (!$(id))	return false;
	switch (id) {
		case "login":
			$("login-form-message").innerHTML = message || "";
			$("login-form-message").style.display = message ? "block" : "none";
			break;
		case "bugreport": defendBugreport(); break;
		case "signup": updateCaptcha(); break;
	}
	$(id).show();
	this.shadow.show();
	this.container.style.visibility = "hidden";
	this.container.show();
	this.update();
	this.container.style.visibility = "visible";	
	var form = $(id).getElementsByTagName("FORM")[0];
	if (form) {
		$(form).focusFirstElement();
	}
	var h = this.container.offsetHeight; // hack for IE6
},
update: function() {
	if (this.layer.getHeight() > document.viewport.getHeight()) {
		this.container.removeClassName("fixed");
		this.container.style.top = document.viewport.getScrollOffsets().top + "px";
	} else {
		this.container.addClassName("fixed");
		this.container.style.top = "0";
	}
},
hide: function() {
	this.container.hide();
	this.shadow.hide();
	this.empty();
},
hideOnEsc: function(event) {
	var e = event || window.event;
	var key = e.which || e.keyCode;
	if (key == 27) this.hide();
},
empty: function() {
	$A(this.container.getElementsByClassName("overlay-item")).each(Element.hide);
}
};

function defendBugreport() {
	if ($("bugreport-test")) return;
	var field = document.createElement("input");
	field.type = "hidden";
	field.value = "1";
	field.name = "i_am_human";
	field.id = "bugreport-test";
	$("bug-description").parentNode.appendChild(field);	
}
function updateCaptcha() {
	new Ajax.Updater('reg-captcha', '/captcha/show_captcha', {asynchronous:true, evalScripts:true, method:'get'}) 
	//,parameters:'authenticity_token=' + encodeURIComponent('dfd83be923c593d85f0f6ab00fb61a31f7577b39')})
	// FIXME после включения protect_from_forgery будут проблемы
}

/* Add new fact list in menu */
function toggleAddYour() {
	if ($('add-menu').toggleClassName("active").hasClassName("active")) {
		Event.observe(document, "click", toggleAddYour);
	} else {
		Event.stopObserving(document, "click", toggleAddYour);
	}
}

/* Relations panel */
var counter = 0;
relationsPanel = {
alreadyRelated: ((relationsPanel && relationsPanel.alreadyRelated) ? relationsPanel.alreadyRelated : {}),
typesCurrent: {"Event": "это событие", "News": "эту новость", "Place": "это место", "Article": "эту статью", "Topic": "эту тему"},
typesCompleted: {"Event": "Это событие уже связано", "News": "Эта новость уже связана", "Place": "Это место уже связано", "Article": "Эта статья уже связана", "Topic": "Эта тема уже связана"},
typesWith: {"Event": "с событием", "News": "с новостью", "Place": "c местом", "Article": "со статьей", "Topic": "с темой"},
current: function(type, id, title, url) {
	this.type = type;
	this.id = id;
	this.title = title;
	this.url = url;
},
activate: function() {
	var date = new Date();
	date.setHours(date.getHours() + 3);
	var expires = "; expires=" + date.toGMTString();
	var info = [this.type, this.id, this.url, escape(this.title)];
	document.cookie = "addrelation=" + info.join(" ") + expires + "; path=/";
	this.animate = true;
	this.check();
},
check: function() {
	if (!$("user-logged-in")) document.cookie = "addrelation=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/";	
	var cookies = document.cookie.toString().replace("; ", ";");
	var pos = cookies.indexOf("addrelation");
	if (pos > -1) {
		var summary = cookies.substr(pos + 12).split(";")[0];
		var values = summary.split(" ", 4);
		this.draw();
		this.target = this.typesWith[values[0]] + " «<a href=\"" + values[2] + "\">" + unescape(values[3]).replace(/[«»]/g,"") + "</a>»";
		if (this.alreadyRelated[(values[0] + "_" + values[1]).toLowerCase()]) {
			this.complete();
		}
		else if (this.id && (this.id != values[1] || this.type != values[0])) {
			this.fill("<span class=\"link\" onclick=\"relationsPanel.apply('" + values[0] + "','" + values[1] + "')\">Cвязать</span> " + this.typesCurrent[this.type] + " " + this.target);
		} else {
			this.fill("Перейдите на страницу материала, который хотите связать " + this.target);
		}
	} else if ($("relations-panel")) {
		$("relations-panel").remove();
	}
},
complete: function(mode) {
	if (this.target) {
		var str = this.typesCompleted[this.type];
		if (mode) str = str.replace(" уже ", " ");
		this.fill(str + " " + this.target);
	} else {
		this.fill("Материалы связаны");
	}
	//if (mode) this.close();
},
draw: function() {
	if ($("relations-panel")) return;
	var panel = document.createElement("DIV");
	panel.id = "relations-panel";
	panel.innerHTML = "<div id=\"panel-close\" onclick=\"relationsPanel.close()\" title='Выключить связывание материалов'></div><div id=\"panel-content\"></div>";
	if (this.animate) panel.style.display = "none";
	$("page-menu").up().insertBefore(panel, $("page-menu").next());
	if (document.viewport.getScrollOffsets().top > $("relations-panel").cumulativeOffset().top) {
		window.scrollTo(0, 0);
	}	
	if (this.animate && panel.appear) {
		if (panel.appear) panel.appear(50); else panel.style.display = "block";
		this.animate = null;	
	}
},
fill: function(str) {
	$("panel-content").innerHTML = str;	
},
apply: function(type, id) {
	var params = {
		parent_type: type,
		parent_id: id,
		child_type: this.type,
		child_id: this.id			
	}
	new Ajax.Request('/relations/add_link', {asynchronous:true, evalScripts:true, parameters:$H(params).toQueryString()});
},
close: function() {
	$("relations-panel").remove();
	document.cookie = "addrelation=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/";	
},
update: function() {
	onload_inits();
	this.check();
}
}

var fixedMapEnabled = false;
function setMapFixed(mode) {
	if (!$("map-mode-control")) return;
	if (mode != undefined && mode != fixedMapEnabled) {
		$("map-mode-control").checked = mode;
		fixedMapEnabled = mode;
	} else {
		fixedMapEnabled = $("map-mode-control").checked;
	}
	toggleMapFixed();
}
function toggleMapFixed() {
	if (fixedMapEnabled && document.viewport.getScrollOffsets().top > mapCanvasOffset) {
  		mapShadowElement.addClassName("fixed");
  	} else {
  		mapShadowElement.removeClassName("fixed");
  	}
}
function saveMapFixed() {
	setMapFixed();
	if (fixedMapEnabled) {
		var date = new Date();
		date.setMonth(date.getMonth() + 1);
		var expires = "; expires=" + date.toGMTString();
		document.cookie = "fixedmap=1" + expires + "; path=/";	
	} else {
		document.cookie = "fixedmap=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/";	
	}
}

Number.prototype.decline = function(w1, w2, w3) {
	var n = this + " ";
	var w = n.match(/([^1]|^)1 /) ? w1 : (n.match(/([^1]|^)[234] /) ? w2 : w3);
	return n + w;
}

var galleryPreviews = {
init: function(selected, size) {
	this.left = selected;
	this.size = size;
	this.items = $("gallery-previews").childElements();
	var amount = Math.min(this.size - 1, this.items.length - 1), l = this.left + 0, r = this.left + 0;
	while (amount) {
		if (l > 0 && amount) {l--; amount--;}
		if (r < this.items.length - 1 && amount) {r++; amount--;}
	}
	for (var i = l; i <= r; i++) {
		var item = this.items[i];
		this.load($(item).firstDescendant());
		$(item).removeClassName("hidden");
	}
	this.left = l;
	this.update();
},
scroll: function(dir) {
	var n = this.left;
	if (dir < 0 && n > 0) n--;
	if (dir > 0 && n < this.items.length - this.size) n++;
	if (n != this.left) {
		for (var i = this.items.length; i--;) {
			var item = this.items[i];
			if (i >= n && i < n + this.size) {
				this.load($(item).firstDescendant());
				$(item).removeClassName("hidden");
			} else {
				$(item).addClassName("hidden");
			}
		}
		this.left = n;
		this.update();
	}
},
load: function(obj) {
	var child = $(obj).firstDescendant();
	if (!child || child.tagName != "IMG") {
		var img = new Image();
		img.src = obj.title;
		obj.title = "";
		obj.innerHTML = "";
		obj.appendChild(img);
	}
},
update: function() {
	var row = $("gallery-pager").rows[0];
	row.cells[0].className = (this.left > 0) ? "active" : "";
	row.cells[2].className = (this.left < this.items.length - this.size) ? "active" : "";
}
};
