<script>
document.createElement('header');
document.createElement('section');
document.createElement('footer');
var cookieToDo = "mToDo";
var cookieExToDo = "mExToDo";
var cookieExToDoEnd = "mExToDoEnd";
var cookieTimer = "mToDoTime";
var cookieTimerPause = "mToDoTimePause";
var todo = new Array();
var extodo = new Array();
var extodoend = new Array();
var curTime = parseInt( new Date().getTime() / 1000, 10 );
var pauseTime = curTime;
var isTime = false;
var isTimePause = false;
var tMonth = 1000 * 60 * 60 * 24 * 31;
var tWeek = 1000 * 60 * 60 * 24 * 7;
var defaultMess = 'Что нужно делать?';
var value, i, index, time;
var isIE = (String(typeof(document.all)) != "undefined"); // для проверки ie 
function trim(str) {
 return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}
function plural(n, f1, f2, f5) {
 n = Math.abs(n) % 100;
 i = n % 10;
 if (n > 10 && n < 20) return f5;
 if (i > 1 && i < 5) return f2;
 if (i == 1) return f1;
 return f5;
}
function setCookie( name, value, expire ) {
 time = new Date();
 time.setTime( time.getTime() + expire );
 document.cookie = name + "=" + value + "; expires=" + time.toGMTString();
 return true;
}
function getCookie( name ) {
 var cSIndex = document.cookie.indexOf( name );
 if (cSIndex == -1) return false;
 cSIndex = document.cookie.indexOf( name + "=" )
 if (cSIndex == -1) return false;
 var cEIndex = document.cookie.indexOf( ";", cSIndex + ( name + "=" ).length );
 if (cEIndex == -1) cEIndex = document.cookie.length;
 return document.cookie.substring( cSIndex + ( name + "=" ).length, cEIndex );
}
function delCookie( name ) {
 if ( getCookie( name )) 
  document.cookie = name + "=; expires=Thu, 01-Jan-70 00:00:01 GMT";
}
function prepareCookie( name, value ) {
 var ret = new Array();
 for ( i = 0; i < value.length; ++i ) {
  ret.push( escape( value[i] ));
 }
 ret = ret.join( "&" );
 if ( ( name + "=" + value ).length >= 4086 ) 
  return false;
 return setCookie( name, ret, tMonth );
}
function clear() {
 isTime = false;
 isTimePause = false;
 curTime = 0;
 pauseTime = curTime;
 todo = new Array();
 extodo = new Array();
 extodoend = new Array();
 delCookie( cookieToDo );
 delCookie( cookieExToDo );
 delCookie( cookieExToDoEnd );
 delCookie( cookieTimer );
 delCookie( cookieTimerPause );
 $("newtodo").className = "hidden";
 $tag("footer").className = "hidden";
 return true;
}
function $(v) {return document.getElementById(v)}
function $tag(v) {return document.getElementsByTagName(v)[0]}
function $name(v) {return document.getElementsByName(v)}
function addToDo( value, arr, cookie ) {
 arr.push( value );
 if ( prepareCookie( cookie, arr )) { 
  return true;
 } else { 
  arr.pop();
  alert( "Слишком много записей. \nНадо бы что-то удалить." );
  return false;
 }
}
function delToDo( index, arr, cookie ) {
 arr.splice( index, 1 );
 prepareCookie( cookie, arr );
 if ( ! todo.length && ! extodo.length ) {
  clear();
 }
 return false;
}
function toToDo( index ) {
 if ( addToDo( extodo[index], todo, cookieToDo ) ) {
  extodo.splice( index, 1 );
  extodoend.splice( index, 1 );
  prepareCookie( cookieExToDo, extodo );
  prepareCookie( cookieExToDoEnd, extodoend );
 }
 if ( ! isTime ) {
  isTime = true;
 }
 if ( ! extodo.length ) {
  extodo = new Array();
  extodoend = new Array();
  delCookie( cookieExToDo );
  delCookie( cookieExToDoEnd );
 }
 refresh();
 return false;
}
function toExToDo( index ) {
 if ( addToDo( todo[index], extodo, cookieExToDo ) ) {
  time = parseInt( new Date().getTime() / 1000, 10 );
  time -= curTime;
  var min = parseInt( time / 60 % 60, 10);
  var hour = parseInt( time / 3600, 10);
  value = ( hour > 0 ? hour + " ч. " : "" ) + "" + min + " мин.";
  extodoend.push( value );
  prepareCookie( cookieExToDoEnd, extodoend );
  todo.splice( index, 1 );
  prepareCookie( cookieToDo, todo );
  if ( todo.length <= 1 && getCookie( "footer" ) != 'hidden' ) {
   $tag("footer").className = "";
  }
  if ( ! extodo.length ) {
   todo = new Array();
   delCookie( cookieToDo );
  }
 }
 refresh();
 return false;
}
function timerPause() {
 if ( ! todo.length && extodo.length && ! isTimePause ) {
  isTimePause = true;
  pauseTime = parseInt( new Date().getTime() / 1000, 10 );
  setCookie( cookieTimerPause, pauseTime, tMonth );
  return true;
 }
 return false;
}
function timerStart() {
 //alert(todo.length + '\n' + isTimePause);
 if ( isTimePause && todo.length ) {
  isTime = true;
  isTimePause = false;
  var tTime = parseInt( new Date().getTime() / 1000, 10 );
  curTime += ( tTime - pauseTime );
  setCookie( cookieTimer, curTime, tMonth );
  delCookie( cookieTimerPause );
  return true;
 }
 return false;
}
function timer() {
 var min = 0;
 var hour = 0;
 var sec = 0;
 if ( isTime && ! isTimePause ) {
  time = parseInt( new Date().getTime() / 1000, 10 );
  time -= curTime;
  min = parseInt( time / 60 % 60, 10);
  hour = parseInt( time / 3600, 10);
  sec = parseInt( time % 60, 10);
  hour = hour > 0 ? hour + " " + plural( hour, "час", "часа", "часов" ) : "";
  min = min > 0 ? min + " " + plural( min, "минута", "минуты", "минут" ) : "";
  value = "<span>" + hour + " " + min + "</span> " + sec;
 } else if ( isTimePause ) {
  time = pauseTime - curTime;
  min = parseInt( time / 60 % 60, 10);
  hour = parseInt( time / 3600, 10);
  sec = parseInt( time % 60, 10);
  hour = hour > 0 ? hour + " " + plural( hour, "час", "часа", "часов" ) : "";
  min = min > 0 ? min + " " + plural( min, "минута", "минуты", "минут" ) : "";
  value = "<span>" + hour + " " + min + "</span> " + sec;
 } else {
  value = "<span></span>";
 }
 $("timer").innerHTML = value;
 setTimeout( "timer()", 1000 );
}
function add() {
 value = $("new").value;
 if ( value.length < 1 ) {
  return false;
 }
 if ( value == defaultMess ) {
  return false;
 }
 value = value.replace( /</, "<" );
 value = value.replace( />/, ">" );
 if ( addToDo( value, todo, cookieToDo )) {
  $("new").value = "";
 }
 if ( ! isTime ) {
  isTime = true;
  isTimePause = false;
  curTime = parseInt( new Date().getTime() / 1000, 10 );
  setCookie( cookieTimer, curTime, 1000 * 60 * 60 * 24 * 31 );
  $("newtodo").className = "";
 } 
 return true;
}
function delTD( index ) {
 delToDo( index, todo, cookieToDo );
 refresh();
 return true;
}
function delETD( index ) {
 delToDo( index, extodo, cookieExToDo );
 refresh();
 return true;
}
function refresh() {
 timerStart();
 timerPause();
 var list = "";
 for ( i = 0; i < todo.length; ++i ) {
  list += '<li><label><input type="checkbox" onclick="toExToDo(' + i + ');return false;" /> ' + todo[i] + ' <a href="#" title="Удалить" onclick="delTD(' + i + ');return false;">×</a></label></li>';
 }
 for ( i = 0; i < extodo.length; ++i ) {
  list += '<li class="OK"><label><input type="checkbox" checked onclick="toToDo(' + i + ');return false;"/> ' + extodo[i] + ' <a href="#" title="Удалить" onclick="delETD(' + i + ');return false;">×</a> ' + extodoend[i] + '</label></li>';
 }
 $tag("ul").innerHTML = list;
}
//     добавление сразу нескольких заданий через textarea,  
//    \n - как разделитель
	function multiadd() {
		value = $("newlist").value.replace(defaultMess,'');
		if ( value.length < 1 ) {
			return false;
		}
		value = value.replace( /</, "<" );
		value = value.replace( />/, ">" );
		var tasks_arr = value.split('\n', 999);
		value='x';
		for( i=0; i < tasks_arr.length; i++) {
			if(trim(tasks_arr[i])!='') {
				todo.push( tasks_arr[i] );
				value = value+'&'+escape(tasks_arr[i]);
			}
		}
		value=value.replace('x&','');
		time = new Date();
		time.setTime( time.getTime() + tMonth );
		if(getCookie(cookieToDo) != false){
			value = getCookie(cookieToDo) + '&' + value;
		}
		document.cookie = cookieToDo + "=" + value + "; expires=" + time.toGMTString();
		if ( ! isTime ) {
			isTime = true;
			isTimePause = false;
			curTime = parseInt( new Date().getTime() / 1000, 10 );
			setCookie( cookieTimer, curTime, 1000 * 60 * 60 * 24 * 31 );
			$("newtodo").className = "";
		}
		$("newlist").value='';
		refresh();
		return true;
	}
function init() {
 var is_chrome = false;
 if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
  is_chrome = true;
 }
 if( getCookie( "testCookie" ) != "testCookie" ) {
  var testCookie = new String( window.location.href ).split("?")[1];
  if ( testCookie != "testCookie" ) {
   setCookie( "testCookie", "testCookie", 1000 * 60 * 60 * 24 * 31 );
   window.location.href = "?testCookie";
   exit;
  } else {
   if ( is_chrome && window.location.href.substr( 0, 4 ) != 'http' ) {
    $("chrome").className = "ahtung";
   }
   else {
    $("nocookie").className = "ahtung";
   }
  }
 }
 value = getCookie( cookieToDo );
 if ( value ) {
  todo = value.split( "&" );
  for ( i = 0; i < todo.length; ++i )
   todo[i] = unescape(todo[i]);
 }
 value = getCookie( cookieExToDo );
 if ( value ) {
  extodo = value.split( "&" );
  for ( i = 0; i < extodo.length; ++i )
   extodo[i] = unescape(extodo[i]);
 }
 value = getCookie( cookieExToDoEnd );
 if ( value ) {
  extodoend = value.split( "&" );
  for ( i = 0; i < extodoend.length; ++i )
   extodoend[i] = unescape(extodoend[i]);
 }
	// новый список
	$("newtodo").onclick = function() {
		clear();
		refresh();
		return false;
	}
	// удаляем задание
	$("del").onclick = function() {
		$tag("footer").className = "hidden";
		setCookie( "footer", "hidden", tWeek );
		return false;
	};
	// убираем стандартный текст из textarea при фокусе
	$("newlist").onfocus = function() {
		if ( this.value == defaultMess ){
		   this.value = "";
		 }
	};
	// отправка формы добавления нескольких заданий
	$("multiadd").onsubmit = function() {
		multiadd();
		return false;
	}
	// клик по Enter, кнопки отправки
	$("multiaddtodo").onclick = function () {
		multiadd();
		return false;
	};
	// отправка данных textarea по  Enter ctrl+enter ctrl+v
	$("newlist").onkeydown = function(event) {
		// ctrl+enter
		if((event.ctrlKey) && ((event.keyCode==10)||(event.keyCode==13))) {
			multiadd();
			return false;
		}
		// ctrl+v
		if((event.ctrlKey) && (event.keyCode==86)) {
				setTimeout(function() {if($("newlist").value.indexOf("\n")!=-1) {multiadd();} }, 200)
		}
		// enter
		if(event.keyCode==10 || event.keyCode==13) {
			multiadd();
			return false;
		}
	};
	// отправка при изменение содержимого(причём при добавлении несколькиз строк) и ухода фокуса с textarea
	$("newlist").onchange = function(event) {
		if(this.value.replace(' ', '')!='' && this.value.indexOf("\n")!=-1) {
			multiadd();
			return false;
		}
	};
	// при уходе фокуса с textarea  ставим стандартный текст
	$("newlist").onblur = function() {
		if($("newlist").value=='') {this.value = defaultMess;}
	};
 if ( ! todo.length && ! extodo.length ) {
 }
 if ( todo.length || extodo.length ) {
  isTime = true;
  curTime = parseInt( getCookie( cookieTimer ) , 10);
  pauseTime = parseInt( getCookie( cookieTimerPause ) , 10 );
  if ( pauseTime && ! todo.length ) {
   isTimePause = true;
  }
  $("newtodo").className = "";
 }
 if ( ! curTime ) {
  curTime = parseInt( new Date().getTime() / 1000, 10 );
 }
 $("newlist").value = defaultMess;
 refresh();
 timer();
}
</script>