annotate media/js/openwebchat.js @ 78:0effc4481d18

refactored display code a bit
author Atul Varma <varmaa@toolness.com>
date Thu, 30 Apr 2009 18:15:32 -0700
parents 1c99c08d2a54
children 91f31d2030b9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
1 var OpenWebStorage = {
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
2 UnsupportedError: function UnsupportedError() {},
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
3
70
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
4 FakeStorage: function FakeStorage() {
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
5 var contents = {};
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
6
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
7 function deepCopy(obj) {
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
8 return JSON.parse(JSON.stringify(obj));
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
9 }
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
10
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
11 this.set = function set(key, value) {
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
12 contents[key] = deepCopy(value);
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
13 };
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
14
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
15 this.get = function get(key, defaultValue) {
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
16 if (key in contents)
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
17 return deepCopy(contents[key]);
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
18 return defaultValue;
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
19 };
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
20 },
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
21
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
22 DOMLocalStorage: function DOMLocalStorage() {
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
23 var self = this;
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
24 var localStorage = window.localStorage;
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
25
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
26 if (window.globalStorage)
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
27 localStorage = window.globalStorage[document.location.hostname];
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
28
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
29 if (!localStorage)
70
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
30 throw new OpenWebStorage.UnsupportedError('no local DOM storage');
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
31
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
32 self.set = function set(key, value) {
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
33 localStorage[key] = JSON.stringify(value);
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
34 };
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
35
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
36 self.get = function get(key, defaultValue) {
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
37 var value = defaultValue;
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
38
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
39 if (localStorage[key])
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
40 try {
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
41 value = JSON.parse(localStorage[key].value);
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
42 } catch (e) {}
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
43
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
44 return value;
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
45 };
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
46 }
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
47 };
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
48
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
49 var OpenWebChat = {
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
50 ClientStorage: function ClientStorage(owStorage, prefix) {
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
51 var self = this;
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
52 self.length = owStorage.get(prefix + 'length', 0);
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
53
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
54 self.get = function get(id) {
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
55 return owStorage.get(prefix + id);
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
56 };
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
57
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
58 self.append = function append(msg) {
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
59 owStorage.set(prefix + self.length, msg);
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
60 self.length += 1;
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
61 owStorage.set(prefix + 'length', self.length);
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
62 };
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
63 },
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
64
68
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
65 SEND_TIMEOUT: 10000,
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
66
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
67 LISTEN_TIMEOUT: 60000,
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
68
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
69 listenForMessages: function listenForMessages(options) {
64
559c48a58254 Added the option to long poll instead of using mime multipart.
Atul Varma <varmaa@toolness.com>
parents: 62
diff changeset
70 var self = this;
68
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
71
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
72 function processMessage(msg) {
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
73 options.storage.append(msg);
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
74 options.onMessage(msg);
64
559c48a58254 Added the option to long poll instead of using mime multipart.
Atul Varma <varmaa@toolness.com>
parents: 62
diff changeset
75 }
68
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
76
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
77 jQuery.ajax(
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
78 {type: 'GET',
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
79 url: 'listen',
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
80 data: {start: options.storage.length},
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
81 dataType: 'json',
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
82 timeout: self.LISTEN_TIMEOUT,
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
83 error: function(xhr, textStatus, errorThrown) {
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
84 if (textStatus == "timeout")
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
85 // Start another long poll.
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
86 self.listenForMessages(options);
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
87 else
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
88 options.onError([textStatus, errorThrown]);
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
89 },
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
90 success: function(data, textStatus) {
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
91 // TODO: Make sure data.messages is an array.
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
92 for (var i = 0; i < data.messages.length; i++)
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
93 processMessage(data.messages[i]);
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
94 // Start another long poll.
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
95 self.listenForMessages(options);
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
96 }
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
97 });
33
8146a59c8045 Added basic 'chat' functionality.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
98 },
8146a59c8045 Added basic 'chat' functionality.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
99
53
67ec969d4f0d If the sending of a message fails, the content is put back into the text field.
Atul Varma <varmaa@toolness.com>
parents: 52
diff changeset
100 sendMessage: function sendMessage(options) {
68
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
101 jQuery.ajax(
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
102 {type: 'POST',
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
103 url: 'send',
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
104 contentType: 'application/json',
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
105 data: JSON.stringify(options.message),
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
106 processData: false,
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
107 timeout: this.LISTEN_TIMEOUT,
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
108 error: function(xhr, textStatus, errorThrown) {
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
109 options.onError([textStatus, errorThrown]);
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
110 }
84bf6a3ac4ec All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
Atul Varma <varmaa@toolness.com>
parents: 64
diff changeset
111 });
33
8146a59c8045 Added basic 'chat' functionality.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
112 }
8146a59c8045 Added basic 'chat' functionality.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
113 };
8146a59c8045 Added basic 'chat' functionality.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
114
26
4a4b66f5229b Added open web chat module.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
115 $(window).ready(
4a4b66f5229b Added open web chat module.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
116 function() {
33
8146a59c8045 Added basic 'chat' functionality.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
117 var ENTER_KEYCODE = 13;
72
923709d7434f We now work on the iphone, albeit not very well.
Atul Varma <varmaa@toolness.com>
parents: 71
diff changeset
118 var RETURN_KEYCODE = 10;
923709d7434f We now work on the iphone, albeit not very well.
Atul Varma <varmaa@toolness.com>
parents: 71
diff changeset
119
70
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
120 var owStorage;
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
121
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
122 try {
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
123 owStorage = new OpenWebStorage.DOMLocalStorage();
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
124 } catch (e) {
71
801c45a9063a Fixed a TODO.
Atul Varma <varmaa@toolness.com>
parents: 70
diff changeset
125 if (e instanceof OpenWebStorage.UnsupportedError)
801c45a9063a Fixed a TODO.
Atul Varma <varmaa@toolness.com>
parents: 70
diff changeset
126 owStorage = new OpenWebStorage.FakeStorage();
801c45a9063a Fixed a TODO.
Atul Varma <varmaa@toolness.com>
parents: 70
diff changeset
127 else
801c45a9063a Fixed a TODO.
Atul Varma <varmaa@toolness.com>
parents: 70
diff changeset
128 throw e;
70
91767ca52ca9 Added support for safari via a new FakeStorage class (in the future we can make one that draws from sqlite).
Atul Varma <varmaa@toolness.com>
parents: 69
diff changeset
129 }
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
130
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
131 var convStorage = new OpenWebChat.ClientStorage(
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
132 owStorage,
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
133 '/conv' + document.location.pathname
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
134 );
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
135
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
136 $('#name').val(owStorage.get('name', "A Mysterious Stranger"));
50
f78b986ecb6e OWC now remembers your name.
Atul Varma <varmaa@toolness.com>
parents: 49
diff changeset
137 $('#name').blur(
f78b986ecb6e OWC now remembers your name.
Atul Varma <varmaa@toolness.com>
parents: 49
diff changeset
138 function() {
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
139 owStorage.set('name', $(this).val());
52
3071f85fb694 Last-message content is now saved if the user loses their connection, etc.
Atul Varma <varmaa@toolness.com>
parents: 50
diff changeset
140 });
3071f85fb694 Last-message content is now saved if the user loses their connection, etc.
Atul Varma <varmaa@toolness.com>
parents: 50
diff changeset
141
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
142 $('#outgoing-message').val(owStorage.get('lastMessage', ''));
52
3071f85fb694 Last-message content is now saved if the user loses their connection, etc.
Atul Varma <varmaa@toolness.com>
parents: 50
diff changeset
143 $('#outgoing-message').blur(
3071f85fb694 Last-message content is now saved if the user loses their connection, etc.
Atul Varma <varmaa@toolness.com>
parents: 50
diff changeset
144 function() {
3071f85fb694 Last-message content is now saved if the user loses their connection, etc.
Atul Varma <varmaa@toolness.com>
parents: 50
diff changeset
145 if ($(this).val())
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
146 owStorage.set('lastMessage', $(this).val());
50
f78b986ecb6e OWC now remembers your name.
Atul Varma <varmaa@toolness.com>
parents: 49
diff changeset
147 });
f78b986ecb6e OWC now remembers your name.
Atul Varma <varmaa@toolness.com>
parents: 49
diff changeset
148
34
10fcf63961d8 More misc. changes.
Atul Varma <varmaa@toolness.com>
parents: 33
diff changeset
149 $('#outgoing-message').focus();
10fcf63961d8 More misc. changes.
Atul Varma <varmaa@toolness.com>
parents: 33
diff changeset
150
77
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
151 function onKey(evt) {
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
152 var self = this;
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
153 var content = $(this).val();
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
154 var author = $('#name').val();
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
155 if (evt.keyCode == ENTER_KEYCODE ||
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
156 evt.keyCode == RETURN_KEYCODE) {
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
157 if (content) {
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
158 owStorage.set('lastMessage', content);
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
159 $(this).val('');
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
160 var msg = {content: content,
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
161 time: new Date()};
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
162 if (author)
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
163 msg.author = author;
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
164 OpenWebChat.sendMessage(
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
165 {message: msg,
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
166 onError: function(exception) {
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
167 $(self).val(content);
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
168 }
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
169 });
33
8146a59c8045 Added basic 'chat' functionality.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
170 }
77
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
171 evt.preventDefault();
72
923709d7434f We now work on the iphone, albeit not very well.
Atul Varma <varmaa@toolness.com>
parents: 71
diff changeset
172 }
77
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
173 }
72
923709d7434f We now work on the iphone, albeit not very well.
Atul Varma <varmaa@toolness.com>
parents: 71
diff changeset
174
923709d7434f We now work on the iphone, albeit not very well.
Atul Varma <varmaa@toolness.com>
parents: 71
diff changeset
175 $('#outgoing-message').keydown(onKey);
923709d7434f We now work on the iphone, albeit not very well.
Atul Varma <varmaa@toolness.com>
parents: 71
diff changeset
176 $('#outgoing-message').keyup(onKey);
33
8146a59c8045 Added basic 'chat' functionality.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
177
77
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
178 function scrollToBottom() {
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
179 window.scrollTo(0, $('#bottom').position().top);
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
180 }
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
181
78
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
182 function msg2dom(msg) {
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
183 var message = $('<div class="message"></div>');
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
184 message.append('<div class="author"></div>');
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
185 message.append('<div class="timestamp"></div>');
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
186 message.append('<div class="content"></div>');
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
187 message.append('<div class="raw-content"></div>');
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
188
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
189 $('.content', message).html(msg.content);
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
190 $('.raw-content', message).text(msg.content);
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
191
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
192 $('.author', message).text(msg.author);
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
193 $('.timestamp', message).text(msg.time);
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
194
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
195 return message;
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
196 }
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
197
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
198 var lastAuthor;
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
199
75
fb25fead3374 displaying long conversations shouldn't be as jerky now.
Atul Varma <varmaa@toolness.com>
parents: 73
diff changeset
200 function onMessage(msg, doAnimation) {
fb25fead3374 displaying long conversations shouldn't be as jerky now.
Atul Varma <varmaa@toolness.com>
parents: 73
diff changeset
201 if (typeof(doAnimation) == "undefined")
fb25fead3374 displaying long conversations shouldn't be as jerky now.
Atul Varma <varmaa@toolness.com>
parents: 73
diff changeset
202 doAnimation = true;
fb25fead3374 displaying long conversations shouldn't be as jerky now.
Atul Varma <varmaa@toolness.com>
parents: 73
diff changeset
203
69
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
204 if (owStorage.get('lastMessage') == msg.content)
9004f7daf4c4 Abstracted away localStorage into a generic storage interface to make this easier to port to other browsers.
Atul Varma <varmaa@toolness.com>
parents: 68
diff changeset
205 owStorage.set('lastMessage', '');
38
5fea1533e8ff Added dynamic detection of HTML.
Atul Varma <varmaa@toolness.com>
parents: 34
diff changeset
206
78
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
207 var message = msg2dom(msg);
52
3071f85fb694 Last-message content is now saved if the user loses their connection, etc.
Atul Varma <varmaa@toolness.com>
parents: 50
diff changeset
208
78
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
209 if (msg.author == lastAuthor)
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
210 $('.author', message).hide();
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
211 else
78
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
212 lastAuthor = msg.author;
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
213
77
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
214 if (doAnimation)
78
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
215 message.hide();
77
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
216
78
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
217 $('#incoming-messages').append(message);
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
218
77
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
219 if (doAnimation)
78
0effc4481d18 refactored display code a bit
Atul Varma <varmaa@toolness.com>
parents: 77
diff changeset
220 message.slideDown(scrollToBottom);
62
b7b9932823e4 We now store conversations in local/globalStorage.
Atul Varma <varmaa@toolness.com>
parents: 61
diff changeset
221 }
49
4e21d301ea27 Added a cap on the max num of messages that can be animating at once, so that browsers don't get overloaded.
Atul Varma <varmaa@toolness.com>
parents: 48
diff changeset
222
77
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
223 $('#incoming-messages').hide();
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
224
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
225 for (var i = 0; i < convStorage.length; i++)
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
226 onMessage(convStorage.get(i), false);
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
227
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
228 $('#incoming-messages').slideDown();
49
4e21d301ea27 Added a cap on the max num of messages that can be animating at once, so that browsers don't get overloaded.
Atul Varma <varmaa@toolness.com>
parents: 48
diff changeset
229
77
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
230 OpenWebChat.listenForMessages(
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
231 {storage: convStorage,
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
232 onMessage: onMessage,
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
233 onError: function onError(exception) {
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
234 if (window.console)
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
235 window.console.log('The error', exception, 'occurred.');
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
236 var error = $('#templates .error').clone();
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
237 error.hide();
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
238 $('#incoming-messages').append(error);
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
239 error.slideDown();
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
240 }
1c99c08d2a54 Sort of simplified message display a bit
Atul Varma <varmaa@toolness.com>
parents: 76
diff changeset
241 });
33
8146a59c8045 Added basic 'chat' functionality.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
242 });