// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

var onloads = new Array();

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();
}

var pageOverlay = {
	show: function(id)
	{
		this.empty();
		var obj = $("page-overlay");
	    
	    if (/reg/.match(id)) {
	      updateCaptcha();
	    } // ужжасно. но надо как-то обновить капчу при показе
	    
		$(id).show();
		obj.show();
		var f = $(id).getElementsByTagName("FORM")[0];
		if (f) $(f).focusFirstElement();
		var h = obj.offsetHeight; // hack for IE6
	},
	hide: function(e)
	{
		if (e && e.element().className != "overlay-center")
			e.cancelBubble = true;
		else
		{
			this.empty();
			$("page-overlay").hide();
		}
	},
	empty: function()
	{
		var obj = $("page-overlay");
		$A(obj.getElementsByClassName("auth-item")).each(Element.hide);
	}
}

var appearStage = 0;
function showAuthBox(mode, type)
{
  if (type == 'reg') updateCaptcha();
  $("auth-layer").style.height = mode ? "100%" : "0";
  $("main-auth").className = type ? ("auth-" + type + "-only") : "";
  if (!type) type = "reg";
  var path = "#" + type + "-start > form";
  if ($$(path)[0]) $$(path)[0].focusFirstElement();
  // FIXME position cursor on the correct field
}

function checkLoggedIn()
{
	if ( !$("user-logged-in")  ) {pageOverlay.show("auth-login"); return false;}
	return true;
}

function emailFieldFor(type)
{
  switch(type){
  case 'reg':
    return 'new_user_email';
  case 'auth':
    return 'email';
  case 'email':
    return 'my_email';
  }
  return null;
}

function switchAuthBox(from, to)
{
  $(emailFieldFor(to)).value = $(emailFieldFor(from)).value; 
  showAuthBox(true, to);
  clearErrorMessages();
  return false;
}

function clearErrorMessages()
{
  $$("#auth-layer .error-message").each(function(error){ error.innerHTML="";});
}

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 будут проблемы
}

// TODO перенести в js для edit_user
function togglePwdBox()
{
	var flag = $('pwd-box').toggle().visible();
	$("user_old_password").disabled = !flag;
	$("user_password").disabled = !flag;
	$("user_password_confirmation").disabled = !flag;
}

Number.prototype.decline = function(word)
{
	var n = this + " ", p = word.split(/- |,/g);
	var pn = n.match(/([^1]|^)1 /) ? 1 : (n.match(/([^1]|^)[234] /) ? 2 : 3);
	return n + p[0] + p[pn];
}
function toggleComments(obj)
{
	var box = $(obj.parentNode.parentNode);
	if (box.hasClassName('closed')) {
		box.removeClassName("closed");
		obj.innerHTML = "Скрыть ответы";
	} else {
		box.addClassName("closed");
		var amount = box.getElementsByClassName("comment").length;
		obj.innerHTML = "Показать " + amount.decline("отве- т,та,тов");
	}
}
function showCommentsForm(obj, arg) {
	if (obj) {
		obj.parentNode.appendChild($("new_reply"));
		$('new_comment_button').show();
		$('new_comment_form').hide();
		$('parent_id').value = arg;
		$('new_reply').show();
		$('new_reply').getElementsByTagName("TEXTAREA")[0].focus()
	} else {
		$('comments-block').appendChild($("new_reply"));
		$('new_comment_button').hide();
		$('new_comment_form').show();
		$('new_reply').hide();
		if (obj != false) 
			$('new_comment').getElementsByTagName("TEXTAREA")[0].focus()
	}
}

var previousBody;

function editComment(id, body){
	previousBody = 	$('comment_'+id+'_body').innerHTML;
	while (body.replace("<br />", "\n") != body.replace("<br />", "\n").replace("<br />", "\n")) {
		body = body.replace("<br />", "\n");
	}
	body = body.replace("<br />", "\n");
	
	while (body.replace("\"", "'") != body.replace("\"", "'").replace("\"", "'")) {
		body = body.replace("\"", "'");
	}
	body = body.replace("\"", "'");
	
	$('comment_'+id+'_body').innerHTML = '<textarea id="comment_'+id+'_textarea" rows="5" cols="32"/>';
	$('comment_'+id+'_textarea').innerHTML = body;
	$('comment_'+id+'_body').innerHTML += '<input value="отменить" type="button" href="#" onclick="cancelEdit('+id+'); return false;"'+
		'<input type="button" value="Сохранить" href="#" onclick="updateCommentBodyRequest('+id+'); return false;">';
}

function cancelEdit(id) {
	$('comment_'+id+'_body').innerHTML = previousBody;
}

function updateCommentBodyRequest(id){
	new Ajax.Request("/comments/update/"+id, {method: "post", parameters: {body:$("comment_"+id+"_textarea").value}, asynchronous:true, evalScripts:true});
}


function show_edit_comment_form(){
	document.observe('dom:loaded', function() {
		var reg = /\?(\d+)&(\d+)/;
		var array = reg.exec(document.URL);
        if(!array) return;
		var comment = array[1];
		var parent = array[2];
		if (comment != parent)
			toggleComments($('comment_'+parent+'_toggle'));
		document.location = '#comment-'+comment;
		$('comment_' + comment + '_edit_link').onclick();
	});
}

var nameControl = {}
nameControl.init = function()
{
	this.obj = $("user_name");
	this.control = $("name-to-nick");
	this.arrow = $("name-arrow");
	this.obj.onkeyup = function(){nameControl.update();};
	this.update();
}
nameControl.update = function()
{
	this.value = this.obj.value;
	this.control.innerHTML = this.value;
	this.control.style.display = this.value ? "inline" : "none"; 
	this.arrow.style.display = this.value ? "inline" : "none"; 	
}
nameControl.apply = function()
{
	if (this.value) $("user_nick").value = this.value;
}


/* Relations panel */
var counter = 0;
var 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()
{
	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]) + "</a>»";
		if (this.alreadyRelated[values[0] + values[1]]) {
			this.complete(true);
		}
		else if (this.id && (this.id != values[1] || this.type != values[0])) {
			this.fill("<span 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";
	var closeButton = "<div id=\"panel-close\" onclick=\"relationsPanel.close()\" title='Выключить связывание материалов'></div>";
	panel.innerHTML = "<div class=\"page-width\">" + closeButton + "<div id=\"panel-content\"></div></div>";
	if (this.animate) {
		panel.style.display = "none";
	}
	$("page-top").appendChild(panel);
	if (document.viewport.getScrollOffsets().top > $("relations-panel").cumulativeOffset().top) {
		window.scrollTo(0, 0);
	}	
	if (this.animate) {
		panel.appear(50);	
		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=/";	
}
}

/**
 * DHTML date validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */
// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}
function isDate(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strMonth=dtStr.substring(0,pos1)
	var strDay=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
        var errors = Array();
	if (pos1==-1 || pos2==-1){
		errors.push("invalid-format");
	}
	if (strMonth.length<1 || month<1 || month>12){
		errors.push("invalid-month");
	}
        if(errors.length==0)
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		errors.push("invalid-day");
	}
	if(errors.length==0)
        if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		errors.push("invalid-years-range");
	}
	if(errors.length==0)
        if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		errors.push("invalid-date");
	}
        var res = {ok:(errors.length==0), minYear:minYear, maxYear:maxYear};
        if(!res.ok) res.error = errors[0];
        return res;
}
function storePrevIndex(selector){
    selector.prevIndex = selector.selectedIndex;
}
function restorePrevIndex(selector){
    selector.selectedIndex = selector.prevIndex;
}
function checkDate(dsid_d, dsid_m, dsid_y){
    var dSelector = $(dsid_d);
    var mSelector = $(dsid_m);
    var ySelector = $(dsid_y);
    var dateStr = mSelector.options[mSelector.selectedIndex].value+'/'+dSelector.options[dSelector.selectedIndex].value+'/'+ySelector.options[ySelector.selectedIndex].value;
    var correctDate = isDate(dateStr);
    if(correctDate.ok){
        storePrevIndex(dSelector);
        storePrevIndex(mSelector);
        storePrevIndex(ySelector);
    } else {
        switch(correctDate.error){
        case "invalid-format":{
                alert("Дата должна быть в формате: mm/dd/yyyy.");
                break;
        }
        case "invalid-month":{
                alert("Некорректно заданный месяц.");
                break;
        }
        case "invalid-day":{
                alert("Некорректно заданный день.");
                break;
        }
        case "invalid-years-range":{
                alert("Введите год из диапазона "+correctDate.minYear+" -- "+correctDate.maxYear+".");
                break;
        }
        case "invalid-date":{
                alert("Некорректно заданная дата.");
                break;
        }
        }
        restorePrevIndex(dSelector);
        restorePrevIndex(mSelector);
        restorePrevIndex(ySelector);
    }
}
function addDateValidatorTo(dsid_d, dsid_m, dsid_y){
    storePrevIndex($(dsid_d));
    storePrevIndex($(dsid_m));
    storePrevIndex($(dsid_y));
    $(dsid_d).onchange = function(){checkDate(dsid_d, dsid_m, dsid_y);};
    $(dsid_m).onchange = function(){checkDate(dsid_d, dsid_m, dsid_y);};
    $(dsid_y).onchange = function(){checkDate(dsid_d, dsid_m, dsid_y);};
}

function jsValidationAlert(eleid, errormsg){
    var ele = $(eleid);
    if(!errormsg) errormsg = "должно быть заполнено";
    if(!ele) {alert(errormsg); return;}
    window.scrollTo(0, ele.cumulativeOffset().top);
    if(ele.errorHint){
        ele.errorHint.show();
    } else {
        var errordiv = new Element('div', { 'class': 'error-hint' }).update('<div><p>'+errormsg+'</p></div>');
        errordiv.style.position = 'relative';
        errordiv.style.top = '-'+ele.getStyle('margin-bottom');
        if(ele.nextSibling) {
            ele.parentNode.insertBefore(errordiv, ele.nextSibling);
        } else {
            ele.parentNode.appendChild(errordiv);
        }
        ele.errorHint = errordiv;
    }
}

var regions = new Array();
function getRegions(){
	var opts = {
		asynchronous:true, 
		method:'get'
		// , parameters:'action='+action+'&'+addparams.join('&')
	};
	opts.onComplete = function (transport){
		rsp = transport.responseText.evalJSON();
		regions_arr = rsp.items;
                var id;
                for(var i=0, l=regions_arr.length; i<l; i++){
                    id = regions_arr[i][0];
                    regions[id] = regions_arr[i][1];
                }
                for(var id in regions)
                    if(id.match(/^[0-9]+$/))
                        if(regions[id].sub_parent_id && regions[id].title.match(/[0-9]/)) regions[id].title += ', '+regions[regions[id].sub_parent_id].title;
		// for(var i=0, l=5; i<l; i++) alert(regions[i]);
                // alert(Object.toJSON(regions));
	}
	// new Ajax.Request('/addresses/all_regions/', opts);
        new Ajax.Request('/javascripts/auto/all_regions.js', opts);
}
onloads.push(getRegions);

function showFriendBalloon(obj)
{
	var beak = $(obj).next().firstDescendant();
	beak.style.width = obj.offsetWidth + "px";
	obj.parentNode.className = "opened";
}

function checkForError(response)
{
	if (response.isJSON()) {
		json = response.evalJSON();
		if (json.error) alert(json.error);
	}
}
