/* ==========================[ Simple Functions ]============================ */
function getrandom(min,max){
	max++;
	var range = max - min;
  	var n=Math.floor(Math.random()*range) + min;
  	return n;
}
function clone(object){
    if (typeof(object)!="object") return object;
    var newObject=object.constructor();
    for (var objectItem in object) {
        newObject[objectItem] = clone(object[objectItem]);
    }
    return newObject;
}
function trim(s){
  	return s.replace(/(^\s+)|(\s+$)|(^\n+)/g, "");
}
function smartTrim(s){
  	var str=s.replace(/(^\s+)|(\s+$)|(^\n+)/g,"");
	str=str.replace(/(\s+,+)/g,",");
	str=str.replace(/(,+\s+)/g,",");
	return str;
}
function isAlfabet(s){
  	var reg=/[a-zа-я]/i
  	return reg.test(s);
}
function deff(string){
  	string=string.replace(/(^\s+)|(\s+$)/g, "");
  	string=string.replace(/</g,"&lt;");
  	string=string.replace(/>/g,"&gt;");
  	return string;
}
function undeff(string){
	string=string.replace(/(^\s+)|(\s+$)/g,"");
  	string=string.replace(/&lt;/g,"<");
  	string=string.replace(/&gt;/g,">");
	return string;
}
function pregetimage(list){
	var images=new Array;
	for (var i=0, length=list.length;i<length;i++){
		images[i]=new Image();
		images[i].src="/images/"+list[i];
	}
}
var empty_function=function(){
  	return true;
}
function sendToEnter(event){
	var child=$(this);
	if (event.which==13){
		$(this).submit();
		if (IE) $(this).parent().submit();
	}
}
function getStrFromArray(arr){
	return arr.toString();
}
function getArrayFromStr(str){
	str=smartTrim(str);
	var arr=str.split(",");
	return arr;
}
function getBodyScrollTop(){
  return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
}
function getBodyScrollLeft(){
  return self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
}
function getClientWidth()
{
  return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;
}
function getClientHeight()
{
  return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
}

/* ==========================[ End: Functions ]=========================== */
/* ============================[ Messages ]============================= */
var messages={};
messages.task={
   	movesave:"Изменения сохранены",
	taskcreate:"Изменения сохранены",
	errorinserver:"Ошибка. Изменения не сохранены",
	errorinconnect:"Ошибка при подключении к серверу"
};
messages.ideas={
    addsuccess:"Спасибо за идею. Сейчас мы отправили ее модераторам сайта, они ее быстро проверят, и вы скоро сможете увидеть ее в списке.",
	errorinform:"Оба поля обязательны для заполнения"
}
var clr={
  	err:"#fd9",
  	good:"#9f9",
  	nan:"#eef;"
}
var loading_tmp='<div style="display: none;" id="loading"><img src="/images/ajax-loader-small.gif" alt="Сохранение..."/></div>';
var message_block;
var idmessage={
	"ok":"notice",
	"error":"error"
}
var loading;
/* -- Initialization function -- */
function message_init(){
	message_block=$("#messages").append(loading_tmp);
	loading=$("#loading");
}
/* -- Work function -- */
function message_show(answer){
	if (queue.length==1 || queue.length==0){
		var tmp='<div id="'+idmessage[answer.status]+'">'+answer.msg+'</div>';
		message_block.empty().append(tmp);
	}
}
function message_hide(){
	message_init();
}
/* =========================[ End: Messages ]=========================== */
/* ============================[ Pages ]============================== */
/* --- Settings --- */
var defaultColorize={
	"today":false,
	"tomorrow":false,
	"week":true,
	"next_week":true,
	"chaos":true
}
/* --- Initializations --- */
var page;
var conf={};
conf.shuffle=true;
conf.allowTags=false; // default
var IE=false;
var url={};
var slc={}; // selectors
var cash={};
// active elements
var popup;
var newtaskform;
// end
$(init);
function init(){
	if (page=="plan"){
	  	init_changetabwd();
	  	tabs_cash();
	  	$(".onetab").smartArea();
	  	if (!conf.shuffle){
    		taskstoweek+=', .taskforweek';
    		taskstonextweek+=', .taskfornextweek';
			taskstochaos+=', .taskforchaos';
  		}
  		tabs["today"].colorize=defaultColorize["today"];
		tabs["tomorrow"].colorize=defaultColorize["tomorrow"];
		tabs["week"].colorize=defaultColorize["week"];
		tabs["next_week"].colorize=defaultColorize["next_week"];
		tabs["chaos"].colorize=defaultColorize["chaos"];
		if (conf.allcolorize){
			tabs["today"].colorize=true;
			tabs["tomorrow"].colorize=true;
		}
  		setPriority();
  		initDrag(tabs["week"].obj.find(".task"));
		initDrag(tabs["next_week"].obj.find(".task"));
		initDrag(tabs["chaos"].obj.find(".task"));
		
		$("#today_link").click(changetabwd);
		$("#tomorrow_link").click(changetabwd);
		$("#week_link").click(changetabwd);
		$("#next_week_link").click(changetabwd);
		  
		createsortable(tabs["today"].obj);
		createsortable(tabs["tomorrow"].obj);
		  
		linksToDrop($('#today_link'),taskstotoday);
		linksToDrop($('#tomorrow_link'),taskstotomorrow);  
		linksToDrop($('#week_link'),taskstoweek);
		linksToDrop($('#next_week_link'),taskstonextweek);
		
		initdroptosortable(tabs["today"].obj,taskstotoday);
		initdroptosortable(tabs["tomorrow"].obj,taskstotomorrow);
		  
		createdropable(tabs["week"].obj,taskstoweek);
		createdropable(tabs["next_week"].obj,taskstonextweek);
		createdropable(tabs["chaos"].obj,taskstochaos);
		refreshcounters();
	}
	if (page=="today"){
		var place_name="today";
		tabs[place_name]={};
		tabs[place_name].obj=$("#content").find(tabs_prefix+place_name);
		tabs[place_name].colorize=defaultColorize["today"];
		if (conf.allcolorize){
			tabs["today"].colorize=true;
		}
		setPriority(place_name);
  		$(".onetab").smartArea();
  		createsortable(tabs[place_name].obj);
		initexport();
  	}
	if (page=="today" || page=="plan"){
		queue.init();
		$(".task").exNote();
		initNoteLabels();
		tagsInit();
		popup=new mypopup();
		popup.init();
	}
	if ($("#new_task_form").length>0){
		newtaskform=new exeditfield({"def":$("#task_kind").val()});
		newtaskform.init();
		pregetimage(["printer.png","triangle2.png","archive2.png","rss.png",
    "icons/sexy_flash/info.png","icons/sexy_flash/error.png",
    "icons/sexy_flash/warning.png"]);
	} 
	if (page=="login"){
		login_init();
		registerForm.init();
	} else if (page=="archive"){
		achive.init(".sortedLink");
	} else if (page=="blog_show"){
		commentForm.init();
	}
	if(page!="blog_show"){
		message_init();
	}
}
/* --- Different Functions --- */
var commentForm={
	containerId:"comment_form",
	init:function(){
		var pars={
			data:"flag=true",
			url:commentForm.url,
			complete:commentForm.showForm
		} 
		sendRQ(pars);
	},
	showForm:function(anwer){
		var tpl=anwer.responseText;
		commentForm.container=$("#"+commentForm.containerId);
		commentForm.container.append(tpl);
		commentForm.container.find("form").submit(commentForm.sendComment);
	},
	sendComment:function(){
		if ($("#blog_comment_body").val()){
			commentForm.changeForm("sendRQ");
			var form=$(this);
			var pars={
				data:form.serialize(),
				url:form.attr("action"),
				success:commentForm.addComment
			}
			sendRQ(pars);
		} else {
			commentForm.showError("Вы забыли ввести комментарий.")
		}
		return false;
	},
	addComment:function(answer){
		eval("var data="+answer);
		if (data.status=="ok"){
			$("#comments").append(data.html);
			$("#blog_comment_body").val("");
		} else {
			commentForm.showError(data.msg);
		}
		commentForm.changeForm("completeRQ");
	},
	changeForm:function(status){
		if (status=="sendRQ"){
			$('#loading').show();
			$("#blog_comment_submit").attr("disabled","disabled").hide();
			$("#blog_comment_body").hide();
			$("#messages").empty();
			$("#new_blog_comment").find("label").hide();
		} else {
			$('#loading').hide();
			$("#blog_comment_submit").attr("disabled","").show();
			$("#blog_comment_body").show();
			$("#new_blog_comment").find("label").show();
		}
	},
	showError:function(textError){
		$("#messages").append('<div class="error">'+textError+'</div>')
	}
}
var registerForm={
	init:function(){
		$("#new_user").submit(registerForm.register);
	},
	register:function(){
		var form=$(this);
		var email=$("#new_user_email").val();
		if (email.length>3){
			var pars={
				url:'/users',
				data:form.serialize(),
				success:registerForm.endRegister
			}
			registerForm.startRQ();
			sendRQ(pars);
		} else {
			if (email.length==0){
				registerForm.showMsg({msg:"Введите свой e-mail",status:"error"})
			} else {
				registerForm.showMsg({msg:"E-mail не может быть короче 3-х символов",status:"error"})
			}
		}
		return false;
	},
	endRegister:function(answer){
		registerForm.finishRQ();
		registerForm.showMsg(answer)
	},
	showMsg:function(message){
		if (typeof(message)=="string"){
			$("#result").empty().append(message);
		} else {
			$("#result").empty().append(message.msg);
		}
	},
	startRQ:function(){
		$("#big_loading").show();
	},
	finishRQ:function(){
		$("#big_loading").hide();
	}
}
/* Переключение вкладок 2.0 */
function jsTabs(userOptions,links,tabs){
	jQuery.extend({
		cache:false,
		callback:false,
		openClass:"openTab"
	}, userOptions);
	
	function clickToTab(){
		var item=$(this);
		links.filter("."+options.openClass).removeClass(options.openClass);
		item.addClass(options.openClass);
		if (options.cache){
			tabs.hide();
			tabs[item.attr("href")].show();
		}
		if (options.callback) options.callback(item);
	}	
}
jsTabs.prototype={
	init:function(){
		if (tabs){
			options.cache=true;
			links.click(clickToTab);
		}
	}
}
jsTabs.prototype.costil=function(item){

}
/* Переключение вкладок с предварительным описанием */
var day_parent;
var week_parent;
var tabs_description;
function init_changetabwd(){
	day_parent=$("#day_menu").parent();
	week_parent=$("#weektd");
	tabs_description={
		"today_link":{
	  		parent:day_parent,
	  		number:1
		},
		"tomorrow_link":{
	  		parent:day_parent,
	  		number:2
		},
		"week_link":{
	  		parent:week_parent,
	  		number:1
		},
		"next_week_link":{
	  		parent:week_parent,
	  		number:2
		}
	}
}
function changetabwd(){
	var id=this.id;
	tabs_description[id].parent.removeClass().addClass("opentab"+tabs_description[id].number);
	return false;
}
/* ===[ Страница приветствия ]=== */
function seconds(pars){
	this.id=pars.id;
	this.el=$(pars.id);
	this.count=pars.count || 1;
}
seconds.prototype={
	start:function(){
		var block=this;
		setInterval(function(){block.setseconds()}, 1000); 
	},
	setseconds:function(){
		var template='<span>';
		if (this.count>=200){
			template='<span style="color:#f44">';
		}
		template+=this.count+'</span> '+this.getword(this.count);
		$(this.id).html(template);
		this.count++;
	},
	getword:function(a){
		var mod=a % 100;
		var word="секунд";
		if (mod<10 || mod>20){
			mod=mod % 10;
			switch (mod){
				case 1: word="секунду"; break;
				case 2: word="секунды"; break;
				case 3: word="секунды"; break;
				case 4: word="секунды"; break;
				default : word="секунд"; break;
			}
		}
		return word;
	}
}
function clock(id){
	this.id=id;
	this.el=$(id);
	this.months=["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"];
}
clock.prototype={
	start:function(){
		this.settime();
		var block=this;
		setInterval(function(){block.settime()}, 30000); 
	},
	settime:function(){
		var date=new Date();
		month=this.months[date.getMonth()];
		var hours=""+date.getHours();
		var minutes=""+date.getMinutes();
		if (hours.length==1)
			hours="0"+hours;
		if (minutes.length==1)
			minutes="0"+minutes;	
		var template=date.getDate()+" "+month+'&nbsp;'+date.getFullYear()+'&nbsp;года <br/>'+hours+':'+minutes+',';
		$(this.id).html(template);
	}
}
function showregister(){
	$('#register').show('drop',{direction:'up'}); 
	$('#register_link').replaceWith('\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0439\u0441\u044f');
}
/* Форма логина */
function login_init(){
	var form=$("#user_login");
	form.submit(user_login);
} 
function user_login(){
	var user=$(this).serializeArray();
	rq_UserLogin(user);
	return false;
}
url.login='/user_session.json';
function rq_UserLogin(user){
	message_hide();
	pars={
		data:user,
		url:url.login, 
		success:user_login_c
	}
	sendRQ(pars);
}
function user_login_c(string){
	eval("var answer="+string);
	if (answer.status=="ok"){
		document.location=answer.url;
	}
	if (answer.status=="error"){
		message_show(answer);
	}
}
/* Переход после регистрации */
function startwork(){
  $(".stickers_s").hide();
  setTimeout(function() {window.location = '/tasks'},5800);
  $(".stickers").animate({"top":"50em"},1800,function(){ $(".stickers").css({"display":"none"})});
}
/* ===[ Tabs ]=== */
var tabs={};
var tabs_prefix="#tasks_for_";
var links_postfix="_link";
var tabs_counter_slc=" .counter";
var tabs_names=["today","tomorrow","week","next_week","chaos"];
var tabs_task_classes={
	"today":"taskfortoday",
	"tomorrow":"taskfortomorrow",
	"week":"taskforweek",
	"next_week":"taskfornextweek",
	"chaos":"taskforchaos"
};
function tabs_cash(){
	var wrap=$("#content");
	for (var i=0,length=tabs_names.length;i<length;i++){
		tabs[tabs_names[i]]={};
		tabs[tabs_names[i]].obj=wrap.find(tabs_prefix+tabs_names[i]);
		tabs[tabs_names[i]].counter=wrap.find("#"+tabs_names[i]+links_postfix).find(tabs_counter_slc);
	}
}
/* ===[ Страница Сегодня ]===*/
/* Экспорт */
function initexport(){
  $('#export_link').toggle(
    function(){
	   $(this).css({"background-image":"url('/images/triangle1.png')"});
	   $('#export_links').toggle();
	},
	function(){
	   $(this).css({"background-image":"url('/images/triangle2.png')"});
       $('#export_links').toggle();	   
	}
  );
}
/* ===[ Страница архива ]=== */
/* --- Events --- */
function tasksremove(){
	var selectedInputs=$("input:checked")
  	if (selectedInputs.length!=0){
  		var selectedTasks=selectedInputs.parent();
   		if (confirm('Вы уверены, что хотите удалить эти задания навсегда?')) {
      		var list=$("#archivetasks").serialize();
      		saveTaskDeleteFromArchive(selectedTasks,list);
    	}
  	}
}
function tasksrecover(){
  	if ($("input:checked").length!=0)
  	{
    	var par=$("#archivetasks").serialize();
		var tasks=$("#archivetasks").find("input:checked").parent()
    	sendRQ({
			"data":par+'&_method=put', 
			"tasks":tasks,
			"url":'/tasks/open/',
			"success":taskRecoverFinal
		});
  	}
	function taskRecoverFinal(answer){
			eval("var data="+answer);
			if (data.status="ok"){
				var parents=this.tasks.parent();
				this.tasks.effect("highlight").remove();
				for (var i=0,length=parents.length;i<length;i++){
					if ($(parents[i]).find(".task").length==0){
						$(parents[i]).remove();
					}
				}
			}
		}
}
/* --- Requests --- */
function saveTaskDeleteFromArchive(tasks,list){
	$.ajax({
		data:list+'&_method=delete', 
		dataType:'text', 
		tasks:tasks,
		type:'post', 
		url:'/tasks/mass_destroy/',
		success:taskRemove2
	});
}
/*  --- Callbacks --- */
function taskRemove2(answer){
	if (answer.status="ok"){
		var tasks=this.tasks;
		tasks.fadeOut(500);
		setTimeout(function(){
			var parents=tasks.parent();
			tasks.remove();
			for (var i=0,length=parents.length;i<length;i++){
				if ($(parents[i]).find(".task").length==0){
					$(parents[i]).remove();
				}
			}
		},501);
	} else {
		if (answer.status=="error"){
			message_show(answer);
		}
	}
}
/* ===[ Page Ideas ]=== */
url.ideas={};
url.ideas.positive=['/ideas/','/positive_vote']
url.ideas.negative=['/ideas/','/negative_vote']
function positivevotetoidea(id){ // will be refactoring
	var pars={
		data:'authenticity_token=' + encodeURIComponent(AUTH_TOKEN),
		idea_id:id,
		url:url.ideas.positive[0]+id+url.ideas.positive[1],
		success: vote
	}
	sendRQ(pars);
}
function negativevotetoidea(id){ // will be refactoring
	var pars={
		data:'authenticity_token=' + encodeURIComponent(AUTH_TOKEN),
		idea_id:id,
		url:url.ideas.negative[0]+id+url.ideas.negative[1],
		success: vote
	};
	sendRQ(pars);
}
function vote(answer){
	if (answer!="error"){
		var votes=answer;
		var id=this.idea_id;
		var classname=getratingclass(votes);
		$("#rate_"+id).removeClass();
		$("#rate_"+id).addClass(classname);
		$("#rate_"+id).text(votes);
		$("#idea_"+id+" .vote_n").hide();
		$("#idea_"+id+" .vote_p").hide();
		$("#idea_"+id+" .vote_n").attr("href","#");
		$("#idea_"+id+" .vote_p").attr("href","#");
	}
}
function getratingclass(votes){
	var classname="ratingp";
	if (votes==0) classname="rating";
	if (votes<0) classname="ratingn";
	return classname;
}
var timeOut="";
function addnewidea(idform){
	var text1=$("#idea_name").val();
	var text2=$("#idea_essence").val();
	if (isAlfabet(text2) && isAlfabet(text2)){
		$.ajax({
			data:$.param($(idform).serializeArray()), 
			dataType:'text',
			type:'post', 
			url:'/ideas',
			success:function(answer){
				if (answer=="ok"){
					$("#serveranswers_body").text(messages.ideas.addsuccess);
					$("#serveranswers").css({"background-color":clr.good}).show();
					timeOut=setTimeout(function(){$("#serveranswers").fadeOut("normal")},5000);
					$("#idea_name").val("");
					$("#idea_essence").val("");
				} else {
					$("#serveranswers_body").text(messages.ideas.errorinform);
					$("#serveranswers").css({"background-color":clr.err}).show();
					timeOut=setTimeout(function(){$("#serveranswers").fadeOut("normal")},2000);
				}	  
			},
			error: function(XMLHttpRequest, textStatus, errorThrown){
				$("#serveranswers_body").text(messages.ideas.errorinform)
				$("#serveranswers").css({"background-color":clr.err}).show();
				timeOut=setTimeout(function(){$("#serveranswers").fadeOut("normal")},2000);
			}
		}); 
	} else {
		$("#serveranswers_body").text(messages.ideas.errorinform)
		$("#serveranswers").css({"background-color":clr.err}).show();
		timeOut=setTimeout(function(){$("#serveranswers").fadeOut("normal")},2000);
	}
}
var templates="";
function close(id){
	$(id).hide();
	clearTimeout(timeOut);
}
/* ==========================[ End: Pages ]=========================== */
/* ============================[ Tasks ]============================= */
/* taskController */
var taskController={
	url:{
		"add":"",
		"remove":'/tasks/',
		"update":'/tasks/',
		"complete":'/tasks/complete/',
		"recover":"",
		"finalRemove":""
	},
	staff:{
		convert:function(task){
			var newTask={};
			for (var par in task){
				newTask['task['+par+']']=task[par];
			}
			return newTask;
		},
		renamePars:function(object){
			var nameRoot="task";
			var newObject={};
			for (var name in object) {
				if (object.hasOwnProperty(name)) {
					newObject[nameRoot+"["+name+"]"]=object[name];
				}
			}
			return newObject;
		},
		success:function(answer){
			if (this.dataType=='text'){
				eval("var data="+answer);
			} else {
				var data=answer;
			}
			if (this.callback){
				if (this.json) {
					this.callback(data,this.json);
				} else {
					this.callback(data,this.json);
				}
			}
		}
	},
	add:function(task,callback){
		var pars={};
		pars.data=taskController.staff.convert(task);
		pars.dataType='json';
		pars.json=task;
		pars.url='/tasks';
		if (callback){
			pars.success=taskController.staff.success;
			pars.callback=callback;
		}
		sendRQ(pars);	
	},
	remove:function(task,callback){
		var pars={};
		
		pars.url=taskController.url.remove+task.id	
		
		if (callback){
			pars.success=taskController.staff.success;
			pars.callback=callback;
		}
		
		pars.data={};
		pars.data["_method"]="delete";
		
		sendRQ(pars);	
	},
	update:function(task,callback){
		var pars={};
		
		pars.url=taskController.url.update+task.id;
		
		if (callback){
			pars.success=taskController.staff.success;
			pars.callback=callback;
		}
		
		pars.json=clone(task);
		delete task.id;
		
		pars.data=taskController.staff.renamePars(task);
		pars.data["_method"]="put";
		
		sendRQ(pars);
	},
	complete:function(task,callback){
		var pars={};
		
		pars.url=taskController.url.complete;	
		
		if (callback){
			pars.success=taskController.staff.success;
			pars.callback=callback;
		}
		
		pars.data={};
		pars['task\[ids\]\[\]']=task.id;
		pars.data["_method"]="put";
		
		sendRQ(pars);
	},
	recover:function(task,callback){
		var pars={};
		
		if (callback){
			pars.success=taskController.staff.success;
			pars.callback=callback;
		}
		
		sendRQ(pars);	
	},
	finalRemove:function(task,callback){
		var pars={};
		
		if (callback){
			pars.success=taskController.staff.success;
			pars.callback=callback;
		}
		
		sendRQ(pars);	
	}
}
var taskInterface={
	callbacks:{
		add:function(data,json){
			if (data.status=='ok'){
				message_show(data);
				delete data.msg;
				delete data.status;
				if (!json.note){
					json.note='';
				}
				if (!json.notewf){
					json['notewf']=json.note;
				}
				var task=jQuery.extend(json,data);
				if (taskInterface.staff.needRender(task)){		
					taskInterface.render(task);
				}
			} else if (data.status=='error'){
				message_show(data);
			}
		}
	},
	staff:{
		getTpl:function(task){
			var tpl='<div id="task_'+task.id+'" class="task priory4 '+parentTaskClass[task.kind]+'">\
				<p id="name_'+task.id+'" class="taskname intask">'+deff(task.name)+'</p>\
				<div id="note_'+task.id+'" class="tasknote intask">'+task.note+'</div>\
				<div id="notewf_'+task.id+'" class="tasknotewf intask">'+task.notewf+'</div>\
			</div>';
			return tpl;
		},
		needRender:function(task){
			var flag=false;
			if (page=="plan" || (page=="today" && task.kind=="today")){		
				flag=true;
			}
			return flag;
		}
	},
	render:function(task){
		var $task=$(taskInterface.staff.getTpl(task));
		var newcss={};
		if (!hasPriority(task.kind)){
			newcss.position='absolute';
			if (task.position){
				var p=task.position.split("x");
				newcss.left=p[0];
				newcss.top=p[1];
				var rgxp=/%/g;
				if (!rgxp.test(p)){
					newcss.left+='px';
					newcss.top+='px';
				}
			} else {
				newcss.left=getrandom(0,90)+"%";
				newcss.top=getrandom(0,80)+"%";
			}
		}
		if (!!newcss){
			$task.css(newcss);
		}
		
		if (hasPriority(task.kind) && hasFirstPriory(task.name)){
			$("#tasks_for_"+task.kind).prepend($task);
		} else {
			$("#tasks_for_"+task.kind).append($task);
		}		
		
		if (page=="today" && task.kind=='today'){
			refresh_today();
		} else if (page=="plan"){	
			refreshcounters(this.kind);
		}
		
		if (hasPriority(task.kind)){
			setPriority(task.kind);	
		} else {
			initDrag($task);	
		}
		if (conf.allowTags){
			checkTagsInTask(task);
		}
		setColorForTask($task);
		changenote($task);
		$task.find(".taskname").click(clickToTask_e).dblclick(dblClickToTask_e);
		$task.exNote();
	}
}
/* -- Initialization function -- */
var drag="stop";
var parentTaskClass={
	"today":"taskfortoday",
	"tomorrow":"taskfortomorrow",
	"week":"taskforweek",
	"next_week":"taskfornextweek",
	"chaos":"taskforchaos"
}
var taskstotoday='.taskforchaos, .taskforweek, .taskfornextweek, .taskfortomorrow';
var taskstotomorrow='.taskforchaos, .taskforweek, .taskfornextweek, .taskfortoday';
var taskstoweek='.taskforchaos, .taskfortomorrow, .taskfornextweek, .taskfortoday';
var taskstonextweek='.taskforchaos, .taskfortomorrow, .taskforweek, .taskfortoday';
var taskstochaos='.taskfortomorrow, .taskfornextweek, .taskfortoday, .taskforweek';
function createsortable(block){
	block.sortable({
		dropOnEmpty:true,
		handle:".taskname",
		start:sortable_dragStart,
		stop:sortable_dragStop,
		update:sortable_update,
		zIndex:50
	});
}
function createdropable(block,acceptblocks){
	block.droppable({
		accept:acceptblocks,
		tolerance: 'pointer', 
		drop:tab_drop
	});
}
function initdroptosortable(block,acceptblocks){
	block.droppable({
  		accept:acceptblocks, 
  		tolerance: 'pointer',
  		drop:sortable_drop
	}); 
}
function linksToDrop(block,acceptblocks){
	block.droppable({
  		accept:acceptblocks,
  		tolerance: 'pointer',
  		over:links_over,
  		out:links_out, 
  		drop:links_drop 
  	});
}
function initarchive(){
	$('#archive').droppable({
		accept:'.task', 
		hoverClass:'archivefull',
		tolerance: 'pointer',
		drop:archive_drop
	});
}
function refresh_archive(){
	fill_archive();
}
function initDrag(task){
	task.draggable({
		start:dragStart,
		stop:dragStop,
		handle:".taskname",
		zIndex:50
	});
}
/* -- Work function -- */
function getParentName(task){
	return task.parent()[0].id.split("tasks_for_")[1];
}
function getRandomPosition(){
	var position={
		"left":getrandom(0,80)+"%",
		"top":getrandom(0,90)+"%"
	}
	return position;
}
function getPlaceName(str){
	return str.split("tasks_for_")[1];
}
function getParentName(task){
	return getPlaceName(task.parent()[0].id);
}
function getPlaceNameForLink(str){
	return str.split("_link")[0];
}
function getTaskId(str){
	return str.split("_")[1];
}
function animatePoof(){ 
	var bgTop = 0;
	var frames = 5; 
	var frameSize = 32; 
	var frameRate = 80; 
	for(i=1;i<frames;i++) {
		$('.poof').animate({
			backgroundPosition: '0 ' + (bgTop - frameSize) + 'px'
		}, frameRate);
		bgTop -= frameSize;
	}
	setTimeout("$('.poof').hide()", frames * frameRate);
}
function fill_archive(){
	$('#archive').removeClass("archivefull");
}
/* -- Priority --*/
var withPriority=["today","tomorrow"];
function hasPriority(place_name){
	var flag=false;
	for (var i=0,length=withPriority.length;i<length;i++){
		if (place_name==withPriority[i]){
			flag=true;
			break;
		}
	}
	return flag;
}
function setPriority(place_name){
	if (setPriority.arguments.length==0) {
		for (var i=0,length=withPriority.length;i<length;i++) {
			setPriority(withPriority[i]);
		}
	} else {
		var classname=tabs_task_classes[place_name];
		var tasks=tabs[place_name].obj.find(".task");
		tasks.removeClass();
		for (var i=0,pr=0;i<3;i++){
			pr=i+1;
			$(tasks[i]).addClass("task priory"+pr+" "+classname);
		}
		for (var i=3,length=tasks.length;i<length;i++){
			$(tasks[i]).addClass("task priory4 "+classname);
		}
	}
}
/* -- Реализация счётчиков для тасков -- */
function refreshcounters(q){
	if (refreshcounters.arguments.length==0) q=tabs_names;
  	if (typeof(q)=="string"){
  		var count=tabs[q].obj.find(".task").length;
  		tabs[q].counter.empty();
  		if (count!=0) tabs[q].counter.append("("+count+")");
  	} else if (typeof(q)=="object") {
  		for (var i=0,length=q.length,count;i<length;i++){
  			count=0;
  			count=tabs[q[i]].obj.find(".task").length;
  			tabs[q[i]].counter.empty();
  			if (count!=0) tabs[q[i]].counter.append("("+count+")");
  		}
  	}
}
/* Счётчик дел на странице сегодня */
function refresh_today(){
	var c=tabs["today"].obj.find(".task").length;
	var count="";						
	if (c==1) { count="единственное дело:";}
	else if (c==0) {count="совсем нет дел.";}
	else if	(c>4 && c<21) { count=c+" дел:";}
	else{						
		var mod=c % 10;
		switch (mod){
			case 1: count=c+" дело:"; break;
			case 2: count=c+" дела:"; break;
			case 3: count=c+" дела:"; break;
			case 4: count=c+" дела:"; break;
			default : count=c+" дел:"; break;
		}
	}							
	$("#tasks_count").empty().append(count);	
}
/* -- End -- */
function hideTaskChilds(task){ // прячем заметки, попапы  и т.д.
	popup.hidden();
	task.find(".tasknote").css({"display":"none"});
	if (TOS[task[0].id]) clearTimeout(TOS[task[0].id]);
}
/* -- Странные функции --*/
function deletetaskblocks(ids){  // will be refactoring
  setTimeout(function(){
	if (ids.length)
	{
	  var parent="#tasks_for_today";
	  if ($("#tasks_for_today #task_"+ids[i]).length==0)
	    parent="#tasks_for_tomorrow";
	  for (var i=0, length=ids.length;i<length;i++)
	  {
		$("#task_"+ids[i]).removeClass("task");
		$("#task_"+ids[i]).effect("drop");
		setTimeout(function(){$("#task_"+ids[i]).remove();},1000);
	  }
	}
	else
    {
      $("#task_"+ids).removeClass("task");
	  $("#task_"+ids).effect("drop");
	  setTimeout(function(){$("#task_"+ids).remove();},1000);
	}
	refreshcounters();
	setpriority(parent);
  },600)
}
function deletetaskblocksinarchive(ids){  // will be refactoring
  setTimeout(
  function()
  {
	if (ids.length)
	{
	  for (var i=0, length=ids.length;i<length;i++)
	  {
		$("#task_"+ids[i]).remove();
	  }
	}
	else
    {
	  $("#task_"+ids).remove();
    }
	setTimeout(function()
      {
	    var parents=$(".parent");
		for (var i=0;i<parents.length;i++)
	    {
          if ($(parents[i]).children().length==1)
		    $(parents[i]).remove();
        }		
	},5)
  },900)
}
/* ===[ Форма быстрого добавления нового таска ]=== */
jQuery.fn.smartArea=function(){  // will be refactoring
	/*
	formofsmartarea=$("#formofsmartarea");
	var screenwidth='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;
  	var screenheight='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
  	var areas=this;
	*/
  	jQuery(this).dblclick(function(event){
   		var placeid=$(this).attr("id");
		if (placeid.length==0){
			placeid="tasks_for_today";
		}
		popup.create(event,placeid)
   		// showform(event.pageX,event.pageY,placeid);
		event.stopPropagation();
  	});
	/*
  	var idform="formofsmartarea";
	formofsmartarea.click(function(e){e.stopPropagation()})
	if (IE==6) {
		formofsmartarea.find("input").keyup(sendToEnter);
  	}
	function showform(x,y,placeid){
		var names={
			"tasks_for_chaos":"В хаос:",
			"tasks_for_next_week":"На следующую неделю:",
			"tasks_for_week":"На эту неделю:",
			"tasks_for_today":"На сегодня:",
			"tasks_for_tomorrow":"На завтра:"
		};
		var kinds={
			"tasks_for_chaos":"chaos",
			"tasks_for_next_week":"next_week",
			"tasks_for_week":"week",
			"tasks_for_today":"today",
			"tasks_for_tomorrow":"tomorrow"
		};
		var name=names[placeid] || "На сегодня: ";
		var kind=kinds[placeid] || "today";
		formofsmartarea.find("label").text(name);
		formofsmartarea.find(".name").val("");
		formofsmartarea.find(".kind").val(kind);
		if (300+x>-20+screenwidth)
	  		x=screenwidth-350+"px";
		if (50+y>0+screenheight)
	  		y=screenheight-30+"px";
		formofsmartarea.css({"top":y,"left":x}).show();
		formofsmartarea.find(".name").focus();
  	}
	*/
}
function addtask(idform){  // will be refactoring
  var task={};
  var form=$("#"+idform);
  var tmp=form.serializeArray();
  task["task[name]"]=tmp[0]['value'];
  task["task[kind]"]=tmp[1]['value'];
	if (!conf.shuffle && !hasPriority(task["task[kind]"])){
	var formOffset=form.offset();
	var parentOffset=tabs[task["task[kind]"]].obj.offset();
	var x=Math.round(1*formOffset.left-1*parentOffset.left);
	var y=Math.round(1*formOffset.top-1*parentOffset.top);
	task["task[position]"]=x+"x"+y;
  }
  if (task["task[name]"]!=""){
	request_add(task);
  }
  form.hide();
}
/* ===[Быстрое редактирование]=== */  // will be refactoring
$(".fastedit").live("keyup",fastEditKeyUp_e);
function fastEditKeyUp_e(event){
	if (event.which==13){
		fastsave("task_"+this.id.split('_')[1]);
	}
}
var oldvalue={};
function fastedit(taskname){
	var task=$(taskname).parent();
	var id=getTaskId(task[0].id);
	var value=$(taskname).text();
	var tmp='<input id="fastedit_'+id+'" class="fastedit" type="text" maxlength="255" size="20" style="z-index:500" value="'+undeff(value)+'">';
	taskname.html(tmp);
	oldvalue[id]=trim(value);
	task.css({"z-index":"100"}).addClass("hideNoteLabel");
}
function fastsave(task_id){
	var taskBlock=$("#"+task_id);
	var fast_edit=taskBlock.find(".fastedit");
	var value=fast_edit.val();	
	var id=getTaskId(task_id);
	if (value!=oldvalue[id] && value!=""){
		var task={};
		task.id=id;
		task["task[name]"]=value;
		taskUpdate_rq(task);
		var kind=getParentName(taskBlock);
		if (hasPriority(kind) && hasFirstPriory(value)){
			taskBlock.parent().prepend(taskBlock);
			setPriority(kind);
		}
	}else{
		taskBlock.find(".taskname").html(deff(oldvalue[id]));
	}
	delete oldvalue[id]; 
	taskBlock.css({"z-index":"1"}).removeClass("hideNoteLabel");;
}
/* ===[Popup]=== */  // will be refactoring
// staff to popup
// callbacks to click
function clickToPopup_e(event){
	event.stopPropagation();
	event.cancelBubble=true;
}
function clickToTask_e(event){
	if (its_drag){
		its_drag=false;
	} else {
		event.stopPropagation();
		if (!$(this).parent().hasClass("hideNoteLabel")){
			popup.show($(this).parent()[0]);
			// formofsmartarea.hide();
		}
	}
}
function dblClickToTask_e(event){
	popup.show($(this).parent()[0]);
	popup.edit("edit");
	// fastedit($(this));
	// formofsmartarea.hide();
	event.stopPropagation();
	// event.cancelBubble=true;
	$('#logo')[0].focus();
}
var formofsmartarea;
function clickToDocument_e(event){
	if (event.which!=3){
		popup.hidden();
		for (var id in oldvalue){
			fastsave("task_"+id);
		}
		// formofsmartarea.hide();
	}
}
function p_addTag_e(event){
	var tag=event.target;
	if ($(tag).hasClass("p_tag")){
		var name=tagsBase.t.tags[tag.id.split("_")[2]].name;
		var input=popup.wrap.find("#p_tags_e");
		var tag_names=input.val();
		var tag_arr=tag_names.split(",");
		var flag=true;
		var length=tag_arr.length;
		for (var i=0;i<length;i++){
			if (tag_arr[i] && name==trim(tag_arr[i])){
				flag=false;
				break;
			}
		}
		if (flag){ // просто добавляем тег
			tag_names=tag_names.replace(/(\s+$)/g,"");
			if (tag_names.length!=0 && tag_names[tag_names.length-1]!=","){
				tag_names=tag_names+","
			}
			if (tag_names.length!=0) tag_names=tag_names+" ";
			tag_names=tag_names+name;
		} else { // удаляем тег
			name=name.replace("\\","\\\\");
			var reg1=new RegExp("(^\\s*"+name+"\\s*$)|(^\\s*"+name+"\\s*,\\s*)|,(\\s*"+name+"\\s*$)",["i"]);
			var tag_names_new=tag_names.replace(reg1,"");
			if (tag_names_new==tag_names){
				var reg2=new RegExp(",(\\s*"+name+"\\s*,)",["i"]);
				tag_names_new=tag_names.replace(reg2,",");
			}
			tag_names=tag_names_new;
		}
		input.val(tag_names);
	}
}
// staff
function generateAllTags(){
	var tmp="";
	for (var tag_id in tagsBase.t.tags){
		tmp+=getTagSimpleTemplate(tagsBase.t.tags[tag_id]);
	}
	return tmp;
}
function getTagSimpleTemplate(tag){
	var tmp='<span id="p_tag_'+tag.id+'" style="color:rgb('+tag.color+');border-color:rgb('+tag.color+')" class="p_tag">'+deff(tag.name)+'</span> ';
	return tmp;
}
// end
function mypopup(){ 
	var self=this;
	self.wrap=$("#pop_up");
	self.status="hidden";
	self.obj=$("#pop_up");
	self.wrap=$("#pop_up_body");
	self.popup_bl=self.obj;
}
mypopup.prototype={
	init:function(){
		this.wrap.click(clickToPopup_e);
		$(".taskname").click(clickToTask_e).dblclick(dblClickToTask_e);
		$(document).click(clickToDocument_e);
		this.wrap.find("#deletebutton").click(function(){popup.deletetask();return false;});
		this.wrap.find("#checkbutton").click(function(){popup.complete();return false;});
		this.wrap.find("#editbutton").click(function(){popup.edit("edit");return false;});
		this.wrap.find("#savebutton").click(function(){popup.save();return false;});
		this.wrap.find("#addbutton").click(function(){popup.add();return false;});
		this.wrap.find("#cancelbutton").click(function(){popup.hidden();return false;});
		// this.wrap.find("#p_name").keyup(function(e){if (e.which==13) popup.save();});
		if (conf.allowTags){
			this.wrap.find("#p_tags_all").click(p_addTag_e);
		}
		this.wrap.find("input:text,textarea").keyup(function(event){
			if (event.which==13 && event.ctrlKey){
				if (popup.wrap.hasClass("edit")){
					popup.save();
				} else if (popup.wrap.hasClass("add")){
					popup.add();
				}
			}
		})
	},
	show:function(task){
		popup.selectedTask=task;
		popup.status="showed";
		var offset=$(task).offset();
		var left=offset.left-30;
		var top=offset.top+$(task).height();
		popup.taskid=getTaskId(task.id);
		popup.taskname=undeff($(task).find(".taskname").html());
		popup.tasknote_block=$(task).find(".tasknote");
		popup.tasknote=popup.tasknote_block.html();
		popup.tasknote_block.css({"visibility":"hidden"});
		popup.tasknotewf=$(task).find(".tasknotewf").html();
		if (popup.tasknotewf.length>0){
			popup.tasknotewf=trim(popup.tasknotewf);
		}
		if (popup.tasknotewf.length>0){
			popup.tasknotewf=undeff(popup.tasknotewf);
		}
		popup.tasknotewf=undeff(trim($(task).find(".tasknotewf").html()));
		popup.wrap.find("#p_name").empty().append(deff(popup.taskname));
		var note_block=popup.wrap.find("#p_note")
		note_block.empty();
		if (popup.tasknotewf.length>0){
			note_block.append("<b>Заметка:</b><br/>"+popup.tasknote);
		}
		if (conf.allowTags){
			popup.tasktags=getTaskTags(popup.taskid,"array").join(", ");
			var tags_block=popup.wrap.find("#p_tags");
			tags_block.empty();
			if (popup.tasktags.length>0){
				tags_block.append("<b>Теги: </b>"+popup.tasktags)
			}
		}
		popup.wrap.find("#p_place_name").hide();
		popup.wrap.removeClass().addClass("show");
		var popup_class="left";
		if (offset.left>document.width-400-$(task).width()){
			popup_class="right";
			left=left-150;
		}
		popup.obj.removeClass().addClass(popup_class).css({"left":left,"top":top,"display":"block"});
	},
	hidden:function(){
		this.status="hidden";
		this.wrap.find("#p_place_name").hide();
		if (this.tasknote_block) this.tasknote_block.css({"visibility":"visible"});
		this.obj.hide();
		return false;
	},
	edit:function(){
		popup.wrap.find("#p_name_e").val(popup.taskname)
		popup.wrap.find("#p_note_wf").val(popup.tasknotewf);
		if (conf.allowTags) {
			popup.wrap.find("#p_tags_e").val(undeff(popup.tasktags));
			popup.wrap.find("#p_tags_all").empty().append(generateAllTags());
		}
		popup.wrap.removeClass().addClass("edit");
		$("#p_name_e").focus();
	},
	save:function(){	
	    var task={};
		task["task[name]"]=trim(this.wrap.find("#p_name_e").val());
		var $task=$(this.selectedTask);
		var kind=getParentName($task);
		if (task["task[name]"].length>0){
			var count=0;
			if (task["task[name]"]==this.taskname){
				delete task["task[name]"];
				++count;
			}
			task.id=this.taskid;
			task["task[note]"]=this.wrap.find("#p_note_wf").val();
			if (task["task[note]"].length>0){ 
				task["task[note]"]=trim(task["task[note]"]); 
			}
			if (task["task[note]"]==this.tasknote){
				delete task["task[note]"];
				++count;
			}
			if (conf.allowTags){
				task["task[tag_names]"]=smartTrim(this.wrap.find("#p_tags_e").val());
			}
			if (task["task[tag_names]"]==this.tagnames){
				delete task["task[tag_names]"];
				++count;
			}
			if (count!=3){
				taskUpdate_rq(task);
			}
			this.hidden();
			if (task["task[name]"] && hasPriority(kind) && hasFirstPriory(task["task[name]"])){
				$task.parent().prepend($task);
				setPriority(kind);
			}
		} else {
			// показать предупреждение
		}
		return false;
	},
	deletetask:function(){
		taskDelete(this.selectedTask);
		this.hidden();
	},
	complete:function(){
		taskComplete(this.selectedTask);
		this.hidden();
	}
}
// add in POPUP create skills=)
mypopup.prototype.create=function(event,place){
	this.status="showed";
	this.place=place.split('_')[2];
	if (this.place=="next"){this.place="next_week"}
	var parentOffset=tabs[this.place].obj.offset();
	
	var x0=getBodyScrollLeft();
	var y0=getBodyScrollTop();
	
	this.obj.css({left:'-3000',
		display:'block',
		visibility:'hidden'
	});
	var popupWidth=this.obj.innerWidth();
	var popupHeight=this.obj.innerHeight();
	this.obj.css({left:'0',
		display:'none',
		visibility:'visible'
	});
	if (popupHeight<100) {popupHeight=140}
	
	var windowWidth=getClientWidth();
	var windowHeight=getClientHeight();
	var x=Math.round(1*event.pageX-1*parentOffset.left);
	var y=Math.round(1*event.pageY-1*parentOffset.top);
	var left=event.pageX;
	var top=event.pageY;
	
	if (((left-x0)+popupWidth>windowWidth-50) && (left-popupWidth>0)){
		left=left-popupWidth;
	}
	if (((top-y0)+popupHeight>windowHeight-50) && (top-popupHeight>0)){
		top=top-popupHeight;
	}

	this.taskname="";
	this.tasknote="";
	this.tasknotewf="";
	this.position=x+"x"+y;
	this.wrap.find("#p_name").empty();
	var popup_class="none";
	this.wrap.find("#p_name_e").val("")
	this.wrap.find("#p_note_wf").val("");
	if (conf.allowTags) {
		this.wrap.find("#p_tags_e").val("");
		this.wrap.find("#p_tags_all").empty().append(generateAllTags());
	}
	var names={
		"chaos":"В хаос:",
		"next_week":"На следующую неделю:",
		"week":"На эту неделю:",
		"today":"На сегодня:",
		"tomorrow":"На завтра:"
	};
	this.wrap.find("#p_place_name").empty().append(names[this.place]).show();
	this.obj.removeClass().addClass(popup_class).css({"left":left,"top":top,"display":"block"});
	this.wrap.removeClass().addClass("add");
	
	$("#p_name_e").focus();
}
mypopup.prototype.add=function(){
	var task={};
	task['name']=trim(this.wrap.find("#p_name_e").val());
	if (task['name'].length>0){
		task['kind']=this.place;
		task['note']=this.wrap.find("#p_note_wf").val();
		if (task['note'].length>0){ 
			task['note']=trim(task['note']); 
		}
		if (!conf.shuffle && !hasPriority(task['kind'])){
			task['position']=this.position;
		}
		if (conf.allowTags){
			task['tag_names']=smartTrim(this.wrap.find("#p_tags_e").val());
		}
	}
	/* staff */
	function parseAnswer(answer){
		if (answer.status=='ok'){
			// task=
			// taskInterface.render(task);
		} else {
			// show message
		}
	}
	/* */
	taskController.add(task,taskInterface.callbacks.add);
	this.hidden();
	return false;
}
/* ===[Форма быстрого добавления таска]=== */  // will be refactoring
function exeditfield(pars){
  var form=$("#new_task_form");
  var input=form.find("#task_name");
  var button=form.find(".submit_button");
  var defaultkind="chaos";
  if (!!pars.def){
    defaultkind=pars.def;
  } else if (button.length>0){
    defaultkind=button.eq(0).attr("id");
  }
  this.init=function(){
	input.focus(newtaskform.toedit);
	input.keyup(newtaskform.tokeyup);
	button.click(newtaskform.submit);
	input.blur(newtaskform.todefault);
	this.todefault();
	input.addClass("blur");
	$("#task_kind").val(defaultkind);
	$("#"+defaultkind).addClass("infocus");
	form.submit(function(){return false;})
  }
  this.todefault=function()
  {
	input.removeClass();
	if (input.val()=="" || input.val()=="Hoвoе делo") 
    {	
	  input.val("Hoвoе делo");
	  input.addClass("blur");
	  button.attr("disabled","disabled");
	  $("#new_task_form").addClass("disabled");
	}
    else 
	{
	  input.addClass("bluring");
	  setTimeout(function(){
	    var input=$("#task_name");
	    if (input.hasClass("bluring"))
	    input.removeClass();
	    input.addClass("blur");
	  }, 10000);
	}
  }
  this.toedit=function()
  {
	if (input.val()=="Hoвoе делo")
	  input.val("");
	else 
	{
	  button.attr("disabled","");
	  $("#new_task_form").removeClass("disabled");
	}
	input.removeClass();
	input.addClass("focus");
	
  }
  this.tokeyup=function(event)
  {
	if (input.val()=="Hoвoе делo" || input.val()=="")
	{  
	  button.attr("disabled","disabled")
	  $("#new_task_form").addClass("disabled");
	}
	else
	{
      button.attr("disabled","");
	  $("#new_task_form").removeClass("disabled");
	  if (event.which==13) newtaskform.submit2();
    }
  }
  this.submit2=function(){
	var task={};	
	task["name"]=input.val();
	task["kind"]=$("#task_kind").val();
	input.val("");
	if (task["name"]!=""){
		taskController.add(task,taskInterface.callbacks.add);
	}
  }
  this.submit=function()
  {
	var preid=$("#task_kind").val();
	$("#"+preid).removeClass("infocus");
	$("#task_kind").val(this.id);
	$("#"+this.id).addClass("infocus");
	var task={};	
	task['name']=input.val();
	task['kind']=this.id;
	input.val("");
	if (!conf.shuffle){
		task['position']=getrandom(0,80)+'%x'+getrandom(0,80)+'%';
	}
	input.focus();
	if (task["name"]!=""){
			taskController.add(task,taskInterface.callbacks.add);
//		request_add(task);
	}
  }
}
/* ===[Быстрый показ заметок]=== */
var TOS={};
var TOH={};
var drag2="stop";
var its_drag=false;
jQuery.fn.exNote = function(userOptions){  // will be refactoring
	var options=jQuery.extend({
		noteSelector: ".tasknote",
		TO:180,
		effect:"fadeIn"
	}, userOptions);
    var tasks=this;
	jQuery(tasks).find(".taskname").live("mouseover",showNoteTO).live("mouseout",hideNoteTO);
	jQuery(tasks).live("click",hideNoteFast).bind('dragstart',taskDragStart).bind('dragstop',taskDragStop);
	function showNoteTO(event){
		var task=$(this).parent();
		var task_id=task[0].id;
		var note=task.find(options.noteSelector);
		if (note.html()){
			if (TOS[task_id]) clearTimeout(TOS[task_id]);
			if (TOH[task_id]){
				clearTimeout(TOH[task_id]);
			}
			TOS[task_id]=setTimeout(function(){
				showNote(task);
			},options.TO);
		}
	}
	function showNote(task){
		var task_id=task.attr("id");
		var note=task.find(options.noteSelector);
		var newcss={
			"display":"none",
			"position":"absolute",
			"top":task.height(),
			"left":20,
			"right":'auto'
		};
		if (!(task.css("position")=="absolute" || task.css("position")=="relative")){
			newcss.top+=task.position().top;
			newcss.left+=task.position().left;
		}
		if (task.offset().left>document.width-200-task.width()){
			newcss.left='auto';
			newcss.right=task.find(".taskname").width()/2;
		}
		if (note.css("display")=="none" && task.find(".fastedit").length==0 && drag=="stop" && drag2=="stop"){
			note.css(newcss);
			switch (options.effect){
				case "slideDown":  
					note.slideDown(300);
				break;
				case "fadeIn":  
					note.fadeIn(150);
				break;
				default : 
					note.css({"display":"block"});
				break;
			}
		}
		if ((drag=="start" || drag2=="start") && TOS[task_id]) clearTimeout(TOS[task_id]);
		task.css({"z-index":"2"});
	}
	function hideNoteTO(event){
		var task=$(this).parent();
		var task_id=task[0].id;
		var note=task.find(options.noteSelector);
		if (note.html()){
			if (TOH[task_id]) clearTimeout(TOH[task_id]);
			if (TOS[task_id]){
				clearTimeout(TOS[task_id]);
			}
			TOH[task_id]=setTimeout(function(){
				hideNote(note);
				task.css({"z-index":"1"});
			},options.TO);
		}
	}
	function hideNoteFast(event){
		var task=$(this);
		var note=task.find(options.noteSelector);
		if (note.html()){
			hideNote(note)
		}
		task.css({"z-index":"1"});
	}
	function hideNote(note){
		var newcss={"display":"none"};
		note.css(newcss);
	}
	function taskDragStart(event){
		drag2="start";
		its_drag=true;
		var task=$(this);
		var note=task.find(options.noteSelector);
		if (note.html()){
				hideNote(note)
		}
		task.css({"z-index":"1"});
	}
	function taskDragStop(event){
		drag2="stop";
	}
}
/* ===[ Colorize ]===*/
function calculateColor(words){
   for (var i=0,length=words.length,x=0;i<length;i++)
   {  
     x+=words.charCodeAt(i);
   }
   var f=""+Math.sin(10.0/x)*Math.cos(10.0/x)*2;
   var r=1*f.substring(5,8) % 225;
   var g=1*f.substring(8,11) % 225;
   var b=1*f.substring(11,14) % 225;
   return "rgb("+r+","+g+","+b+")";
}
var default_color="rgb(126,126,126)";
function setColorForTask(task,action){
	var color=false;
	if (conf.allowTags){
		var row=tagsBase.selectFirst("task-tags","task_id",getTaskId(task[0].id));
		if (row){
			var tag_id=row["tag_id"];
			var tag=tagsBase.selectFirst("tags","id",tag_id);
			color="rgb("+tag.color+")";
		} else {
			color=default_color;
		}
	} else {
		if (tabs[getParentName(task)].colorize){
			taskname=task.find(".taskname").html();
			color=calculateColor(undeff(taskname));
		}
	}
	if (color){
		task.css({"color":color});
	}
}
/* -- Events -- */
// staff
function getWrap(obj,wrapper){
	var newObj={};
	var newpar="";
	for (var par in obj){
		newpar=wrapper[0]+par+wrapper[1];
		newObj[newpar]=obj.par;
	}
	return newObj;
}
// --------------- Move 
// data={{"kind","position"},"oldkind"}
$(document).bind("taskMove",taskMove_c);

function taskMove_c(event,data){
	movedChilds(data.oldKind);
	movedChilds(data.kind);
	var pars={};
	pars.url=url.tasks.update+getTaskId(event.target.id);
	pars.data={};
	pars.data["task[kind]"]=data.kind;
	if (data.position){
		pars.data["task[position]"]=data.position.left+"x"+data.position.top;
	}
	pars.data["_method"]="put";
	sendRQ(pars);
}
/* drag and drop  */
var needMove=empty_function;
var needMove_pars_0="";
var needMove_pars_1="";
function sortable_dragStart(event,ui){
	drag="start";
	its_drag=true;
	hideTaskChilds($(this));
}
function sortable_dragStop(event,ui){
	drag="stop";
	needMove(needMove_pars_0,needMove_pars_1);
	needMove=empty_function;
	needMove_pars_0="";
	needMove_pars_1="";
}
function dragStart(event,ui){
	hideTaskChilds($(this));
}
function dragStop(event,ui){}
function sortable_update(d){
	var place_name=getPlaceName(this.id);
	setPriority(place_name);
	savePosition($(this).sortable("serialize",{key:keyToSave[place_name]}),place_name); 
}
function sortable_drop(ev,ui){
	var task=$(ui.draggable);
	if (!task.parent()[0].id!=this.id){
		taskPreMoved(task,$(this),false)
	}
}
var last_drop_timestamp=false;
function tab_drop(event, ui){
	if (event.timeStamp!=last_drop_timestamp){ // fix double event
		last_drop_timestamp=event.timeStamp;
		var task=$(ui.draggable);
		var offset=task.offset();
		if (getPlaceName(this.id)!=getPlaceName(task.parent()[0].id)){
			taskPreMoved(task,$(this),offset);
		} else {
			taskMovedInParent(task,$(this),offset);
		}
	}
}
function links_over(event, ui){
	var place_name=getPlaceNameForLink(this.id);
	if (!$(ui.draggable).hasClass(tabs_task_classes[place_name])) 
		$(this).addClass("hovermenu")
}
function links_out(event, ui){
	if ($(this).hasClass("hovermenu"))
	  $(this).removeClass("hovermenu")
}
function links_drop(event, ui){
	if (event.timeStamp!=last_drop_timestamp){ // fix double event
		last_drop_timestamp=event.timeStamp;
		if ($(this).hasClass("hovermenu"))
	     	$(this).removeClass("hovermenu");
	    var task=$(ui.draggable);
		var newPlaceName=getPlaceNameForLink(this.id);
		var offset="";
		if (!hasPriority(newPlaceName)){
			offset=getRandomPosition();
			offset.random=true;
		}
		taskPreMoved(task,tabs[newPlaceName].obj,offset);
	}
}
function taskCut(task,parent_name){
	task.remove();
	movedChilds(parent_name);
}
function archive_drop(event, ui){	
	var task=$(ui.draggable);
	var parent_name=getPlaceName(task.parent()[0].id);
	if (hasPriority(parent_name)){ // для сортайбл элементов событие вызовется после
		needMove=taskCut;
		needMove_pars_0=task;
		needMove_pars_1=parent_name;
	} else {
		taskCut(task,parent_name);
	}
	saveTaskComplete(task[0].id,refresh_archive);
}
function movedChilds(parent_name){
	var flag=false;
	if (page=="plan"){
		refreshcounters(parent_name);
		flag=true;
	}
	if (page=="today" && parent_name=="today"){
		refresh_today();
		flag=true;
	}
	if (flag && hasPriority(parent_name)){
		setPriority(parent_name);
	}
	return true;
}
function taskMovedInParent(task,parent,offset){
	if (!conf.shuffle){ 
    	var p_offset=parent.offset();
    	offset.left-=p_offset.left;
    	offset.top-=p_offset.top;
    	saveMovedPosition(task[0].id,offset);
	}
}
function taskPreMoved(task,new_parent,offset){
	var info=podgotovka(task,new_parent,offset);
	if (hasPriority(info.oldPlaceName)){ // для сортайбл элементов событие вызовется после
		needMove=taskMoved;
		needMove_pars_0=task;
		needMove_pars_1=info;
	} else {
		taskMoved(task,info);
	}
}
/* Изменения таска */
function e_updateTask(data){
	checkTagsInTask(data); // razbiramsia s tegami
}
function changenote(task){
	validateForLabel(task[0]);
}
/* -- Callbacks -- */
function taskMoved(task,info){
	task[0].style.color="";
	task[0].style.position="";
	task[0].style.left="";
	task[0].style.top="";
	if (hasPriority(info.newPlaceName) && hasFirstPriory(task.find(".taskname").text())) {
		tabs[info.newPlaceName].obj.prepend(task);
	} else {
		tabs[info.newPlaceName].obj.append(task);
	}
	task.removeClass().addClass("task "+parentTaskClass[info.newPlaceName]).css(info.newcss);
	if (info.fromTO) {
		if (task.attr("aria-disabled")=="true"){
			task.draggable('enable');
		}else{
			initDrag(task);
		}
	}
	if (info.toTO){ 
		task.draggable('disable');
		tabs[info.newPlaceName].obj.sortable("refresh");
	}
	task.css({"display":"block"});
	
	var data={};
	data.kind=info.newPlaceName;
	data.oldKind=info.oldPlaceName;
	if (!conf.shuffle && !hasPriority(info.newPlaceName)){
		data.position=info.position;
	}
	task.trigger("taskMove",data);
	setColorForTask(task);
}
function podgotovka(task,block,offset){
	var info={
		"fromTO":false, // из сортейбле блока 
		"toTO":false,  // в сортейбл блок
		"taskid":task[0].id,
		"oldPlaceName":getPlaceName(task.parent()[0].id),
		"newPlaceName":getPlaceName(block[0].id)
	}
	info.newcss={
		"display":"none"
	}
	if (!hasPriority(info.newPlaceName)){
		info.position={};
		if (offset.random) {
			info.position.left=offset.left;
			info.position.top=offset.top;
		} else {
			var blockXY=block.offset();
			info.position.left=offset.left-blockXY.left;
			info.position.top=offset.top-blockXY.top;
		}
		info.newcss.top=info.position.top;
		info.newcss.left=info.position.left;
	}
	if (info.oldPlaceName=="today" || info.oldPlaceName=="tomorrow"){
		info.fromTO=true;
	}
	if (info.newPlaceName=="today" || info.newPlaceName=="tomorrow"){
		info.toTO=true;
	}
	return info;
}
function taskUpdate_c(answer){
	eval("var data="+answer);
	if (data.status="ok"){
		var task=this.jsonData;
		var taskBlock=$("#task_"+task.id);
		if (task["task[name]"]) {
			taskBlock.find(".taskname").empty().append(deff(task["task[name]"]));
		}
		taskBlock.find(".taskname").effect("highlight");
		if (data.note) {
			taskBlock.find(".tasknote").empty().append(data.note);
			taskBlock.find(".tasknotewf").empty().append(deff(task["task[note]"]));
			changenote(taskBlock);
		} else {
		    taskBlock.find(".tasknote").empty();
			taskBlock.find(".tasknotewf").empty();
			changenote(taskBlock);
		}
		// callback for work this tags
		var data2=jQuery.extend(task,data);
		e_updateTask(data2);
		setColorForTask(taskBlock);
	} else {
		message_show(data);
	}
}
function taskDelete(task){
	var jTask=$(task);
	var name=jTask.find(".taskname")
	var name_offset=name.offset();
	var poof={};
	poof.left=name_offset.left+name.width()/2.2;
	poof.top=name_offset.top+"px";
	$('.poof').css(poof).show();  
	var parent=getPlaceName(jTask.parent()[0].id);
	taskDelete_rq({
		"id":getTaskId(task.id)
	});
	jTask.remove(); 
	animatePoof();
	movedChilds(parent);
}
function taskComplete(task){
	var jTask=$(task);
	var parent=getPlaceName(jTask.parent()[0].id);
	taskComplete_rq({"id":getTaskId(task.id)});
	jTask.removeClass("task").fadeOut(1000,function(){
		jTask.remove();
		movedChilds(parent);
	});
}
function taskDelete_c(answer){
	eval("data="+answer);
	if (data.status="ok"){}
}
/* -- Requests -- */
url.tasks={};
url.tasks.save='/tasks/';
url.tasks.update='/tasks/';
url.tasks.dElete='/tasks/';
url.tasks.complete='/tasks/complete/';
// to refactoring
url.positions={};
url.positions.today='/tasks/update_day_position';
url.positions.tomorrow='/tasks/update_day_position';
url.task_save='/tasks/';
url.task_delete='/tasks/';
url.task_complete='/tasks/complete/';
url.moved={};
url.moved.today='/tasks/for_today';
url.moved.tomorrow='/tasks/for_tomorrow';
url.moved.week='/tasks/for_week';
url.moved.next_week='/tasks/for_next_week';
url.moved.chaos='/tasks/for_chaos';
// end to refactoring
var keyToSave={
	"today":"tasks_for_today[]",
	"tomorrow":"tasks_for_tomorrow[]"
}
function savePosition(list,place_name){
	var pars={
	    data:list, 
		url:url.positions[place_name]
	};
	sendRQ(pars);
}
function saveMoved(task_id,place_name){
	var id=task_id.split('_')[1];
	var pars={
		data:'id='+id+'&_method=put', 
		url:url.moved[place_name]
	};
	sendRQ(pars);
}
function saveMovedPosition(task_id,task_position){ // to refactoring and delete
	var id=task_id.split('_')[1];
	var pars={
	 	data:"task[position]="+task_position.left+"x"+task_position.top+'&_method=put',  
	 	url:'/tasks/'+id+'/'
	};
	sendRQ(pars);
}
function saveTaskComplete(task_id,callback){// to delete
	var id=task_id.split('_')[1];
	var pars={
		data:'task[ids][]=' + id + '&_method=put', 
		url:'/tasks/complete',
		complete:callback
	};
	sendRQ(pars);
}
function taskUpdate_rq(task){
	var pars={};
	pars.jsonData=clone(task);
	pars.success=taskUpdate_c;
	pars.url=url.tasks.save+task.id;
	delete task.id;
	pars.data=task;
	pars.data["_method"]="put";
	sendRQ(pars);
}
function taskDelete_rq(task){
	var pars={};
	pars.data='_method=delete';
	pars.url=url.tasks.dElete+task.id	
	sendRQ(pars);	
}
function taskComplete_rq(task){
	var pars={};
	pars.data='task[ids][]='+task.id+'&_method=put';
	pars.url=url.tasks.complete;	
	sendRQ(pars);
}
/* запрос на добавление таска с колбеком */
function hasFirstPriory(name){
	var flag=false;
	if (name[name.length-1]==="!"){
		flag=true;
	}
	return flag;
}
var request_add=function(task) // will be refactoring
{
	$.ajax({
		data:task, 
		dataType:'text', 
		type:'post', 
		url:'/tasks/',
		json:task,
		taskname:task["task[name]"],
		kind:task["task[kind]"],
		success:function(answer){
			eval("var data="+answer);		
			if (data.status=="ok"){
				if (page=="plan" || (page=="today" && this.kind=="today")){				
					var newstyle="";								
					if (this.kind!="today" && this.kind!="tomorrow"){
						if (conf.shuffle){
							var x=getrandom(0,90)+"%";
							var y=getrandom(0,80)+"%";
							newstyle='position:absolute;top:'+y+';left:'+x+';';
						} else if (this.on["task[position]"]) {
							var p=this.json["task[position]"].split("x");
							newstyle='position:absolute;top:'+(1*p[1]+5)+'px;left:'+(1*p[0]+5)+'px;';
						}
					}
					var new_task_id='task_'+data.id;
					var tmp='<div id="'+new_task_id+'" class="task priory4 '+parentTaskClass[this.kind]+'" style="'+newstyle+'"><p id="name_'+data.id+'" class="taskname intask">'+this.taskname+'</p><div id="note_'+data.id+'" class="tasknote intask"/><div id="notewf_'+data.id+'" class="tasknotewf intask"/></div>';
					if (page=="plan"){
						if (hasPriority(this.kind) && hasFirstPriory(this.taskname)){
							$("#tasks_for_"+this.kind).prepend(tmp);
						} else {
							$("#tasks_for_"+this.kind).append(tmp);
						}
						refreshcounters(this.kind);
						// $("#"+new_task_id).exNote();
					}
					if (page=="today" && (this.kind=="today" || this.kind=="tomorrow")){
						if (hasFirstPriory(this.taskname)){
							$("#tasks_for_"+this.kind).prepend(tmp);
						} else {
							$("#tasks_for_"+this.kind).append(tmp);
						}
						refresh_today();	
						// $("#"+new_task_id).exNote();			
					}
					var taskBlock=$('#task_'+data.id);
					taskBlock.find(".taskname").click(clickToTask_e).dblclick(dblClickToTask_e);
					taskBlock.exNote();
					setColorForTask(taskBlock);
					if (this.kind!="today" && this.kind!="tomorrow") 
						initDrag($('#task_'+data.id));					
					if (this.kind=="today"){
						setPriority("today");				
					}
					if (this.kind=="tomorrow"){
						setPriority("tomorrow");				
					}
				}
				message_show(data);
			}else if (data.status=="error"){
				message_show(data);
			}
		}
	});
}
/* ===[ Note Label ]=== */
var noteLabels={};
var labelClass="hasnote";
var labelObjPrefix="name_";
var labelNotePrefix="note_";
var labelTaskPrefix="task_"
function initNoteLabels(){
	var tasks=$(".task");
	for (var i=0,length=tasks.length,id;i<length;i++){
		validateForLabel(tasks[i]);
	}
}
function validateForLabel(task){
	var id=task.id.split(labelTaskPrefix)[1];
	var noFirst=true;
	if (!noteLabels[id]){
		noteLabels[id]={};
		noteLabels[id].flag=false;
		noteLabels[id].obj=$(task).find("#"+labelObjPrefix+id);
		noFirst=false;
	}
	if ($(task).find("#"+labelNotePrefix+id).text()!=""){
		noteLabels[id].flag=true;
		setLabel(id);
	} else if (noFirst){
		deleteLabel(id);
	}
}
function setLabel(id){
	noteLabels[id].obj.addClass(labelClass);
}
function deleteLabel(id){
	noteLabels[id].obj.removeClass(labelClass);
}
/* ===[ Tags ]=== */
slc.tags={};
slc.tags.wrap="tags";
slc.tags.wrap_jQ="#tags";
slc.tags.parent_jQ="#tags_parent";
slc.tags.form="tag_form";
slc.tags.form_jQ="#tag_form";
slc.tags.form_value_jQ="#tag_names";
slc.tags.form_oldvalue_jQ="#tag_oldvalue";
slc.tags.form_mode_jQ="#tag_mode";
slc.tags.form_show="tag_form_show";
slc.tags.form_show_jQ="#tag_form_show";
slc.tags.form_hide_jQ="#tag_form_hide";
slc.tags.form_tag_id="#tag_id";
slc.tags.tag_delete_link_jQ="#tag_delete_link";
slc.tags.tags="tag";
slc.tags.tags_jQ=".tag";
slc.tags.tags_name_jQ=".tagname";
cash.tags={};
var tasks={};
// init database 
var tagsBase;
// End: init databse
var tags_global={}; // bad idea =(
var tags_name_id={}; // bad idea =(
var task_tags_buf={}; 
var tags_array={};
// messages 
messages.tags={};
messages.tags.noUniq={"status":"error","msg":"Тег с таким именем уже существует."}
//
function tagsInit(){
	cash.tags.wrap=$(slc.tags.wrap_jQ);
	cash.tags.parent=cash.tags.wrap.find(slc.tags.parent_jQ);
	cash.tags.form=cash.tags.wrap.find(slc.tags.form_jQ);
	cash.tags.form_label=cash.tags.form.find("label");
	cash.tags.form_value=cash.tags.form.find(slc.tags.form_value_jQ);
	if (IE==6) cash.tags.form_value.keyup(sendToEnter);
	cash.tags.form.find(".close_button").click(tagsFormHide);
	cash.tags.form.submit(tagEdit);
	cash.tags.form.find(".button-apply").click(tagEdit);
	cash.tags.delete_link=cash.tags.form.find(slc.tags.tag_delete_link_jQ);
	cash.tags.delete_link.click(tagsPreDelete);
	cash.tags.form_show=cash.tags.wrap.find(slc.tags.form_show_jQ);
	cash.tags.form_show.click(tagsCallForm);
	cash.tags.objs=cash.tags.wrap.find(slc.tags.tags_jQ);
	cash.tags.objs.live("dblclick",tagsCallForm);
	cash.tags.objs.live("click",tagClick_e);
	cash.tags.parent.bind("tagsSelected",tagsSelected_e)
	tagsBase=new simpleBase;
	tagsBase.createTable({
		name:"tags",
		keyColumn:"id",
		columns:["name","color"],
		uniq:["name"]
	});
	tagsBase.createTable({
		name:"task-tags",
		keyColumn:"id",
		columns:["task_id","tag_id"]
	});
	tagGrabIdAndName(cash.tags.objs);
	tagGrabTaskId(task_tags_buf);
	cash.tags.wrap.find("#tag_cancel_filter").click(function(){
		simple_tag_filter("*");
		cash.tags.parent.find(".tag").removeClass("tag_selected");
		return false;
	});
	tags_fcbc();
	initColorPicker();
}
/* -- Different function -- */
function getTagId(str){
	return str.split("_")[1];
}
// Tags Databse
function tagGrabIdAndName(tags){
	var row={};
	for (var i=0,length=tags.length;i<length;i++){
		row.id=tags[i].id.split('_')[1];
		row.name=$(tags[i]).find(".tagname").text();
		var t=$(tags[i]).css("color");
		if (t[0]!="#"){
			row.color=t.substring(4,t.length-1);
		}else if (tags[i].style.cssText){
			reg=/rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)/i;
			arr=reg.exec(tags[i].style.cssText);
			if (arr.length>3){
				row.color=arr[1]+","+arr[2]+","+arr[3];
			}
		} else {
			alert("Ошибка в определение цветов тегов");
		}
		tagsBase.push("tags",row);
		row={};
	}
}
function tagGrabTaskId(list){
	var row={};
	for (var task in list){
		for (var i=0,length=list[task].length;i<length-1;i++){
			row.task_id=task;
			row.tag_id=list[task][i];
			tagsBase.push("task-tags",row);
			row={};
		}
	}
}
function checkTagsInTask(data){
	var tmp_1={};
	var tmp_2={};
	var flag;
	var flag_addNewTags=false;
	tmp_2.task_id=data.id;
	flag=tagsBase.cut("task-tags","task_id",data.id);
	// стереть старую инфу о тасках-тегах
	for (var i=0,length=data.tags.length;i<length;i++){
		tmp_1.id=data.tags[i].tag.id;
		tmp_1.name=data.tags[i].tag.name;
		tmp_1.color=data.tags[i].tag.color;
		flag=tagsBase.push("tags",tmp_1);
		tmp_2.tag_id=tmp_1.id;
		if (tagsBase.checkRowToUniq("task-tags",tmp_2)){
			tagsBase.simplePush("task-tags",tmp_2);
		}
		if (flag.status=="ok"){
			tagAdd_dom(tmp_1);
			flag_addNewTags=true;
		}
		tmp_1={};
	}
	if (flag_addNewTags){
		addNewTags_e();
		tags_fcbc();
	}
	$("#content").trigger("tasksChange");
}
function getTaskTags(id,answer_type){ // underconstruction
	if (typeof(answer_type)=="undefined"){
		answer_type="object";
	}
	if (answer_type=="array"){
		answer=[];
		var tag_ids=tagsBase.selectRows("task-tags",{"name":"task_id","value":id},["tag_id"]);	
		for (var i=0,length=tag_ids.length;i<length;i++){
			answer[i]=deff(tagsBase.t.tags[tag_ids[i].tag_id].name);
		}
	}
	return answer;
}
// End: Tags Database
function trueTags(str){
	var s=trim(str);
	var flag=false;
	if (s.length>0){
		flag=s;
	}
	return flag;
}
function tagDeleteFromBase(tag){
	tagsBase.cut("tags","id",tag.id);
	tagsBase.cut("task-tags","tag_id",tag.id);
}
/* -- modify DOM -- */
function tagAdd_dom(tag){
	cash.tags.parent.append(tagGetTemplate(tag));
	cash.tags.objs.add(cash.tags.wrap.find("#tag_"+tag.id));
}
function tagRename_dom(tag){
	var tag_name=cash.tags.wrap.find("#"+tag.id+" .tagname");
	tag_name.html(tag.new_name);
	tags_name_id[tag.new_name]=tags_name_id[tag.name];
	delete tags_name_id[tag.name];
}
function tagDelete_dom(tag){
	cash.tags.parent.find("#tag_"+tag.id).remove();
}
function tagGetTemplate(tag){
	var color="#444444";
	if (tag.color) color="color:rgb("+tag.color+")"; 
	var tmp='<div id="tag_'+tag.id+'" style="'+color+'" class="tag"><p id="tag_name_'+tag.id+'" class="tagname">'+deff(tag.name)+'</p></div>';
	return tmp;
}
function toogleVisible(objs,selector){
	objs.filter(selector).css({"display":"block"});
	objs.not(selector).css({"display":"none"});
}
function tags_fcbc(){ // tags filter cancel button check
	if (tagsBase.lengths["tags"]==0){
		cash.tags.wrap.find("#tag_cancel_filter").hide();
	} else {
		cash.tags.wrap.find("#tag_cancel_filter").show();
	}
}
function taskRefreshColors(tag){
	var tasks=tagsBase.selectRows("task-tags",{"name":"tag_id","value":getTagId(tag.id)},["task_id"]);
	if (tasks){
		var selector="";
		var t="";
		for (var i=0,length=tasks.length;i<length;i++){
			if (tagsBase.selectFirst("task-tags","task_id",tasks[i].task_id).tag_id==getTagId(tag.id)){
				t="#task_"+tasks[i].task_id+",";
				selector+=t;
				t="";
			}
		}
		selector=selector.substr(0,selector.length-1);
		var tasksBlock=$(selector);
		tasksBlock.css({"color":"rgb("+tag.color+")"});
	}
}
/* -- Tag Form -- */
var tag_form={}
tag_form.text={};
tag_form.text.add="Имя для тега";
tag_form.text.edit="Новое имя тега";
tag_form.class_name={};
tag_form.class_name.add="add";
tag_form.class_name.edit="edit";
tags_array.id_names={};
tags_array.names_id={};
tags_array.el={};
function tagsCallForm(){
	var pars=false;
	if (this.id==slc.tags.form_show){ // create new
		pars={
			value:"",
			oldvalue:"",
			mode:"add",
			id:"",
			color:"68,68,68",
			parentXY:$(this).position(),
			parentW:$(this).width()
		}
	} else if ($(this).hasClass(slc.tags.tags)){ // edit
		var value=$(this).find(slc.tags.tags_name_jQ).html();
		pars={
			id:this.id,
			value:value,
			oldvalue:value,
			mode:"edit",
			color:tagsBase.selectFirst("tags","id",getTagId(this.id)).color,
			parentXY:$(this).position(),
			parentW:$(this).width()
		}
	}
	if (pars){
		popup.hidden();
		tagsFormShow(pars);
	}
	return false;
}
function tagsFormShow(pars){
	cash.tags.form_value.val(undeff(pars.value));
	tag_form.oldvalue=undeff(pars.oldvalue);
	tag_form.mode=pars.mode;
	tag_form.id=pars.id;
	tag_form.oldcolor=pars.color;
	tag_form.color=pars.color;
	tag_form.newcolor=pars.color;
	tagFormSetColor(pars.color);
	cash.tags.form_label.html(tag_form.text[pars.mode]);
	cash.tags.form.removeClass().addClass(tag_form.class_name[pars.mode]);
	var newcss={
		"top":pars.parentXY.top-cash.tags.form.height()+5,
		"left":pars.parentXY.left+pars.parentW/2-cash.tags.form.width()/2
	}
	if (IE==6) {
		newcss.top-=5;
		newcss.left+=10;
	}
	cash.tags.form.css(newcss);
	cash.tags.form_value.focus();
	return false;
}
function tagsFormHide(){
	cash.tags.form.css({"left":"-3000px"});
	return false;
}
/* Color picker */
function initColorPicker(){
	$('#tag_color_block').ColorPicker({
		color: '#0000ff',
		onShow: function (cp) {
			$(cp).fadeIn(500);
			return false;
		},
		onHide: function (cp) {
			$(cp).fadeOut(500);
			return false;
		},
		onChange: function (hsb, hex, rgb) {
			tag_form.newcolor=rgb.r+","+rgb.g+","+rgb.b;
		}
	});
	cash.tags.cp=$(".colorpicker");
	cash.tags.cp.find(".button-cancel").click(tagColorCancel_e);
	cash.tags.cp.find(".button-apply").click(tagColorApply_e);
}
function tagFormSetColor(rgb){
	cash.tags.form.find("#tag_color").css({"background-color":"rgb("+rgb+")"});
}
function tagColorCancel_e(){
	tag_form.color=tag_form.oldcolor;
	tag_form.newcolor=tag_form.oldcolor;
	cash.tags.cp.hide();
	return false;
}
function tagColorApply_e(){
	tag_form.color=tag_form.newcolor;
	tagFormSetColor(tag_form.color);
	cash.tags.cp.hide();
	return false;
}
/* -- End: Tag Form -- */
function addTagToTask(task,tag){
	var task_id=task.id;
	if (!tasks[task_id]){
		tasks[task_id]={};
		tasks[task_id].tags="";
		tasks[task_id].tag_ids="";
	}
	tasks[task_id].tags+=tag;
	tasks[task_id].tag_ids+=tag_id[tag];
}
/* Filter */
function simple_tag_filter(tag){ // to delete
	var tasks=$(".task");
	if (tag=="*"){
		tasks.css({"display":"block"});
	} else {
		var list=tagsBase.selectRows("task-tags",{"name":"tag_id","value":tag.id},["task_id"]);
		var tmp=[];
		for (var i=0,length=list.length;i<length;i++){
			tmp[i]="#task_"+list[i].task_id;
		}
		var selector=tmp.toString();
		toogleVisible(tasks,selector);
	}
}
function smart_tag_filter(tagids){ // tags is array and underconstruction
	var tasks=$(".task");
	if (tagids=="*"){
		tasks.css({"display":"block"});
	} else {
		var list=[];
		var t;
		for (var i=0,length=tagids.length;i<length;i++){
			t=tagsBase.selectRows("task-tags",{"name":"tag_id","value":tagids[i]},["task_id"]);
			if (t){
				list[i]=[];
				for (var j=0,length2=t.length;j<length2;j++){
					list[i][j]=t[j].task_id;
				}
			} else {
				list=[];
				break;
			}
		}
		var tmp=[];
		if (list.length!=0){
			tmp=list[0];
			if (list.length>1){
				tmp=crossing(list);
			}
		}
		if (tmp.length>0){
			for (var z=0,length3=tmp.length;z<length3;z++){
				tmp[z]="#task_"+tmp[z];
			}
			var selector=tmp.toString();
			toogleVisible(tasks,selector);
		} else {
			tasks.css({"display":"none"});
		}
	}
}
/* -- Events -- */
function tagClick_e(event){
	if (event.ctrlKey || event.metaKey){
		if ($(this).hasClass("tag_selected")){
			$(this).removeClass("tag_selected");
		} else {
			$(this).addClass("tag_selected");
		}
	} else if (event.shiftKey) {
	} else {
		if ($(this).hasClass("tag_selected")){
		simple_tag_filter("*");
		$(this).removeClass("tag_selected");
		} else {
			cash.tags.parent.find(".tag_selected").removeClass("tag_selected");
			$(this).addClass("tag_selected");
		}
	}
	$(this).trigger("tagsSelected");
}
function tagsSelected_e(event){
	var tags=cash.tags.parent.find(".tag_selected");
	var args;
	if (tags.length>0){
		args=new Array();
		for (var i=0,length=tags.length;i<length;i++){
			args[i]=tags[i].id.split("tag_")[1];
		}
	} else {
		args="*";
	}
	smart_tag_filter(args);
}
function tagEdit(){ // +ADD
	var form=cash.tags.form;
	var value=cash.tags.form_value.val();
	if (trueTags(value)){
		var tag={};
		var mode=tag_form.mode;
		if (mode=="add"){
			tag.name=value;
			tag.color=tag_form.color;
			saveTagAdd(tag);
		} else if (mode=="edit"){
			var oldvalue=tag_form.oldvalue;
			if (value!=oldvalue && tagsBase.checkToUniq("tags",{"name":value}) || tag_form.color!=tag_form.oldcolor){
				tag.name=oldvalue;
				tag.new_name=value;
				tag.id=tag_form.id;
				// if (smartTrim(tag_form.oldcolor)!=smartTrim(tag_form.color)){
					tag.color=tag_form.color;
				// }
				saveTagEdit(tag);
				tagRename_dom(tag);
				tagsBase.update("tags",{"id":getTagId(tag.id),"name":value,"color":tag.color});
				tagUpdate_e(tag);
			} else {
				message_show(messages.tags.noUniq);
			}
		}
		form.trigger("tagsChange");
	} else {
		// Show messages
	}
	tagsFormHide();
	return false;
}
function tagsPreDelete(){
	if (confirm('Вы уверены, что хотите удалить tag "'+tag_form.oldvalue+'"?')) {
      	var tag={
			id:getTagId(tag_form.id)
		}
		saveTagDelete(tag);
		tagDelete_dom(tag);
		tagDeleteFromBase(tag);
		simple_tag_filter("*");
		tags_fcbc();
    }
	tagsFormHide();
	return false;
}
function addNewTags_e(){}
function tagAdd2(answer){ // to refactoring
	eval("var data="+answer);
	if (data.status=="ok"){
		var tag={};
		tag.id=data.id;
		tag.name=this.tag_name;
		tag.color=this.tag_color;
		tags_name_id[tag.name]="tag_"+tag.id;
		tags_global[tag.id]=tag.name;
		tagAdd_dom(tag);
		tagsBase.push("tags",tag);
		tags_fcbc();
	}
}
function tagUpdate_e(tag){
	taskRefreshColors(tag);
}
/* -- modify DOM -- */
function tagAdd_dom(tag){
	cash.tags.parent.append(tagGetTemplate(tag));
	cash.tags.objs.add(cash.tags.wrap.find("#tag_"+tag.id));
}
function tagRename_dom(tag){
	var tag_name=cash.tags.wrap.find("#"+tag.id+" .tagname");
	tag_name.html(deff(tag.new_name));
	tags_name_id[tag.new_name]=tags_name_id[tag.name];
	if (tag.color){
		cash.tags.wrap.find("#"+tag.id).css({"color":"rgb("+tag.color+")"});
	}
	delete tags_name_id[tag.name];
}
function tagDelete_dom(tag){
	cash.tags.parent.find("#tag_"+tag.id).remove();
}
/* -- Requests -- */
url.tags={};
url.tags.add='/tags.json';
url.tags.edit='/tags/';
url.tags.del='/tags/';
function saveTagAdd(tag){
	if (tagsBase.checkToUniq("tags",{"name":tag.name})){
		var pars={
			data:"tag[name]="+tag.name,
			type:"POST",
			tag_name:tag.name,
			tag_color:tag.color,
			mode:tag.mode,
			url:url.tags.add,
			success:tagAdd2
		}
		if (tag.color) pars.data=pars.data+"&tag[color]="+tag.color;
		sendRQ(pars);
	} else {
		message_show(messages.tags.noUniq);
	}
}
function saveTagDelete(tag){
	var pars={
		data:"_method=delete",
		type:"POST",
		url:url.tags.del+tag.id + ".json"
	}
	sendRQ(pars);
}
function saveTagEdit(tag){
	var pars={
		data:"tag[name]="+tag.new_name,
		type:"POST",
		url:url.tags.edit+tag.id.split('_')[1] + ".json"
	}
	if (tag.color) pars.data=pars.data+"&tag[color]="+tag.color;
	pars.data+='&_method=put';
	sendRQ(pars);
}
function saveTaskTags(task_id,tags){
	var pars={
		data:"task[tag_names]="+deff(tags)+"&_method=put",
		url:url.tasks.save+task_id
	}
	sendRQ(pars);
}
/* ===[ End: Tags ]=== */
/* ============================[ End: Tasks ]============================ */
/* ============================[ Requests ]============================ */
$(document).ajaxSend(function(event, request, settings){
	$("#notice").remove();
	$("#error").remove();
	if (typeof(AUTH_TOKEN) == "undefined") return;
	settings.data = settings.data || "";
	settings.data += (settings.data ? "&" : "") + "authenticity_token=" + encodeURIComponent(AUTH_TOKEN);
});
function sendRQ(pars){
	var ajaxSettings=jQuery.extend({
			dataType:'text',
			type:'POST'
		}, pars);
	$.ajax(ajaxSettings);
}
/* --- Реализация очереди аякса --- */
function ajax_queue(){
	var self=this;
	this.length=0;
	this.init=function(){
		$(document).ajaxComplete(queue.dec).ajaxSend(queue.inc);
	}
	this.inc=function(){
		++self.length;
		if (self.length==1){ 
			message_hide();
			loading.css({"display":"block"});
		}
	}
	this.dec=function(){
		--self.length;
		if (self.length==0){ 
			loading.css({"display":"none"});
		}
	}
}
var queue=new ajax_queue;
/* archive */
var achive={ // to refactoring
	init:function(selector){
		$(selector).click(achive.getList);
	},
	getList:function(event){
		sendRQ({
			url:'/tasks/completed',
			data:'sort_type='+$(this).attr("href"),
			success:achive.showList
		});
		$("#loading").show();
		return false;
	},
	showList:function(answer){
		$("#completed_tasks").empty().append(answer);
		$("#loading").hide();
	}
}

/* =========================[ End: Requests ]========================== */
/* ============================[ Example ]============================= */
/* ===[ Example ]=== */
/* --- Example --- */
/* -- Example -- */
/* --- Events --- */
/* --- Callbacks --- */
/* --- Requests --- */
/* ============================[ End: Example ]=========================== */