var OLD_IE = ((jQuery.browser.msie) && (jQuery.browser.version < 7));

textContent = function(xml){
    var cnt;
    if (xml.text!=undefined) { cnt = xml.text; } else
       if (xml.textContent!=undefined) { cnt = xml.textContent; } else
        { cnt=xml.firstChild.nodeValue; }
    return cnt;
}

$(document).ready(function(){
	Interface.setUserInfo();
    })

/**
 * Класс для управления cookies
 */
Cookies = new Object();
/**
 * Устанавливает значение cookie
 * @param {String} name
 * @param {String} value
 * @param {String} expires возможно использовать инкрементные значения (+1d, +2m ...)
 * @param {String} path
 * @param {String} domain
 * @param {Boolean} secure
 */
Cookies.set = function(name, value, expires, path, domain, secure) {
    if ((expires) && (expires.toString().match(/\+(\d+)(h|d|m|y)/))) {
        var date = new Date();
        var c = parseInt(RegExp.$1);
        var s = RegExp.$2;
        switch (s) {
            case 'y':
                date.setYear(date.getYear() + c);
                break;
            case 'm':
                date.setMonth(date.getMonth() + c);
                break;
            case 'd':
                date.setDate(date.getDate() + c);
                break;
            case 'h':
                date.setHours(date.getHours() + c);
                break;
        }
        expires = date.toGMTString();
    }
    document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

/**
 * Получает значение cookie
 * @param {String} name
 */
Cookies.get = function(name) {
    var cookie = " " + document.cookie;
    var search = " " + name + "=";
    var setStr = null;
    var offset = 0;
    var end = 0;
    if (cookie.length > 0) {
        offset = cookie.indexOf(search);
        if (offset != -1) {
            offset += search.length;
            end = cookie.indexOf(";", offset)
            if (end == -1)
                end = cookie.length;
            setStr = unescape(cookie.substring(offset, end));
        }
    }
    return(setStr);
}


Interface = new Object();

/* Обработчик для сворачивалки информации о пользователе */
Interface.setUserInfo = function(){
    var user_info = new UserInfoToggler();
}

function UserInfoToggler(){
    this.name = "UserInfoToggler v.1";
    this.dom = $("#user_info");
    this.cookie = "_u_toggle";
    if(this.dom.length>0){
	this.init();
    }
}

UserInfoToggler.prototype = {
    init: function(){
	var self = this;
	self.dom.find(".hider").click(function(){ self.toggle(this); });
    },
    toggle: function(el){
	var self = this;
	var from_cookie = Cookies.get(self.cookie);
	if(!from_cookie){
	    from_cookie = "shown";
	}
	if(from_cookie == "hidden"){
	    self.unhide();
	    Cookies.set(self.cookie,"shown","+1m","/");
	}else{
	    self.hide();
	    Cookies.set(self.cookie,"hidden","+1m","/");
	}
    },
    unhide: function(){
	var self = this;
	self.dom.removeClass("uhidden");
    },
    hide: function(){
	var self = this;
	self.dom.addClass("uhidden");
    }
}
/* ---------------------------------- */

/* Обработчик для сворачивалки блогов */
Interface.setBlogs = function(){
    var accordion = new BlogsAccordion();
}

function BlogsAccordion(){
    this.name = "BlogsAccordion v.3";
    this.blogs = $(".psycho-scheme");
    if(this.blogs.length>0){
	this.init();
    }
}

BlogsAccordion.prototype = {
    init: function() {
	var self = this;
	self.blogs.find(".hm").each(function(){
		$(".trigger",this).click(function(){ self.toggle(this.parentNode); });
		$(".ps-blogs",this).hide();
	    });
    },
    toggle: function(el) {
	var self = this;
	$(".ps-blogs",el).animate({height: 'toggle'},{ duration: 200 });
    }
}
/* ----------------------------------- */

/* Обработчик для формы публикации */
Interface.prepareModForm = function(){
    var form = document.getElementById('mod_form');
    if (form) {
	form.style.display = "none";
	a = document.createElement("a");
	a.href = "#show";
	a.innerHTML = "Показать";
	a.className = "mf-toggler";

	form.parentNode.appendChild(a);


	$(a).click(function(){
		if(form.style.display == "none"){
		    form.style.display = "block";
		    this.innerHTML = "Скрыть";
		}else{
		    form.style.display = "none";
		    this.innerHTML = "Показать";
		}

		return false;
	    });
    }
}
/* ------------------------------- */

/* Прототип для переключателя схемы материалов */
function SchemeToggler(){
    this.name = "Scheme toggler v.5";
    this.cookie = "_toggler";
    this.params = {};
    this.start();
}

SchemeToggler.prototype = {
    start: function(){
	var self = this;

	var from_cookie = Cookies.get(self.cookie);
	if(from_cookie){
	    var parsed = from_cookie.split("|");
	    for(var i=0;i<parsed.length;i++){
		var vals = parsed[i].split(":");
		self.params[vals[0]] = vals[1];
	    }
	}
	$(".hm").each(function(){
		var id = this.className.split(" ")[1];
	        if(self.params[id]==1){
		    $(this.parentNode).addClass("hm-show");
		}
                $(this).click(function(){
		    var id = this.className.split(" ")[1];
		    var parent = $(this.parentNode);
		    parent.toggleClass("hm-show");
		    if(parent.hasClass("hm-show")){
			self.params[id]=1;
		    }else{
			self.params[id]=0;
		    }
		    self.set();
                    return false;
                    })
                });
    },
    set: function(){
	var self = this;
	var str = "";
	for (var key in self.params){
	    str+=key+":"+self.params[key]+"|";
	}
	str = str.slice(0,str.length-1);
	Cookies.set(self.cookie,str,undefined,"/");
    }

}
/* --------------------------------------------------- */


/* Подсказчик тегов */
function TagsSuggestor(tagField){
      this.name = "Tags Suggestor v. 1";
      this.ajaxParams = { }
      if(tagField){
          this.tagField = $(tagField);
          this.start();
      }
}

TagsSuggestor.prototype = {
    start: function(){
        var self = this;

        self.tagContainer = document.createElement("div");
        self.tagContainer.className = "form-suggest-list";
        self.tagField.after(self.tagContainer)

        $(".form-suggest-list a").live("click", function(event) {
                event.preventDefault();
                var tags_inputarea = self.tagField.get(0);
                var hint = $(this).text();
                tags_str = tags_inputarea.value;
                var tags = tags_str.split(',');
                tags[tags.length - 1] = hint;
                for(var i=0; i<tags.length; i++) {
                    tags[i] = tags[i].replace(/^\s+/, '').replace(/\s+$/, '');
                }
                tags_inputarea.value = tags.join(', ')+', ';

                $(self.tagContainer).hide();
                tags_inputarea.focus()
            })

        self.tagField.get(0).setAttribute('autocomplete', 'off');
        self.tagField.keydown(
                function(eventObject) {
                        var el = this;
                        if (this.watingTimeout) window.clearTimeout(this.watingTimeout);
                        this.watingTimeout = window.setTimeout(function() { self.getSuggest(el); }, 500);
                    }
                );
    },
    getSuggest: function(el){
        var self = this;
        if (el.watingTimeout) window.clearTimeout(el.watingTimeout);
        var tags = el.value.split(",");
        if(tags.length>0){
            var last_tag = tags[tags.length-1];
            last_tag = last_tag.replace(/^\s+/,'').replace(/\s+$/,'');
             if(last_tag.length>=1){
                self.ajaxParams = { iface: 'tags_auto_suggest',
                                    str: last_tag };
                $.post('/ajax/',self.ajaxParams,function(data){self.showSuggest(el,data)},"xml");
            }else{
                $(self.tagContainer).hide();
            }
        }
    },
    showSuggest: function(el,xml){
        var self = this;
        var items = xml.getElementsByTagName('item');
        if (items.length > 0) {
            var tags = '';
            for(var i=0; i<items.length; i++){
                var tag = textContent(items[i]);
                if(tag) {
                    tags += '<a href="#">' + tag + '</a> ';
                }
            }
            $(self.tagContainer).html(tags);
            $(self.tagContainer).show();
        }else{
            $(self.tagContainer).hide();
        }
    }

}
/* ------------------------------- */

/* Js обертка для добавления / редактирования топика */
function TopicInterface(){
    this.name = "Topic Interface v.1";
    this.form = $(".topic-add");
    this.fieldsChanged = 0;
    this.ajaxParams = { };
    this.ajaxLoading = 0;
    this.start();
}

TopicInterface.prototype = {
    start: function(){
        var self = this;

        self.SetupFieldsEditing();

        self.form.find("input[name='tags']").each(function(){ this.__handle = new TagsSuggestor(this); });
        /* specific initialization */
        if($("#gallery_cont").length>0){
            var Gloader = new GalleryLoader("#gallery_cont","#sh_upl_f",{type: "gallery",
									 text: true});
        }
    },
    SetupFieldsEditing: function(){
        var self = this;
        self.form.find("input, select, textarea").each(function(){ $(this).change(function(){ self.fieldsChanged = 1; }); });
        $(".topic-type a").click(function(){ if((self.fieldsChanged)&&(!window.confirm('Данные не будут сохранены. Продолжить?'))){
                                                return false;
                                             } return true;});
    }
}
/* ------------------------------- */



/* Js обертка для добавления / редактирования новости*/
function NewsInterface(){
    this.name = "News Interface v.1";
    this.form = $(".topic-add");
    this.fieldsChanged = 0;
    this.ajaxParams = { };
    this.ajaxLoading = 0;
    this.start();
}

NewsInterface.prototype = {
    start: function(){
        var self = this;

	if($("#single_image_cont").length>0){
            var SMloader = new GalleryLoader("#single_image_cont","#sh_upl_f",{type: "single_image",
									       text: false});
        }
	if($("#gallery_cont").length>0){
            var Gloader = new GalleryLoader("#gallery_cont","#g_upl_f",{type: "gallery",
									text: true,
									iframe: "_gm"});
        }
	var region = new RegionSelector(this,"#region_container");
        self.form.find("input[name='tags']").each(function(){ this.__handle = new TagsSuggestor(this); });
    }
}
/* ------------------------------- */


/* Загрузчик фотографий в фотогалерею */
function GalleryLoader(DOM,button,params){
    this.name = "GalleryLoader v. 1";

    this.DOM = $(DOM);
    this.button = $(button);
    this.params = {type: "gallery",
		   text: true,
		   iframe: ""};
    if(params){
	for(var key in params){
	    this.params[key] = params[key];
	}
    }

    this.ajaxParams = { };
    this.ajaxLoading = 0;
    this.start();
}

GalleryLoader.prototype = {
    start: function(){
        var self = this;

        /* uploading frame */
        var iframe;
        if(OLD_IE){
	    iframe = document.createElement("<iframe src='' name='upl_frame"+self.params['iframe']+"'></iframe>");
	}else{
	    iframe = document.createElement('iframe');
	    iframe.src=""
	    iframe.name="upl_frame"+self.params['iframe'];
	}
	iframe.style.display="none";
	iframe.style.width = "0";
	iframe.style.height = "0";
	$(iframe).load(function(){ self.onload(this); });
	$("#main").append(iframe);
        /* -- uploading frame */

        /* file upload form */
        if(OLD_IE){
            self.fileForm = document.createElement("<form action='/uploadg/' enctype='multipart/form-data' class='upload-form' method='POST' target='upl_frame"+self.params['iframe']+"'></form>");
        }else{
            self.fileForm = document.createElement("form");
            $(self.fileForm).attr({"class": "upload-form",
                                   "method": "post",
                                   "encoding": "multipart/form-data",
                                   "enctype": "multipart/form-data",
                                   "action": "/uploadg/",
                                   "target":"upl_frame"+self.params['iframe']});
        }

        self.fileUpload = document.createElement('input');
        self.fileUpload.type = "file";
        self.fileUpload.name = "image";
        self.fileForm.appendChild(self.fileUpload);

	$(document.createElement("input"))
	.attr({"type":"hidden",
	       "name":"act_event",
	       "value":self.params.type})
	.appendTo($(self.fileForm));

        $("#main").append(self.fileForm);

        var uploader = document.createElement('a');
        $(uploader).attr({"href": "#",
                          "class": "u-upload",
                          "title": "Загрузить"});
        uploader.innerHTML = "&nbsp;";
        self.fileForm.appendChild(uploader);

        uploader.onclick = function(){ if(self.fileUpload.value != ""){
                                          self.fileForm.submit(); }
                                          return false;
                                      };

        var closer = document.createElement('a');
        $(closer).attr({"href": "#",
                        "class": "u-close",
                        "title": "Отмена"});
        closer.innerHTML = "&nbsp;";
        self.fileForm.appendChild(closer);
        $(closer).click(function(){ self.onFFclose(); return false;})
        /* -- file upload form */

        self.button.click(function(){
            if(self.FFShown){
                self.onFFclose();
            }else{
                if(self.EFShown){ self.onEFclose(); }

                self.FFShown = 1;

                self.fileForm.style.top = parseInt($(this).offset().top) + "px";
                $(self.fileForm).addClass("uf-abs");
            }
            return false;
        });

        $(".g_c_img",self.DOM).each(function(){
					var adel = document.createElement("a");
					adel.className = "g-i-del";
					adel.href="#del";
					adel.innerHTML = "&nbsp;";
					adel.title = "Удалить изображение";
					this.appendChild(adel);
					$(adel).click(function(){ self.onclick(this); return false; });
					if(self.params.text){
					    var aed = document.createElement("a");
					    aed.className = "g-i-ed";
					    aed.href="#edit";
					    aed.innerHTML = "&nbsp;";
					    aed.title = "Редактировать подпись";
					    this.appendChild(aed);
					    $(aed).click(function(){ self.onclick(this); return false; });
					}
                                                });

        /* edit description form */
        self.editForm = document.createElement('div');
        self.editForm.className = "comment-edit-form";

        var textarea = document.createElement('textarea');

        self.editForm.appendChild(textarea);
        self.editForm.comment_area = textarea;

        var save = document.createElement('input');
        save.type = "button";
        save.value = "Сохранить";
        self.editForm.appendChild(save);
        $(save).click(function(){ self.onEFsave(); });

        var close = document.createElement('input');
        close.type = "button";
        close.value = "Закрыть";
        self.editForm.appendChild(close);
        $(close).click(function(){ self.onEFclose(); });
        $("#main").append(self.editForm);
        /*-- edit description form */
    },
    onload: function(el){
        var self = this;
        var d = null;
        if (el.contentDocument) {
            d = el.contentDocument;
        } else if (el.contentWindow) {
            var d = el.contentWindow.document;
        }
	if(d.location.href == "about:blank") { return; }
        if(d){
            var params = eval(d.body.innerHTML);
            if(params[1]!=0){
                alert('Загруженный файл не является изображением');
            }
            if(params[0]>0 ){
                self.onFFclose();
		if(self.params.type=="single_image"){
		    self.DOM.empty();
		}

                var div = document.createElement("div");
                div.className = "g_c_img";
                div.id = "i_"+params[0];

                var img = document.createElement("img");
                img.src = params[3];
                div.appendChild(img);

		var adel = document.createElement("a");
		adel.className = "g-i-del";
		adel.href="#del";
		adel.innerHTML = "&nbsp;";
		adel.title = "Удалить изображение";
		div.appendChild(adel);

		if(self.params.text){
		    var aed = document.createElement("a");
		    aed.className = "g-i-ed";
		    aed.href="#edit";
		    aed.innerHTML = "&nbsp;";
		    aed.title = "Редактировать подпись";
		    div.appendChild(aed);
		}

                div.appendChild(document.createElement("div"));

                self.DOM.append(div);

                $(div).find("a").click(function(){ self.onclick(this); return false; });
            }
        }
    },
    onclick: function(el){
        var self = this;
        var action = el.href.split("#")[1];
        var id = el.parentNode.id;
        if(action == "del"){
            if(window.confirm('Вы уверены что хотите удалить изображение?')){
                self.ajaxParams = { };
		self.ajaxParams["act_event"] = self.params.type;
                self.ajaxParams["type"] = "del";
                self.ajaxParams["file_id"] = el.parentNode.id.split("_")[1];
                if(!self.ajaxLoading){
                    self.ajaxLoading = 1;
                    $.post('/uploadg/',self.ajaxParams,function(data){self.showAnswer(data)},"xml");
                    $(el.parentNode).remove();
                }
            }
        }
        if(action == "edit"){
            if(self.EFShown){ self.onEFclose(); }
            if(self.FFShown){ self.onFFclose(); }
            self.curFoto = el.parentNode;
            $(self.editForm).addClass("cef-show");
            self.editForm.comment_area.value = $("div",self.curFoto).html();
            self.ajaxParams = { };
	    self.ajaxParams["act_event"] = self.params.type;
            self.ajaxParams["type"] = "save";
            self.ajaxParams["file_id"] = self.curFoto.id.split("_")[1];
            var position = $(self.curFoto).offset();
            self.editForm.style.left = parseInt(position.left - $("#main").offset().left)+"px";
            self.editForm.style.top = parseInt(position.top) + self.curFoto.offsetHeight +"px";
            self.EFShown = 1;
        }
    },
    onFFclose: function(){
        var self = this;
        self.fileForm.reset();
        $(self.fileForm).removeClass("uf-abs");
        self.FFShown = null;
    },
    onEFclose: function(){
        var self = this;
        self.editForm.comment_area.value = "";
        $(self.editForm).removeClass("cef-show");
        self.EFShown = null;
    },
    onEFsave: function(){
        var self = this;
        if(!self.ajaxLoading){
            self.ajaxParams["comment"] = self.editForm.comment_area.value;
            self.ajaxParams["comment"] = self.ajaxParams["comment"].replace(/\<([^\>]+)\>/g,"");
            self.ajaxParams["comment"] = self.ajaxParams["comment"].replace(/\<([^\>]*)$/g,"");
            self.ajaxLoading = 1;
            $.post('/uploadg/',self.ajaxParams,function(data){self.showAnswer(data)},"xml");
        }
    },
    showAnswer: function(data){
        var self = this;
        self.ajaxLoading = null;
        var content = data.getElementsByTagName("content")[0];
        if(content){
            var answer = content.getElementsByTagName("answer")[0];
            if(answer){
                switch(answer.getAttribute("name")){
                    case "save":{
                        var div = $("div",self.curFoto).get(0);
                        div.innerHTML = self.ajaxParams["comment"];
                        self.onEFclose();
                        self.curFoto = null;
                    }
                }
            }
        }
    }
}
/* ------------------------------- */


/* Обертка для управления модераторами материалов */
function Moderators(params){
    this.name = "Moderators Control v.1";

    this.usersDom = $("#all_users");
    this.modsDom = $("#mod_users");

    this.params = params;

    this.page = 1;
    this.per_page = 0;
    this.users_count = 0;
    this.loading = 0;
    this.ajaxParams = {};

    this.start();
}

Moderators.prototype = {
    start: function(){
        var self = this;
        self.getUsers(false);
    },
    getUsers: function(no_mods){
        var self = this;

        self.ajaxParams = { page: self.page,
                            _act: "get_users"
                          }

	for (var key in self.params){
	    self.ajaxParams[key] = self.params[key];
	}

        if(no_mods){
            self.ajaxParams['no_mods'] = 1;
        }
        $.post('/ajax/',self.ajaxParams,function(data){self.answer(data)},"xml");
    },
    makeSmth: function(el){
        var self = this;
        var user_id = el.href.split("_")[1];
        self.ajaxParams = { user_id: user_id,
                            _act: "make_mod"
                          }
	for (var key in self.params){
	    self.ajaxParams[key] = self.params[key];
	}
        if(el.parentNode.parentNode.id == "mod_users"){
          self.ajaxParams._act = "make_user";
        }
        self.curUser = el;
        $.post('/ajax/',self.ajaxParams,function(data){self.answer(data)},"xml");
    },
    answer: function(xml){
        var self = this;
        var iface = xml.getElementsByTagName("iface")[0];
        if(iface){
            switch(iface.getAttribute("act")){
                case "get_users":
                    var users_cont = iface.getElementsByTagName("users")[0];
                    if(users_cont){
                        self.users_count = users_cont.getAttribute("count");
                        self.per_page = users_cont.getAttribute("per_page");
                        self.setpages();
                        var users = users_cont.getElementsByTagName("user");
                        for(var i=0; i<users.length;i++){
                          var user_info = {
                                           login: users[i].getAttribute("login"),
                                           href: users[i].getAttribute("href"),
                                           user_id: users[i].getAttribute("user_id"),
                                           login: users[i].getAttribute("login"),
                                           photo: textContent(users[i].getElementsByTagName("photo")[0]),
                                           realname: textContent(users[i].getElementsByTagName("real_name")[0]),
                                           rank: users[i].getAttribute("rank"),
                                           rank_def: textContent(users[i].getElementsByTagName("rank")[0]),
					   txt_status: textContent(users[i].getElementsByTagName("txt_status")[0])
                                          }
                          self.addUser(user_info,"user");
                        }
                    }
                    var mods = iface.getElementsByTagName("mods")[0];
                    if(mods){
                        var users = mods.getElementsByTagName("user");
                        for(var i=0; i<users.length;i++){
                          var user_info = {
                                           login: users[i].getAttribute("login"),
                                           href: users[i].getAttribute("href"),
                                           user_id: users[i].getAttribute("user_id"),
                                           login: users[i].getAttribute("login"),
                                           photo: textContent(users[i].getElementsByTagName("photo")[0]),
                                           realname: textContent(users[i].getElementsByTagName("real_name")[0]),
                                           rank: users[i].getAttribute("rank"),
                                           rank_def: textContent(users[i].getElementsByTagName("rank")[0]),
					   txt_status: textContent(users[i].getElementsByTagName("txt_status")[0])
                                          }
                          self.addUser(user_info,"mod");
                        }
                    }
                break;
                case "make_mod":
                    self.modsDom.append(self.curUser.parentNode);
                    $(self.curUser).toggleClass("m-unmod");
                    self.curUser = null;
                break;
                case "make_user":
                    self.usersDom.append(self.curUser.parentNode);
                    $(self.curUser).toggleClass("m-unmod");
                    self.curUser = null;
                break;
            }
        }
    },
    addUser: function(userInfo,type){
        var self = this;

        var userDom = document.createElement("div");
        userDom.className = "m-user ov";

        var imgDom = document.createElement("div");
        imgDom.className = "mu-img";
        imgDom.innerHTML = userInfo.photo;
        userDom.appendChild(imgDom);

        var coreDom = document.createElement("div");
        coreDom.className = "ov";
        coreDom.innerHTML = "<p class='m-login'><a href='"+userInfo.href+"'>"+userInfo.login+"</a></p>";
        $(coreDom).append("<p>"+userInfo.realname+"</p>");
        $(coreDom).append("<p> Статус: <strong>"+userInfo.rank_def+"</p>");
	if(userInfo.txt_status != ""){
	    $(coreDom).append("<p> Должность: <strong>"+userInfo.txt_status+"</p>");
	}
        userDom.appendChild(coreDom);
        var a = document.createElement("a");
        a.href="#uid_"+userInfo.user_id;
        a.innerHTML = " ";
        a.className = "m-toggler";
        userDom.appendChild(a);
        $(a).click(function(){ self.makeSmth(this); return false; });
        if(type=="user"){
            self.usersDom.append(userDom);
        }
        if(type=="mod"){
            $(a).addClass("m-unmod");
            self.modsDom.append(userDom);
        }
    },
    setpages: function(){
        var self = this;
        if(self.paginator==null){
            var paginator = document.createElement("div");
            paginator.className="u-paggy";
            self.usersDom.after(paginator);
            self.paginator = $(paginator);
            var prev = document.createElement("a");
            prev.href = "#prev";
            prev.innerHTML = "←";
            prev.title = "Назад";
            var next = document.createElement("a");
            next.href = "#next";
            next.innerHTML = "→";
            next.title = "Дальше";
            self.paginator.append(prev);
            self.paginator.append(next);
            self.prev = $(prev);
            self.next = $(next);
            self.prev.hide();
            self.next.hide();
            self.next.click(function(){ self.page++; self.getUsers(true) });
            self.prev.click(function(){ self.page--; self.getUsers(true) });
        }
        self.usersDom.empty();
        var page_quantity;
        if ( self.users_count % self.per_page) {
            if (self.users_count / self.per_page > 1) {
                page_quantity =  parseInt(self.users_count / self.per_page) + 1;
            } else {
                page_quantity=0;
            }
        } else {
            if(self.users_count!=self.per_page){
                page_quantity = parseInt(self.users_count / self.per_page);
            }else{
                page_quantity=0;
            }
        }
        if(self.page>1){ self.prev.show(); }
        if(self.page==1){ self.prev.hide(); }
        if(self.page < page_quantity){ self.next.show(); }
        if(self.page == page_quantity){ self.next.hide(); }
    }
}
/* ------------------------------- */

/* Подсказчик разделов, в которых опубликован материал */
function BlogKnower(){
    this.name = "Blog Knower v.1";
    this.shown = null;
    this.ajaxParams = { };
    this.start();
}

BlogKnower.prototype = {
    start: function(){
        var self = this;

        $(".t-paths .hm").attr("title","Нажмите, чтобы посмотреть подразделы").css("cursor","pointer").click(function(){ self.get(this); });
    },
    get: function(el){
        var self = this;
        if(self.shown) self.close();
        var params = el.id.split("_");
        var test = document.getElementById("pp_"+params[1]+params[2]);
        if(test){
            self.shown = test;
            self.show();
        }else{
            self.ajaxParams = { iface: "service",
                              _act: "get_blogs",
                              blog_id: params[1],
                              topic_id: params[2]
                              };
            var position = $(el).offset();
            var bubble = document.createElement("div");
            bubble.className = "popup pp-loading";
            bubble.id = "pp_"+params[1]+params[2];
            $(document.body).append(bubble);
            $(bubble).css({top: (position.top - bubble.offsetHeight)+"px",
                           left: (el.offsetWidth + position.left) + "px"});
            self.shown = bubble;
            $.post('/ajax/',self.ajaxParams,function(data){self.answer(data)},"xml");
        }
    },
    answer: function(xml){
        var self = this;
        var iface = xml.getElementsByTagName("iface")[0];
        if(iface){
            switch(iface.getAttribute("act")){
                case "get_blogs":
                  var top_reset = self.shown.offsetHeight;
                  $(self.shown).removeClass("pp-loading");
                  self.shown.innerHTML = textContent(iface);
                  var a = document.createElement("a");
                  a.href="#hide";
                  a.className="pp-close";
                  a.innerHTML = "закрыть";
                  $(a).click(function(){ self.close(); return false; })
                  self.shown.appendChild(a);
                  $(self.shown).css({top: (self.shown.offsetTop - self.shown.offsetHeight + top_reset)+"px"});
		  self.show();
                break;
            }
        }
    },
    show: function(){
        var self = this;
	$(document).one('mousedown', function(e) { self.close(); });
	$(self.shown).mousedown(function(e){ e.stopPropagation(); });
	self.shown.style.display = "block";
    },
    close: function(){
        var self = this;
	if(self.shown){
	    self.shown.style.display = "none";
	    self.shown = null;
	}
    }
}
/* ------------------------------- */

/* Обработчик для управления гео-регионами*/
Interface.GeoEditor = function(){
    var geoEditor = new GeoEditor();
}

function GeoEditor(){
    this.name = "GeoEditor v.1";
    this.dom = $("#geoEditor");
    if(this.dom.length>0){
	this.start();
    }
}

GeoEditor.prototype = {
    start: function(){
	var self = this;

	self.top = self.dom.offset().top;



	var div = document.createElement("div");
	div.className = "reg-add-form";
	self.regadd = $(div);
	self.dom.append(self.regadd);

	self.regadd.append("<p>Ввведите название георграфического пункта</p>")

	var input = document.createElement("input");
	self.regadd.regname = $(input);
	self.regadd.regname.attr({type: "text",
				  name: "reg_name",
				  className: "reg_name"});
	self.regadd.append(self.regadd.regname);

	var input = document.createElement("input");
	self.regadd.pseudo = $(input);
	self.regadd.pseudo.attr({type: "checkbox",
				 name: "pseudo",
				 value: 1})

	self.regadd.append(self.regadd.pseudo);
	self.regadd.pseudo.after("Псевдорегион");

	var a = document.createElement("a");
	$(a).attr({href: "#",
		   className: "cad-yes",
		   title: "Добавить"})
	    .html("&nbsp;")
	    .click(function(){ self.add(); return false; });;
	self.regadd.append(a);

	var a = document.createElement("a");
	$(a).attr({href: "#",
		   className: "cad-no",
		   title: "Отмена"})
	    .html("&nbsp;")
	    .click(function(){ self.hide(); return false; });
	self.regadd.append(a);

	self.region = new GeoPlace(self,1,"Начало",null,self.dom,"root",0);
	self.get(this.region);
    },
    show: function(caller){
	var self = this;
	self.caller = caller;
	var pos = self.caller.dom.offset();
	self.regadd.css("top",pos.top - self.top+"px");
	self.regadd.show();
    },
    hide: function(){
	var self = this;
	self.caller = null;
	self.regadd.regname.val("");
	self.regadd.pseudo.removeAttr("checked");
	self.regadd.hide();
    },
    add: function(){
	var self = this;
	if(self.caller){
	    var cityname = self.regadd.regname.val();
	    cityname = cityname.replace(/^\s*/g,"");
	    cityname = cityname.replace(/\s*$/g,"");
	    if(cityname!=""){
		var type = self.caller.type + 1;
		if(self.caller.type=="root") { type = 1; }
		var ajaxparams = { iface: "geo_editor",
				   _act: "add",
				   parent_id: self.caller.id,
				   type: type,
				   name: cityname
				 };
		if(self.regadd.pseudo.is(":checked")){
		   ajaxparams['pseudo'] = 1;
		}
		$.post('/ajax/',ajaxparams,function(data){self.answer(data,self.caller)},"xml");
	    }else{
		alert("Вы не ввели название!");
	    }
	}
    },
    del: function(caller){
	var self = this;
	self.hide();
	if(window.confirm('Вы уверены что хотите удалить географический пункт?')){

	    self.caller = caller;
	    var ajaxparams = { iface: "geo_editor",
			       _act: "del",
			       geo_id: self.caller.id
			     };
	    $.post('/ajax/',ajaxparams,function(data){self.answer(data,self.caller)},"xml");
	}
    },
    get: function(parent){
	var self = this;
	var ajaxparams = { iface: "geo_editor",
			   _act: "get",
			   parent_id: parent.id
			  };
	$.post('/ajax/',ajaxparams,function(data){self.answer(data,parent)},"xml");
    },
    answer: function(xml,parent){
	var self = this;
	var iface = xml.getElementsByTagName("iface")[0];
        if(iface){
            switch(iface.getAttribute("act")){
                case "get":
		    var regions = xml.getElementsByTagName('region');
		    for (var i=0; i<regions.length; i++) {
			parent.childs.push(new GeoPlace(self,
							regions[i].getAttribute("id"),
							regions[i].getAttribute("name"),
							parent,
							parent.dom,
							regions[i].getAttribute("type"),
							regions[i].getAttribute("pseudo")
							))
		    }
                break;
		case "add":
		    parent.childs = new Array();
		    parent.dom.find("ul:first").empty();
		    parent.dom.find("div:first").removeClass("expanded");
		    parent.dom.find("ul:first").addClass("closed");
		    var regions = xml.getElementsByTagName('region');
		    for (var i=0; i<regions.length; i++) {
			parent.childs.push(new GeoPlace(self,
							regions[i].getAttribute("id"),
							regions[i].getAttribute("name"),
							parent,
							parent.dom,
							regions[i].getAttribute("type"),
							regions[i].getAttribute("pseudo")
							))

		    }
		    parent.got = 1;
		    parent.dom.find("div:first").addClass("expanded");
		    parent.dom.find("ul:first").removeClass("closed");
		    self.hide();
                break;
		case "del":
		    parent.childs = new Array();
		    parent.dom.empty();
		    delete parent;
                break;
            }
        }
    }
}

function GeoPlace(owner,id,name,parent,parentDom,type,pseudo){
    this.owner = owner;
    this.id = id;
    this.parent = parent;
    this.name = name;
    this.pseudo = pseudo;
    this.childs = new Array();
    this.got = 0;
    if(type!="root"){
	this.type = parseInt(type);
	this.dom = null;
	this.create(parentDom);
    }else{
	this.type = type;
	var self = this;
	this.dom = parentDom;
	var a = document.createElement('a');
	a.href = "#";
	a.title = "Добавить регион";
	a.className = "gi-root-add";
	a.innerHTML = "&nbsp;";
	this.dom.append(a);
	this.dom.find("a.gi-root-add").click(function(){ self.owner.show(self); return false; });
    }

}

GeoPlace.prototype = {
    create: function(dom){
	var self = this;
	var ul = $(dom).find("ul:first ");
	if(ul.length==0){
	    var el = document.createElement('ul');
	    $(dom).append(el);
	    ul = $(el);
	}

	var li = document.createElement('li');
	var div = document.createElement('div');
	div.className = "geo-item ov";
	if(self.pseudo == 1){ div.className+=" geo-pseudo" }
	if(self.type!="3"){
	    var a = document.createElement('a');
	    a.href = "#";
	    a.className = "clicker";
	    a.innerHTML = "&nbsp;";
	    div.appendChild(a);

	    var a = document.createElement('a');
	    a.href = "#";
	    a.title = "Добавить регион";
	    a.className = "gi-add";
	    a.innerHTML = "&nbsp;";
	    div.appendChild(a);
	}
	var a = document.createElement('a');
	a.href = "#";
	a.title = "Удалить регион";
	a.className = "gi-del";
	a.innerHTML = "&nbsp;";
	div.appendChild(a);

	var name = document.createElement('div');
	name.innerHTML = self.name;
	name.className = "ov";
	div.appendChild(name);
	li.appendChild(div);
	$(ul).append(li);
	self.dom = $(li);
	self.dom.find("a.clicker").click(function(){ self.expand(); return false; });
	self.dom.find("a.gi-del").click(function(){ self.owner.del(self); return false; });
	self.dom.find("a.gi-add").click(function(){ self.owner.show(self); return false; });
    },
    expand: function(){
	var self = this;
	if(self.got==0){
	    self.got = 1;
	    self.dom.find("div:first").addClass("expanded");
	    self.owner.get(self);
	}else{
	    self.dom.find("div:first").toggleClass("expanded");
	    self.dom.find("ul:first").toggleClass("closed");
	}
    }
}
/* ------------------------------- */


/* Обработчик для личной информации*/
function PersonalInfo(){
    this.name = "Personal Info v. 0.5";
    this.form = $(".profile-edit form");
    this.fieldsChanged = 0;
    if(this.form.length){
	this.start();
    }
}

PersonalInfo.prototype = {
    start: function(){
	var self = this;

	self.SetupFieldsEditing();

	var bd_cont = document.getElementById("birth_date_container");
	if(bd_cont){
	    bd = {
		  day: parseInt($("input[name='bday']").val()),
		  month: parseInt($("input[name='bmonth']").val()),
		  year: parseInt($("input[name='byear']").val())
		  };
	    if(isNaN(bd.day)) bd.day = 0;
	    if(isNaN(bd.month)) bd.month = 0;
	    if(isNaN(bd.year)) bd.year = 0;

	    var date = new Date;
	    self.birth_date = new DateSelector(self,"#main","#birth_date_container",{day: bd.day,
							    month: bd.month,
							    year: bd.year,
							    minYear: date.getFullYear()-80,
							    maxYear: date.getFullYear()-14
							    });
	    self.form.submit(function(){
					$("input[name='bday']").val(self.birth_date.params.day);
					$("input[name='bmonth']").val(self.birth_date.params.month);
					$("input[name='byear']").val(self.birth_date.params.year);
					self.birth_date.clean();
				});
	}

	var st_cont = document.getElementById("stage_date_container");
	if(st_cont){
	    st = {
		  month: parseInt($("input[name='smonth']").val()),
		  year: parseInt($("input[name='syear']").val())
		  };
	    if(isNaN(st.month)) st.month = 0;
	    if(isNaN(st.year)) st.year = 0;

	    var date = new Date;
	    self.stage_date = new DateSelector(self,"#main","#stage_date_container",{
							    month: st.month,
							    year: st.year,
							    minYear: date.getFullYear()-65,
							    show_day: 0
							    });
	    self.form.submit(function(){
					$("input[name='smonth']").val(self.stage_date.params.month);
					$("input[name='syear']").val(self.stage_date.params.year);
					self.stage_date.clean();
				});
	}
	self.region_cont = new RegionSelector(self,"#region_container");
    },
    SetupFieldsEditing: function(){
        var self = this;
        self.form.find("input, select, textarea").each(function(){ $(this).change(function(){ self.fieldsChanged = 1; }); });
        $(".prof-tabs a").click(function(){ if((self.fieldsChanged)&&(!window.confirm('Данные не будут сохранены. Продолжить?'))){
                                                return false;
                                             } return true;});
    }
}
/* ------------------------------- */

/* Обработчик для управления гео-регионами*/
Interface.UserSearcher = function(){
    var userSearcher = new UserSearcher();
}

function UserSearcher(){
    this.name = "UserSearcher v.1";
    this.searchbar = $("#us_searchbar"); //dom для параметров поиска
    this.searchsorts = $("#us_sorts");	 //dom для параметров сортировки
    this.searchres = $("#us_results"); 	 //dom для результатов поиска
    this.searchloading = this.searchres.siblings(".search-loading");
    this.searchnoresults = this.searchres.siblings(".search-no-results");
    this.params = {}; 			 // параметры поиска
    this.sorts = {}; 			 // параметры сортировки
    var region = new RegionSelector(this,"#region_container");
    if((this.searchbar.length>0)&&(this.searchres.length>0)){
	this.start();
    }
}

UserSearcher.prototype = {
    start: function(){
	var self = this;

	self.params['person_surname'] = self.searchbar.find("input[name='person_surname']");
	self.params['person_name'] = self.searchbar.find("input[name='person_name']");
	self.params['person_nickname'] = self.searchbar.find("input[name='person_nickname']");
	if(self.searchbar.find("input[name='rd_id']").length>0){
	    self.params['rd_id'] = self.searchbar.find("input[name='rd_id']");
	}
	if(self.searchbar.find("select[name='country']").length>0){
	    self.params['country'] = self.searchbar.find("select[name='country']");
	}
	if(self.searchbar.find("select[name='region']").length>0){
	    self.params['region'] = self.searchbar.find("select[name='region']");
	}
	self.params['rank'] = self.searchbar.find("select[name='rank']");
	self.params['online'] = self.searchbar.find("input[name='online']");

	var sort = self.searchsorts.find("li.active");
	if(sort.length>0){
	    var name = sort.attr("id").split("-")[1];
	    self.sorts["field"] = name;
	    self.sorts["ord"] = "asc";
	    if(sort.hasClass("desc")){
		self.sorts["ord"] = "desc";
	    }
	}

	self.searchsorts.find("li").each(function(){ $(this).click(function(){ self.sort(this); }); });

	self.searchbar.find("button").click(function(){ self.check(); });
	self.searchres.find(".navbar a").live("click",function(){
		var page = this.href.split("#")[1].split("=")[1];
		self.check(page);
		return false;
	    });
	self.params['person_surname'].focus();
	self.params['person_surname'].keypress(function(e){ self.keypress(e); });
	self.params['person_name'].keypress(function(e){ self.keypress(e); });
	self.params['person_nickname'].keypress(function(e){ self.keypress(e); });
	self.check();
    },
    keypress: function(e){
	var self = this;
        var event = window.event?window.event:e;
        var keyCode = event.keyCode;
        if (!keyCode) { keyCode = event.charCode; }
        if (keyCode==13) {
            try { self.check(); } catch(err) { alert(err); }
        }
    },
    check: function(page){
	var self = this;
	if(!self.loading){
	    var ajaxparams = {
			      iface: "user_search",
			      person_surname: self.params['person_surname'].val(),
			      person_name: self.params['person_name'].val(),
			      person_nickname: self.params['person_nickname'].val(),
			      rank: self.params['rank'].val(),
			      sfield: self.sorts.field,
			      sord: self.sorts.ord
			     };
	    if(page){
		ajaxparams["page"] = page;
	    }
	    if(self.params['country']){
		ajaxparams['country'] = self.params['country'].val();
	    }
	    if(self.params['rd_id']){
		ajaxparams['rd_id'] = self.params['rd_id'].val();
	    }

	    if(self.params['region']){
		ajaxparams['region'] = self.params['region'].val();
	    }

	    if(self.params['online'].is(':checked')){
		ajaxparams["online"] = 1;
	    }
	    self.searchres.empty();
	    self.searchnoresults.hide()
	    self.loading = 1;
	    self.searchloading.show();
	    $.post('/ajax/',ajaxparams,function(data){self.answer(data)},"xml");
	}
    },
    sort: function(el){
	var self = this;
	if(!self.loading){
	    var li = $(el);
	    if(li.hasClass("active")){
		li.toggleClass("desc");
	    }else{
		li.siblings().removeClass("active").removeClass("desc").end().addClass("active");
	    }
	    var name = li.attr("id").split("-")[1];
	    self.sorts["field"] = name;
	    self.sorts["ord"] = "asc";
	    if(li.hasClass("desc")){
		self.sorts["ord"] = "desc";
	    }
	    self.check();
	}
    },
    answer: function(xml){
	var self = this;
	var iface = xml.getElementsByTagName("iface")[0];
        if(iface){
	    self.searchloading.hide();
	    var users = iface.getElementsByTagName("user");
	    for(var i=0;i<users.length;i++){
		self.searchres.append(textContent(users[i]));
	    }
	    var nav = iface.getElementsByTagName("nav")[0];
	    if(nav){
		self.searchres.append(textContent(nav));
	    }
	    if(users.length==0){
		self.searchnoresults.show();
	    }
	    self.loading = 0;
	}
    }
}

/* -------------------------------- */

/* прототип для работы с выбором региона */

/*
    Параметры:
	caller - кто вызывает объект на создание
	dom - где искать select'ы (jquery expression)
*/
function RegionSelector(caller,dom){
    this.name = "Region Selector v.1";

    this.dom = $(dom);

    if(this.dom.length>0){

	this.reg = new Object;
	/* this.reg - объект в котором будут храниться selectы
	    this.reg.country - селектор страны
	    this.reg.region - селектор региона
	    this.reg.city - селектор города
		this.reg.cityadd - форма для добавления города 			// только в том случае если есть селектор города
		self.reg.cityname - input для ввода название добаляемого города // только в том случае если есть селектор города
		this.reg.ftoggler - переключатель показа формы 			// только в том случае если есть селектор города
	*/

	/* параметры для проверки показыватются ли страна, регион и город */
	this.params = { country: 0,
			region: 0,
			city: 0
		      };
	this.reg.country = $("select[name='country']",this.dom);
	if(this.reg.country.length>0){
	   this.params.country = 1;
	}
	this.reg.region = $("select[name='region']",this.dom);
	if(this.reg.region.length>0){
	   this.params.region = 1;
	}
	this.reg.city = $("select[name='city']",this.dom);
	if(this.reg.city.length>0){
	   this.params.city = 1;
	}
	if((this.params.country==1)||(this.params.region==1)||(this.params.city==1)){
	    this.start();
	}
    }
}

RegionSelector.prototype = {
    start: function(){
	var self = this;

	/* Устанавливаем форму для добавления городов */
	if(this.params.city==1){
	    var div = document.createElement("div");
	    div.className = "city-add-form";
	    self.reg.cityadd = $(div);
	    self.reg.city.after(self.reg.cityadd);

	    var input = document.createElement("input");
	    self.reg.cityname = $(input);
	    self.reg.cityname.attr({type: "text",
			   name: "city_name"});

	    self.reg.cityadd.append(self.reg.cityname);

	    var a = document.createElement("a");
	    $(a).attr({href: "#",
		       className: "cad-yes",
		       title: "Добавить город"})
		.html("&nbsp;")
		.click(function(){ self.addCity(); return false; });
	    self.reg.cityadd.append(a);

	    var a = document.createElement("a");
	    $(a).attr({href: "#",
		       className: "cad-no",
		       title: "Отмена"})
		.html("&nbsp;")
		.click(function(){ self.hideForm(); return false; });
	    self.reg.cityadd.append(a);

	    var a = document.createElement("a");
	    self.reg.ftoggler = $(a);
	    self.reg.ftoggler.attr({href: "#",
				    className: "cad-toggler"})
			     .html("Вашего города нет в списке?")
			     .click(function(){ self.showForm(); return false; });
	    self.reg.city.after(self.reg.ftoggler);

	    if((self.params.region==1)&&(self.reg.region.val()==0)){
		self.reg.ftoggler.hide();
	    }
	}

	if(self.params.region==1) self.reg.region.bind("change",function(){ self.rebuildCity(); });

	if(self.params.country==1) self.reg.country.bind("change",function(){ self.rebuildRegion(); });
    },
    rebuildRegion: function(){
	var self = this;
	if(self.params.region==1){
	    var ajaxparams = { iface: "service",
	    		   _act: "get_regions",
	    		   region: self.reg.country.val() };
	    self.hideForm();
	    if((self.params.city==1)&&(self.reg.country.val()==0)){
	        self.reg.ftoggler.hide();
	    }
	    self.reg.region.attr({disabled: "disabled"});
	    $.post('/ajax/',ajaxparams,function(data){self.answer(data)},"xml");
	}
    },
    rebuildCity: function(){
	var self = this;
	if(self.params.city==1){
	    var ajaxparams = { 	iface: "service",
				_act: "get_cities",
				region: self.reg.region.val() };
	    self.hideForm();
	    if(self.reg.region.val()==0){
		self.reg.ftoggler.hide();
	    }
	    self.reg.city.attr({disabled: "disabled"});
	    $.post('/ajax/',ajaxparams,function(data){self.answer(data)},"xml");
	}
    },
    showForm: function(){
	var self = this;
	if(self.params.city==1){
	    self.reg.city.hide();
	    self.reg.ftoggler.hide();
	    self.reg.cityadd.show();
	}
    },
    hideForm: function(){
	var self = this;
	if(self.params.city==1){
	    self.reg.city.show();
	    self.reg.ftoggler.show();
	    self.reg.cityadd.hide();
	    self.reg.cityname.val("");
	}
    },
    addCity: function(){
	var self = this;
	var cityname = self.reg.cityname.val();
	cityname = cityname.replace(/^\s*/g,"");
	cityname = cityname.replace(/\s*$/g,"");
	if(cityname!=""){
	    var ajaxparams = { 	iface: "service",
				_act: "add_city",
				region: self.reg.region.val(),
				cityname: cityname
			      };
	    self.hideForm();
	    self.reg.city.attr({disabled: "disabled"});
	    $.post('/ajax/',ajaxparams,function(data){self.answer(data)},"xml");
	}
    },
    answer: function(xml){
	var self = this;
	var iface = xml.getElementsByTagName("iface")[0];
        if(iface){
            switch(iface.getAttribute("act")){
		case "get_regions":
		    self.reg.region.parents("div.p:first").show();
		    self.reg.region.empty();
		    var def_option = document.createElement("option");
		    $(def_option).attr({
				    value: 0
				  })
				 .html("Выберите регион");
		    self.reg.region.append(def_option);
		    var regions = iface.getElementsByTagName("region");
		    var pseudo = 0;
		    for(var i=0; i<regions.length;i++){
			var option = document.createElement("option");
			$(option).attr({
					value: regions[i].getAttribute("id")
				       })
				 .html(regions[i].getAttribute("name"));
			self.reg.region.append(option);

			if(regions[i].getAttribute("pseudo")==1){
			    pseudo = regions[i].getAttribute("id");
			}
		    }
		    self.reg.region.removeAttr("disabled");
		    if(pseudo){
			self.reg.region.empty();
			var def_option = document.createElement("option");
			$(def_option).attr({
					value: pseudo,
					selected: 1
				       })
				 .html("Выберите регион");
			self.reg.region.append(def_option);
			self.reg.region.parents("div.p:first").hide();
		    }
		    if(self.params.city==1){
			self.reg.region.trigger("change");
		    }
                break;
                case "get_cities":
		    self.reg.city.empty();
		    var def_option = document.createElement("option");
			$(def_option).attr({
					value: 0
				       })
				 .html("Выберите город");
		    self.reg.city.append(def_option);
		    var cities = iface.getElementsByTagName("city");
		    for(var i=0; i<cities.length;i++){
			var option = document.createElement("option");
			$(option).attr({
					value: cities[i].getAttribute("id")
				       })
				 .html(cities[i].getAttribute("name"));
			self.reg.city.append(option);
		    }
		    self.reg.city.removeAttr("disabled");

                break;
		case "add_city":
		    self.reg.city.empty();
		    var def_option = document.createElement("option");
			$(def_option).attr({
					value: 0
				       })
				 .html("Выберите город");
		    self.reg.city.append(def_option);
		    var cities = iface.getElementsByTagName("city");
		    for(var i=0; i<cities.length;i++){
			var option = document.createElement("option");
			var id = cities[i].getAttribute("id");
			$(option).attr({
					value: id
				       })
				 .html(cities[i].getAttribute("name"));
			self.reg.city.append(option);
			if(cities[i].getAttribute("checked")){
			    self.reg.city.val(id)
			}
		    }
		    self.reg.city.removeAttr("disabled");
                break;
            }
        }
    }
}
/* ------------------------------- */

/* прототип для создания UI выбора даты */
/*
    Параметры:
	caller - кто вызывает объект на создание
	sdom - куда помещать всплывалку
	dom - куда помещать selectы для выбора даты (jquery expression)
	params - различные параметры.
	    day - установленный день
	    month - установленный месяц
	    year - установленный год
	    minYear - минимальный год
	    maxYear - максимальный год
	    show_day - создавать ли селект под дату
	    show_month - создавать ли select под месяц
	    show_year - создавать ли селект под год

*/
function DateSelector(caller,sdom,dom,params){
    this.name = "Date Selector v.1";
    if(dom){
	this.caller = caller;
	this.sdom = $(sdom);
	this.dom = $(dom);


	var date = new Date;
	this.params = {
			day: 0,
			month: 0,
			year: 0,
			minYear: date.getFullYear()-100,
			maxYear: date.getFullYear(),
			show_day: 1,
			show_month: 1,
			show_year: 1
			}
	this.els = {
		    day: null,
		    month: null,
		    year: null,
		    control: null,
		    ul: null
		    }
	for (var key in params){
	    this.params[key] = params[key];
	}

	if(this.params.show_day){
	    this.monthNames = new Array("Месяц","Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Октября","Ноября","Декабря");
	}else{
	    this.monthNames = new Array("Месяц","Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь");
	}

	/*this.monthNamesEnds = new Array("Месяц","Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Октября","Ноября","Декабря");
	this.monthNames = new Array("Месяц","Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь");*/
	this.monthDays = new Array(31,31,28,31,30,31,30,31,31,30,31,30,31);

	this.start();
    }


}

DateSelector.prototype = {
    start: function(){
	var self = this;

	// создаем select для выбора дня
	if(self.params.show_day){
	    var input = document.createElement("input");
	    input.name = "day_inp";
	    input.type = "text";
	    self.dom.append(input);
	    self.els.day = $(input);
	    if(self.params.day==0){
		self.els.day.val("День");
	    }else{
		self.els.day.val(self.params.day);
	    }
	    self.els.day.attr("readonly","true");

	    self.els.day.click(function(){ self.show("day");  })
	    self.els.day.shown = false;

	}
	// ---------------------------------

	// создаем select для выбора месяца
	if(self.params.show_month){
	    var input = document.createElement("input");
	    input.name = "month_inp";
	    input.type = "text";
	    self.dom.append(input);
	    self.els.month = $(input);
	    self.els.month.val(this.monthNames[self.params.month]);
	    self.els.month.attr("readonly","true");

	    self.els.month.click(function(){ self.show("month"); })
	    self.els.month.shown = false;
	}
	// ---------------------------------

	// создаем select для выбора года
	if(self.params.show_year){
	    var input = document.createElement("input");
	    input.name = "year_inp";
	    input.type = "text";
	    self.dom.append(input);
	    self.els.year = $(input);
	    if(self.params.year==0){
	        self.els.year.val("Год");
	    }else{
	        self.els.year.val(self.params.year);
	    }
	    self.els.year.attr("readonly","true");
	    self.els.year.click(function(){ self.show("year"); })
	    self.els.year.shown = false;
	}
	// ---------------------------------

	// создаем всплывалку
	var div = document.createElement("div");
	div.className = "select-control";
	//self.sdom.append(div);
	$(document.body).append(div);
	self.els.control = $(div);
	var ul = document.createElement("ul");
	self.els.control.append(ul);
	self.els.ul = $(ul);
	$("li",self.els.ul).live("click",function(e){
					    e.cancelBubble = true;
					    self.check(this);
					})
			   .live("mouseover",function(){
						$(this).addClass("active");
					    })
			   .live("mouseout",function(){
						$(this).removeClass("active");
					    });
	self.els.control.shown = false;
	self.els.control.caller = null;
	// ---------------------------------
    },
    show: function(type){
	var self = this;
	var caller = null;
	switch(type){
	    case "day":
		caller = self.els.day;
	    break;
	    case "month":
		caller = self.els.month;
	    break;
	    case "year":
		caller = self.els.year;
	    break;
	}
	var reshow = true;
	if(self.els.control.shown == true){
	    self.els.ul.empty();
	    self.els.control.hide();
	    self.els.control.shown = false;
	    if(self.els.control.caller==caller){
		reshow = false;
	    }
	    self.els.control.caller.removeClass("sel-shown");
	    self.els.control.caller = null
	}
	if(reshow){
	    var position = caller.offset();
	    position.top = position.top + caller.height();
	    self.els.control.css({top: position.top + "px",
				   left: position.left + "px",
				   width: caller.width()+"px"});
	    self.els.control.show();
	    self.els.control.shown = true;
	    self.els.control.caller = caller;
	    self.els.control.caller.addClass("sel-shown");
	    switch(type){
		case "day":
		    self.els.ul.append("<li>День</li>");
		    for(i=1; i<=this.monthDays[self.params.month];i++){
			self.els.ul.append("<li>"+i+"</li>");
		    }
		break;
		case "month":
		    for(i=0; i<=12;i++){
			self.els.ul.append("<li>"+self.monthNames[i]+"</li>");
		    }
		break;
		case "year":
		    self.els.ul.append("<li>Год</li>");
		    for(i=self.params.maxYear; i>=self.params.minYear; i--){
			self.els.ul.append("<li>"+i+"</li>");
		    }
		break;
	    }

	}
    },
    check: function(el){
	var self = this;
	self.els.control.caller.val(el.innerHTML);
	switch(self.els.control.caller.attr("name")){
	    case "day_inp":
		self.params.day = parseInt(el.innerHTML);
		if(isNaN(self.params.day)) self.params.day = 0;
		break;
	    case "month_inp":
		for(var i=0; i<self.monthNames.length;i++){
		    if(el.innerHTML==self.monthNames[i]){
			self.params.month = i;
		    }
		}
		if((self.params.show_day)&&(self.params.day>self.monthDays[self.params.month])){
		    self.params.bday = 0;
		    self.els.day.val("День");
		}
		break;
	    case "year_inp":
		self.params.year = parseInt(el.innerHTML);
		if(isNaN(self.params.year)) self.params.year = 0;
		break;
	}
	self.hide();
    },
    hide: function(){
	var self = this;

	self.els.ul.empty();
	self.els.control.hide();
	self.els.control.shown = false;
	self.els.control.caller.removeClass("sel-shown");
	self.els.control.caller = null;
    },
    clean: function(){
	var self = this;
	self.dom.empty();
	self.params = null;
	self.els = null;
    }

}

/* ------------------------------- */

/* Обертка для работы с друзьями */

Interface.InitFriends = function(){
    var friends = new Friends();
}

function Friends(){
    this.name = "Friends v.1";
    this.friends = $("#uf_requests");
    this.loading = 0;
    this.user = null;
    if(this.friends.length>0){
	this.start();
    }
}

Friends.prototype = {
    start: function(){
	var self = this;
	self.friends.find(".req-ctrl a").each(function(){ $(this).click(function(){ self.action(this); return false; }); });
    },
    action: function(el){
	var self = this;
	if(!self.loading){
	    var action_type = el.href.split("#")[1];
	    var user_id = el.parentNode.parentNode.id.split("_")[1];
	    self.user = el.parentNode.parentNode;
	    $(el.parentNode).empty().addClass("loading");
	    self.loading = 1;
	    var ajaxparams = { iface: "service",
			       _act: action_type + "_friend",
			       user_id: user_id };

	    $.post('/ajax/',ajaxparams,function(data){self.answer(data)},"xml");
	}
    },
    answer: function(xml){
	var self = this;
	var iface = xml.getElementsByTagName("iface")[0];
	self.loading = 0;
        if(iface){
            switch(iface.getAttribute("act")){
                case "agree_friend":
		    var tr = self.user.parentNode;
		    $(self.user).remove();
		    self.test(tr);
		    window.location.reload(true);
                break;
		case "deny_friend":
		    var tr = self.user.parentNode;
		    $(self.user).remove();
		    self.test(tr);
                break;
	    }
	}
    },
    test: function(tr){
	var self = this;

	var otd = $(tr).find("td");
	if(otd.hasClass("nbsp")){ otd.remove(); }

	var tbody = tr.parentNode;
	if(tr.children.length==0){ $(tr).remove(); }
	if(tbody.children.length==0){
	    $(tbody.parentNode.parentNode).remove();
	}
    }
}
/* ------------------------------- */

/* Обертка для работы с личными сообщениями */

Interface.InitMessages = function(type){
    var messages = new Messages(type);
}

function Messages(type){
    this.name = "Messages v.1";
    this.messages = $("#pers_messages");
    this.nomessages = $("#no-messages");
    this.loading = 0;
    this.answering = 0;
    this.need_close = 0;
    this.type = type;
    this.message = null;
    if(this.messages.length>0){
	this.start();
    }
}

Messages.prototype = {
    start: function(){
	var self = this;
	self.messages.find(".mess-item .mess-item-head").each(function(){
								  $(this).click(function(){
								      self.show(this);
								  });
							      });
	self.messages.find(".mess-item .mess-item-control a").each(function(){
								  $(this).click(function(){
								      self.action(this); return false;
								  });
							      });
    },
    show: function(el){
	var self = this;
	if((!self.loading)&&(!self.answering)){
	    if(($(el).hasClass('unread'))&&(self.type == "inbox")){
	        $(el).removeClass('unread');
	        var ajaxparams = {  iface: "messages",
				    _act: "read_message",
				    mes_id: el.parentNode.id};
	        $.post('/ajax/',ajaxparams,function(data){self.answer(data)},"xml");
	    }
	    if((self.message) && (el.parentNode!=self.message)){
		if(self.need_close==1){
		    self.close();
		}
	        $(self.message).removeClass("mess-read").removeClass("current_message");
	        self.message = null;
	    }
	    self.message = el.parentNode;
	    $(self.message).addClass("current_message").toggleClass("mess-read");
	}
    },
    action: function(el){
	var self = this;
	var action = el.href.split("#")[1];
	switch(action){
	    case "del":
	        if(window.confirm('Вы уверены что хотите удалить сообщение?')){
		    self.message = el.parentNode.parentNode;
		    var ajaxparams = {  iface: "messages",
					_act: "del_message",
					mes_id: self.message.id,
					type: self.type };
		    $(el.parentNode).addClass("loading");
		    el.parentNode.innerHTML = "";
		    self.loading = 1;
		    $.post('/ajax/',ajaxparams,function(data){self.answer(data)},"xml");
		}
            break;
	    case "reply":
		self.message = el.parentNode.parentNode;
		$(self.message).addClass("answering");
		self.answering = 1;

		var div = document.createElement('div');
		self.replyForm = div;
		self.replyForm.className = "mess-item-answer";

		var p = document.createElement('div');
		p.className = "answer-text";

		ptext = document.createElement('p');
		ptext.innerHTML = "Заголовок сообщения <span>*</span>";
		p.appendChild(ptext);

		var textarea = document.createElement('input');
		textarea.type = "text";
		textarea.value = "Re: "+$(self.message).find(".mi-title").html();
		p.appendChild(textarea);
		self.replyForm.appendChild(p);

		ptext = document.createElement('p');
		ptext.innerHTML = "Текст сообщения <span>*</span>";
		p.appendChild(ptext);

		var textarea = document.createElement('textarea');
		p.appendChild(textarea);
		self.replyForm.appendChild(p);

		var send = document.createElement('input');
		send.type = "button";
		send.value = "Отправить";
		self.replyForm.appendChild(send);
		$(send).click(function(){ self.send(); });

		var close = document.createElement('input');
		close.type = "button";
		close.value = "Отмена";
		self.replyForm.appendChild(close);
		$(close).click(function(){ self.close(); });

		self.message.appendChild(self.replyForm);
	    break;
	}
    },
    close: function(){
	var self = this;
	$(self.message).removeClass("answering");
	$(self.replyForm).remove()
	self.replyForm = null;
	self.answering = 0;
	self.need_close = 0;
    },
    send: function(){
	var self = this;
	if(!self.loading){
	    var mess_title = $(self.replyForm).find("input[type='text']").val();
	    var message = $(self.replyForm).find("textarea").val();

	    mess_title = mess_title.replace(/^\s*/g,"");
	    mess_title = mess_title.replace(/\s*$/g,"");

	    message = message.replace(/^\s*/g,"");
	    message = message.replace(/\s*$/g,"");

	    if((message!="")&&(mess_title!="")){
		var ajaxparams = {  iface: "messages",
				_act: "reply_message",
				mes_id: self.message.id,
				mess_title: mess_title,
				message: message};
		$.post('/ajax/',ajaxparams,function(data){self.answer(data)},"xml");
		self.loading = 1;
		$(self.replyForm).empty();
		$(self.replyForm).addClass("loading");

	    }else{
		alert("Не заполнены обязательные поля!");
	    }
	}
    },
    answer: function(xml){
	var self = this;
	var iface = xml.getElementsByTagName("iface")[0];
	self.loading = 0;
        if(iface){
            switch(iface.getAttribute("act")){
		case "del_message":
		    $(self.message).remove();
		    self.message = null;
		    if(self.messages.find(".mess-item").length==0){
			self.nomessages.removeClass("hidden");
		    }
                break;
		case "reply_message":
		    $(self.replyForm).removeClass("loading");
		    $(self.replyForm).append("<span class='mi-sent'>Сообщение отправлено</span>").click(function(){ self.close(); });
		    self.answering = 0;
		    self.need_close = 1;
		    //$(self.replyForm).append("<span class='mi-sent'>Сообщение отправлено</span>").click(function(){ self.close(); });
		    //self.close();
                break;
	    }
	}
    }
}
/* ------------------------------- */

/* Прототип для управления комментариями */
Interface.InitComments = function(options){
    var commentsManager = new CommentManager(options);
}

/**
 * Менеджер комментариев
 * Параметры:
 * 	type - тип комментария (нужен для обработки на сервере)
 * 	outer_id - наименование внешнего id к которому привязывается комментарий
 * Теоретически абстрактный класс в вакууме для генерации древовидных комментариев
 * Для достижения полной нирваны можно еще что-нибудь подкрутить (передачу имен классов и id например)
 */
CommentManager = function(options) {
    this.name="Comment Manager v.4";
    this.type = options.type||"topic";
    this.outer_id = options.outer_id||"topic_id";
    this.lastCalled = null;
    this.lastApproved = null;
    this.params = { };
    this.inputs = new Array();
    this.loading = false;
    this.start();
}

CommentManager.prototype = {
    start: function(){
        var self = this;
	self.commentsCore = $("#commentsCore");
	self.commentsForm = $("#commentsForm");
        self.commentsCont = $("#commentsCont");
	self.commentsCore.addClass("showAnswer");
	self.commentsCont.find("a.ml").live("click",function(){ self.showForm(this); return false; });
	self.commentsCont.find("a.ch-b").live("click",function(){ self.commAction(this); return false; });
        self.commentsCont.find("form input[type='submit']").live("click",function(){ self.checkForm(); return false;})
	self.element_id = self.commentsForm.find("form").attr("id").split("_")[1];
    },
    commAction: function(el){
	var self = this;
	if(!self.loading){
	    var allow_action = 0;
	    self.lastApprowed = el.parentNode;
	    var action = el.href.split("#")[1];
	    if((action == "deny")&&(window.confirm('Вы уверены что хотите удалить комментарий?'))){
		allow_action = 1;
	    }
	    if(action == "agree"){ allow_action = 1; }
	    if(allow_action==1){
		var comment_id = self.lastApprowed.parentNode.parentNode.id.split("_")[1];
		self.params = {
				iface: "comments",
				_act: action,
				comment_id: comment_id,
				_com_type: self.type
				};
		self.params[self.outer_id] = self.element_id;
		$(self.lastApprowed).addClass("comment-action");
		self.loading = true;
		$.post('/ajax/',self.params,function(data){self.answer(data)},"xml");
	    }
	}
    },
    showForm: function(el){
        var self = this;
        if(self.lastCalled != el){
            self.commentsForm.remove();
            self.commentsForm.appendTo($(el).parent().parent());
            self.lastCalled = el;
	    self.commentsForm.find("textarea").val("");
        }
    },
    checkForm: function(){
        var self = this;
	if(!self.loading){
	    var parent_id = self.commentsForm.parent().parent().attr("id").split("_")[1];
	    var comment = self.commentsForm.find("textarea").val();
	    if(comment == ''){
		alert('Не заполнены обязательные поля!');
	    }else{
		self.params = {
			    iface: "comments",
			    _act: "add",
			    parent_id: parent_id,
			    comment: comment,
			    _com_type: self.type
			  };
		self.params[self.outer_id] = self.element_id;
		self.loading = true;
		self.commentsForm.addClass("sending-comment");
		$.post('/ajax/',self.params,function(data){self.answer(data)},"xml");
	    }
	}
    },
    answer: function(xml){
        var self = this;
        var iface = xml.getElementsByTagName('iface')[0];
	self.loading = false;
	self.commentsForm.removeClass("sending-comment");
        if(iface){
	    switch(iface.getAttribute("act")){
		case "add":
		    self.commentsForm.find("textarea").val("");
		    $("#cid_1 a.ml").click();
		break;
		case "agree":
		    $(self.lastApprowed).removeClass("comment-action");
		    $(self.lastApprowed.parentNode.parentNode).find(".c-h:first .ch-b").remove();
		break;
		case "deny":
		    $("#cid_1 a.ml").click();
		    $(self.lastApprowed.parentNode.parentNode).remove();
		break;
	    }
	    var comments = iface.getElementsByTagName("comment");
	    for(var i=0;i<comments.length; i++){
		var parent_id = comments[i].getAttribute("for_id");
		var parent;
		if(parent_id==1){
		    parent = self.commentsCore;
		}else{
		    parent = $("#cid_"+parent_id);
		}
                var commentDom = parent.find(".comments:first");
                if(commentDom.length==0){
                    parent.append($("<ul class='comments'>").append(textContent(comments[i])));
                }else{
		    commentDom.append(textContent(comments[i]));
                }
	    }
        }
    }
}

Interface.Testing = function(){
    var form = null;
    var res = null;

    var uplform = null;

    function _check(){
	var value = true;
	form.find(".t-qw-err").removeClass("t-qw-err");
	form.find(".t-qw").each(function(){
		var answer = $(this).find("input:checked");
		if(answer.length==0){
		    value = false;
		    $(this).addClass("t-qw-err");
		}
	    });
	if(!value){ alert("Вы не ответили на все вопросы"); }
	return value;
    }

    return {
	show: function(el){
	    if(!form){
		form = $(el.parentNode).find('form');
		form.submit(function(){ return _check(); });
	    }
	    if(form.length>0){
		form.animate({height: "toggle"},300);
		$(el).toggleClass("disabled");
	    }
	},
	showRes: function(el){
	    if(!res){
		res = $(el.parentNode.parentNode).find('.p-lu-results');
	    }
	    if(!el.shown){
		el.shown = true;
		el.innerHTML = "Скрыть";
	    }else{
		el.shown = false;
		el.innerHTML = "Показать";
	    }
	    res.animate({height: "toggle"},300);
	},
	showUpl: function(el){
	    if(!uplform){
		uplform = $(el.parentNode).find('form');
	    }
	    if(uplform.length>0){
		uplform.animate({height: "toggle"},300);
		$(el).toggleClass("disabled");
	    }
	}
    }
}();

/* Обработчик для формы отклонения заявки */
Interface.toggleRefuseForm = function(el){
	if(!el.form){
	    el.form = $(el.parentNode.parentNode).find('div form');
	    el.form.submit(function(){
		    if(this.refuse_reason.value == ''){
			alert("Укажите причину отклонения заявки");
			return false;
		    }else{
			return true;
		    }
		})
	}
	if(!el.shown){
	    el.shown = true;
	    el.innerHTML = "Скрыть";
	 }else{
	    el.shown = false;
	    el.innerHTML = "Отклонить";
	}
	el.form.parent().animate({height: "toggle"},300);

}
/* ------------------------------- */


Interface.UserNews = function(){
    this.name = "Messages v.1";
    this.news = $("#user_news");
    this.start();
}

Interface.UserNews.prototype = {
    start: function(){
	var self = this;
	self.news.find(".sb-news .sb-n-title").each(function(){
							$(this).click(function(){
							    self.show(this);
							});
						    });
    },
    show: function(el){
	var self = this;
	if((self.message) && (el.parentNode!=self.message)){
	    $(self.message).removeClass("sb-cur").removeClass("sb-read");
	    self.message = null;
	}
	self.message = el.parentNode;
	$(self.message).addClass("sb-cur").toggleClass("sb-read");
    }
}

/* ----------------------------------- */

/**
 * Управление статусами (должностью) пользователя
 */

Interface.UserStatus = function(){

    var $container = null;
    var $text = null;
    var $controls = null;
    var $input = null;

    var user_id = null;

    /**
     *	Подготовка места для редактирования
     */
    function prepare(){
	$controls = $(document.createElement("div"))
			.addClass("ps-cntr")
			.appendTo($container);
	var edit = $(document.createElement("span"))
			.addClass("ps-edit")
			.html("[Изменить должность]")
			.appendTo($controls);
	edit.click(function(){ show(); });

	var del_b = $(document.createElement("span"))
			.addClass("ps-hd")
			.html("Удалить")
			.appendTo($controls);
	del_b.click(function(){ del(); });

	var cancel = $(document.createElement("span"))
			.addClass("ps-hd")
			.html("Отмена")
			.appendTo($controls);
	cancel.click(function(){ hide(); });

	var div = $(document.createElement("div"))
		    .addClass("ov")
		    .appendTo($container);
	$text = $container.find(".ps-text");
	$text.appendTo(div);

	$input = $(document.createElement("input"))
		    .addClass("ps-input")
		    .attr({type: "text"})
		    .appendTo(div);
	$input.keypress(function(e){ keypress(e); });
    }

    /**
     *
     */
    function keypress(e){
        var event = window.event?window.event:e;
        var keyCode = event.keyCode;
        if (!keyCode) { keyCode = event.charCode; }
        if (keyCode==13) {
            try { send(); } catch(err) { alert(err); }
        }
    }

    /**
     *	Показываем текстовое поле для редактирования
     */
    function show(){
	$controls.addClass("ps-cntr-sh");
	$text.hide();
	$input.show();
	$input.val($text.html());
    }

    /**
     *	Скрываем текстовое поле для редактирования
     */
    function hide(){
	$controls.removeClass("ps-cntr-sh");
	$input.hide();
	$text.show();
    }

    function send(){
	$.post('/ajax/',{ iface: "service",
			  _act: "change_state",
			  user_id: user_id,
			  status: $input.val()},
			  function(data){ $text.html($input.val());
					  hide();},
			"xml");
    }

    function del(){
	$.post('/ajax/',{ iface: "service",
			  _act: "del_state",
			  user_id: user_id},
			  function(data){ $text.html("");
					  hide();
					  },
			"xml");
    }

    return {
	init: function(selector,uid){
	    user_id = uid;
	    $container = $(selector);
	    if($container.length>0){
		prepare();
	    }
	}
    }
}();

