about summary refs log tree commit homepage
path: root/examples/rails_app-2.3.4/public/javascripts/ajax_pull/ajax_pull.js
diff options
context:
space:
mode:
Diffstat (limited to 'examples/rails_app-2.3.4/public/javascripts/ajax_pull/ajax_pull.js')
-rw-r--r--examples/rails_app-2.3.4/public/javascripts/ajax_pull/ajax_pull.js85
1 files changed, 85 insertions, 0 deletions
diff --git a/examples/rails_app-2.3.4/public/javascripts/ajax_pull/ajax_pull.js b/examples/rails_app-2.3.4/public/javascripts/ajax_pull/ajax_pull.js
new file mode 100644
index 0000000..8b0236d
--- /dev/null
+++ b/examples/rails_app-2.3.4/public/javascripts/ajax_pull/ajax_pull.js
@@ -0,0 +1,85 @@
+// ref: http://rubyforge.org/pipermail/mongrel-users/2007-July/003747.html
+// ry dahl <ry@tinyclouds.org>
+// Don't Poll. Pull!
+// version 0.1
+Ajax.Pull = Class.create();
+
+Ajax.Pull.prototype = Object.extend(Ajax.Request.prototype, {
+  initialize: function(url, options) {
+    this.handler = options.handler;
+    this.frequency = options.frequency || 0.5;
+    options['method'] = options['method'] || 'get';
+    this.setOptions(options);
+    this.transport = Ajax.getTransport();
+
+    this.request(url);
+    this.startPuller();
+  },
+
+  startPuller: function() {
+    this.pullPointer = 0;
+    this.puller = new PeriodicalExecuter(this.pull.bind(this), this.frequency);
+  },
+
+  pull: function() {
+    if(this.transport.readyState < 3) {
+      return; // not receiving yet
+    } else if (this._complete) {
+      this.puller.stop(); // this is our last pull
+    }
+
+    var slice = this.transport.responseText.slice(this.pullPointer);
+
+    (this.options.pullDebugger || Prototype.emptyFunction)(
+        'slice: <code>' + slice + '</code>');
+
+    slice.extractJSON().each((function(statement) {
+      (this.options.pullDebugger || Prototype.emptyFunction)(
+          'extracted statement: <code>' + statement + '</code>');
+      this.handler(eval( '(' + statement + ')' ));
+      this.pullPointer += statement.length + 1;
+    }).bind(this));
+
+  },
+
+});
+
+
+Object.extend(String.prototype, {
+  extractJSON: function() {
+    var insideString = false;
+    var sBrackets = cBrackets = parens = 0;
+    var statements = new Array();
+    var start = i = 0;
+    for(i = 0; i < this.length; i++) {
+      if( cBrackets < 0 || sBrackets < 0 || parens < 0 ) {
+        // raise syntax error?
+      }
+      if(insideString) {
+        switch(this[i]) {
+          case '\\': i++; break;
+          case '"': insideString = false; break;
+        }
+      } else {
+        switch(this[i]) {
+          case '"': insideString = true; break;
+          case '{': cBrackets++; break;
+          case '}': cBrackets--; break;
+          case '[': sBrackets++; break;
+          case ']': sBrackets--; break;
+          case '(': parens++; break;
+          case ')': parens++; break;
+          case ';':
+            if(cBrackets == 0 && sBrackets == 0 && parens == 0) {
+              statements.push(this.slice(start, i));
+              start = i+1;
+            }
+        }
+      }
+      // if the last statement doesn't have a semicolon, it's okay
+      // if(i != start && cBrackets == 0 && sBrackets == 0 && parens == 0)
+      //         statements.push(this.slice(start));
+    }
+    return statements;
+  }
+});