-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathhistory.js
125 lines (123 loc) · 5.06 KB
/
history.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
(function(window, document, undefined){
var REMOVE = "remove", LOAD = "load", RENAME = "rename", FORM = "rename-form";
var HIDE = "turtle-hide";
var REVISION_HTML = '\
<div class="revision">\
<form class="rename-form turtle-hide">\
<input type="text" name="newname" size="60">\
</form>\
<a href="" class="load">version</a>\
<a href="" class="rename">✎</a>\
<a href="" class="remove">✕</a>\
</div>\
';
function TurtleHistory(input, localStorage, options) {
var historyID = input.id+"-history";
if (!localStorage)
localStorage = window.localStorage;
var element = document.getElementById(historyID);
if (!element) {
element = document.createElement("section");
element.setAttribute("id", historyID);
input.form.parentNode.appendChild(element);
}
var self = Turtle.extend(this, Turtle.extend({
prefix: historyID+"-",
input: input,
element: element,
storage: new Turtle.Storage(historyID, localStorage)
}, options));
input.form.addEventListener("submit", function (event) {
return self.handleEvent(event);
});
element.addEventListener("click", function(event) {return self.handleEvent(event);});
return self;
}
Turtle.extend(TurtleHistory.prototype, {
fullRevisionName: function(name) {
return this.prefix+name;
},
syncLocalStorage: function syncLocalStorage() {
var self = this;
self.element.innerHTML = "";
var keys = self.storage.keys();
keys.map(function(key) {self.createWithoutSave(key);});
return;
},
createWithoutSave: function createWithoutSave(name) {
return this.create(name, true);
},
create: function create(name, withoutSave) {
var self = this;
if (document.getElementById(this.fullRevisionName(name))) {
return;
}
var placeholder = document.createElement("div");
placeholder.innerHTML = REVISION_HTML;
var newnode = placeholder.getElementsByClassName("revision")[0];
newnode.setAttribute("id", this.fullRevisionName(name));
newnode.setAttribute("data-revision", name);
newnode.getElementsByClassName(LOAD)[0].textContent = name;
newnode.getElementsByClassName(FORM)[0].addEventListener("submit", function (e) {
return self.handleEvent(e);
});
this.element.appendChild(newnode);
if (!withoutSave)
this.storage.setItem(name, this.input.value);
return;
},
handleEvent: function (event) {
event.stopPropagation();
event.preventDefault();
var revision = event.target.parentNode.getAttribute("data-revision");
if (event.target === this.input.form) {
var revisionName = this.useInputValueForRevisionName ?
this.input.value : new Date().toJSON();
this.create(revisionName);
return false;
}
if (event.target.className.indexOf(FORM) > -1) {
this.rename(revision, event.target.newname.value);
return false;
}
var cases = {};
cases[REMOVE] = this.remove;
cases[LOAD] = this.load;
cases[RENAME] = this.show_form;
if (cases[event.target.className])
cases[event.target.className].call(this, revision);
return false;
},
load: function (revision) {
this.input.value = this.storage.getItem(revision);
var event = document.createEvent("HTMLEvents");
event.initEvent("change", true, true ); // event type,bubbling,cancelable
this.input.dispatchEvent(event);
return;
},
remove: function (revision) {
this.storage.removeItem(revision);
var element = document.getElementById(this.fullRevisionName(revision));
if (element && element.parentNode && element.parentNode.removeChild)
element.parentNode.removeChild(element);
return;
},
show_form: function (revision) {
var element = document.getElementById(this.fullRevisionName(revision));
var form = element.getElementsByClassName(FORM)[0];
if (form) {
form.className = form.className.replace(HIDE,'').replace(/ +$/,'');
}
return;
},
rename: function (revision, newname) {
this.storage.setItem(newname,
this.storage.getItem(revision));
this.storage.removeItem(revision);
this.remove(revision);
this.create(newname);
return;
}
});
window.Turtle.History = TurtleHistory;
})(this, this.document);