diff --git a/Cripi/calendar.html b/Cripi/calendar.html
new file mode 100644
index 0000000..7328183
--- /dev/null
+++ b/Cripi/calendar.html
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+События
+
+
+
+Добро пожаловать в конструктор событий, Username!
+
+
+
+
Создайте своё собственное событие
+
+- Написать валидацию формы
+
+
+
+
+
+
+
+
+
Созданные события
+
Двойной щелчок по заголовку - сортировка по выбранному столбцу.
+
+
+
+
+
+
+
+
diff --git a/Cripi/events.js b/Cripi/events.js
new file mode 100644
index 0000000..8e3e605
--- /dev/null
+++ b/Cripi/events.js
@@ -0,0 +1,148 @@
+// JavaScript Document
+function inherits(Constructor, SuperConstructor){
+var F = function () {};
+F.prototype = SuperConstructor.prototype;
+Constructor.prototype = new F()
+};
+function isDate(date){
+ if (date === ''){
+ return true
+ }
+ else {
+ return false
+ }
+}
+
+/*var Model = function (data) {
+ "use strict";
+ var keyName;
+ for (keyName in data) {
+ if (data.hasOwnProperty(keyName)) {
+ this[keyName] = data[keyName];
+ }
+ }
+};
+/**
+ * Set - устанавливает аттрибуты и значения атрибутов, в соответсвии с принятым в качестве параметра объектом
+ *
+ * @param {Object} attributes
+ *
+ * @example
+ * item.set({title: "March 20", content: "In his eyes she eclipses..."});
+ */
+/*Model.prototype.set = function (attributes) {
+ for (var key in attributes){
+ if (attributes.hasOwnProperty(key)) {
+ this[key] = attributes[key];
+ }
+ }
+};
+
+/**
+ * Get возвращает запрашиваемое свойство у объекта
+ *
+ * @param {Object} attributes
+ */
+/*Model.prototype.get = function (attribute) {
+ if (this.hasOwnProperty(attribute)) {
+ return this[attribute];
+ }
+ return undefined;
+};
+/**
+ *
+ * @param {Object} attributes
+ */
+/*Model.prototype.validate = function (attributes) {
+ throw new Error('this is Abstract method');
+};
+
+*/
+var Event = function(data){
+ var keyName;
+ for (keyName in data) {
+ if (data.hasOwnProperty(keyName)) {
+ this[keyName] = data[keyName];
+ }
+ }
+};
+Event.prototype.r = function(){
+ console.log('tratatatata')
+}
+Event.prototype.validate = function() {
+ //'use strict';
+ var errorList = [];/*
+ if (this.name === undefined){
+ this.name = 'Новое событие'
+ }
+ if (!isDate(this.start)){
+ errorList.push('Неверно указана дата начала события.')
+ }
+ if (!isDate(this.end)){
+ errorList.push('Неверно указана дата окончания события.')
+ }
+ /*if (this.start < this.end){
+ errorList.push('Время начала события должно быть раньше времени окончания.')
+ }
+ */
+ /**
+ return {
+ "start": DateStart || new Date(),
+ "end": DateFinish,
+ "name": Call || "Новое событие",
+ "description": Description || "Описание события",
+ "parent": Parent || {},
+ "childs": Childs || [],
+ "comments": Comments || [],
+ "peoples": Peoples || [],
+ "location": Location || {},
+ "private": Private || False,
+ "rank": Rank || 0,
+ "EvRS": EvRS || 18,
+ "Link": Link || ''
+ }
+ */
+ return errorList
+
+};
+
+
+
+var Collection = function(data){
+ this.items = [];
+ var i
+ for (var i in data){
+ this.items.push(data[i]);
+ }
+};
+Collection.prototype.add = function(i){
+ this.items.push(i);
+}
+//Collection.prototype = new Model();
+
+var Events = function(){};
+Events.prototype = new Collection()
+
+Events.prototype.sortByStartTime = function(){}
+Events.prototype.sortByEndTime = function(){}
+Events.prototype.previos = function(){}
+Events.prototype.futures = function(){}
+Events.prototype.filterByField = function(){}
+Events.prototype.myEvents = function(){}
+Events.prototype.eventsWhithMe = function(){}
+
+/////////////////////////////////////////////////////////////////////////
+e = new Event({"start": new Date(2012, 9, 3, 19, 00, 00),
+ "end": new Date(2012, 9, 3, 20, 00, 00),
+ "name": "1 лекция по JavaScript",
+ "description": "Обзор языка",
+ "parent": {},
+ "childs": [],
+ "comments": ['Красивенько', 'А мы могли бы...'],
+ "people": [],
+ "location": {},
+ "private": true,
+ "rank": 4,
+ "EvRS": 16,
+ "Link": 'http://cripi.ru/#javascript'});
+
diff --git a/Cripi/main.css b/Cripi/main.css
new file mode 100644
index 0000000..ae931b4
--- /dev/null
+++ b/Cripi/main.css
@@ -0,0 +1,23 @@
+@charset "utf-8";
+/* CSS Document */
+
+#username {border-bottom:dotted thin;}
+#createButton{padding: 10px 20px;
+ background:#0CF;
+ color:#FFF;}
+/*#tableOfEvents {}*/
+#tableOfEvents tr td.nodata {border:#000 thin solid;
+ background:#FDD;
+ padding:5px;
+ }
+#tableOfEvents tr td{border:#000 thin solid;
+ background:#DFFFED;
+ padding:5px;
+ min-width:100px;
+ max-width:250px;}
+#tableOfEvents tr th{border:#000 thin solid;
+ background:#CFC;
+ padding:5px;
+ min-width:100px;
+ max-width:250px;}
+
diff --git a/Cripi/move.js b/Cripi/move.js
new file mode 100644
index 0000000..0df14c2
--- /dev/null
+++ b/Cripi/move.js
@@ -0,0 +1,155 @@
+// JavaScript Document
+var index=0;
+var eventFields = {'user':'Пользователь',
+'call':'Название события',
+'dateStart':'Дата начала',
+'dateFinish':'Дата окончания',
+'description':'Описание',
+'location':'Место проведения',
+'parent':'Предшествующие события',
+'people':'Участники',
+'url':'Ссылка на событие в сети',
+'private':'Приватность события',
+'EvRS':'Возрастные ограничения'};
+var constructorFormFields = ['call', 'dateStart', 'dateFinish', 'description', 'people', 'url'];
+var headSotrEventFlag = false;
+
+var ourEvents = new Events();
+
+/////////////////////Поле username//////////////////////////////////////
+var userinput = document.getElementById("userinput");
+var userspan= document.getElementById('username');
+userinput.style.display="none";
+userinput.value = userspan.innerHTML;
+userinput.addEventListener('blur', function(event){
+ userinput.style.display ="none";
+ userspan.innerHTML=userinput.value;
+ userspan.style.display="";
+},true);
+userspan.addEventListener('click', function(event){
+ userspan.style.display="none";
+ userinput.value = userspan.innerHTML;
+ userinput.style.display="";
+ userinput.focus();
+},true);
+/////////////////////////////////////////////////////////////////////////
+function tableConstructor(obj,row){
+ /*
+ Создаёт строки в таблице.
+ Параметры объект добавляемый в талицу
+ Тип ячейки заголовок/простая.
+ */
+ tr = document.createElement('tr')
+ for (var i in eventFields){
+ td = document.createElement(row);
+ if (typeof obj[i] === "undefined" || obj[i]==''){
+ td.innerHTML = '';
+ td.setAttribute('class','nodata '+i);
+ }
+ else {
+ td.innerHTML = obj[i];
+ td.setAttribute('class',i);
+ };
+ tr.appendChild(td)
+ }
+ return tr
+}
+function addData(fieldId){
+ var formfield=document.getElementById(fieldId);
+ var result = formfield.value;
+ formfield.value = '';
+ return result;
+}
+var tab = document.getElementById('tableOfEvents');
+
+/////////////////Описание обработчика добавления события////////////////
+addButton = document.getElementById('createButton');
+addButton.addEventListener('click', function(event){
+ if (ourEvents.items.length==0){
+ tab.appendChild(tableConstructor(eventFields,'th'));
+ thList = document.getElementsByTagName('th');
+ for (var i=0; ib[sortedField]){
+ return -1};
+ if (a[sortedField] 0){
+ errorBlock = document.getElementById('errors')
+ for (var error in errors){
+ var li = document.createElement('li');
+ li.innerHTML = errors[error];
+ errorBlock.appendChild(li)
+ }
+ }
+ else {
+ for (var field in constructorFormFields){
+ document.getElementById(constructorFormFields[field]).value = "";
+ };
+ ourEvents.add(Item);
+ };
+
+
+ var option = document.createElement('option');
+ option.innerHTML=Item['call'];
+ option.setAttribute('value',Item['call']);
+ parentSelect.appendChild(option);
+ index+=1;
+ //////////////////////////////////////////////////////////////
+
+ tab.appendChild(tableConstructor(Item,'td'));
+
+}, true);
+/////////Окончание обработчика добавления события/////////////////
+
+/*keyDown
+keyUp
+KeyPressed*/
+/*event.keyCode
+event.CharCode*/
\ No newline at end of file