Add analytics
[bus.git] / busui / owa / modules / base / js / includes / jquery / spy.js
blob:a/busui/owa/modules/base/js/includes/jquery/spy.js -> blob:b/busui/owa/modules/base/js/includes/jquery/spy.js
--- a/busui/owa/modules/base/js/includes/jquery/spy.js
+++ b/busui/owa/modules/base/js/includes/jquery/spy.js
@@ -1,1 +1,169 @@
+/*
+	jQuery Plugin spy (leftlogic.com/info/articles/jquery_spy2)
+	(c) 2006 Remy Sharp (leftlogic.com)
+	$Id: spy.js,v 1.4 2006/09/30 11:05:04 remy Exp $
+*/
+var spyRunning = 1;
 
+$.fn.spy = function(settings) {
+	var spy = this;
+	spy.epoch = new Date(1970, 0, 1);
+	spy.last = '';
+	spy.parsing = 0;
+	spy.waitTimer = 0;
+	spy.json = null;
+	
+	if (!settings.ajax) {
+		alert("An AJAX/AJAH URL must be set for the spy to work.");
+		return;
+	}
+	
+	spy.attachHolder = function() {
+		// not mad on this, but the only way to parse HTML collections
+		if (o.method == 'html')
+			$('body').append('<div style="display: none!important;" id="_spyTmp"></div>');
+	}
+
+	// returns true for 'no dupe', and false for 'dupe found'
+	// latest = is latest ajax return value (raw)
+	// last = is previous ajax return value (raw)
+	// note that comparing latest and last if they're JSON objects
+	// always returns false, so you need to implement it manually.
+	spy.isDupe = function(latest, last) {
+		if ((last.constructor == Object) && (o.method == 'html'))
+			return (latest.html() == last.html());
+		else if (last.constructor == String)
+			return (latest == last);
+		else
+			return 0;
+	}
+	
+	spy.timestamp = function() {
+	    var now = new Date();
+		return Math.floor((now - spy.epoch) / 1000);
+	}
+	
+	spy.parse = function(e, r) {
+		spy.parsing = 1; // flag to stop pull via ajax
+		if (o.method == 'html') {
+			$('div#_spyTmp').html(r); // add contents to hidden div
+		} else if (o.method == 'json') {
+			eval('spy.json = ' + r); // convert text to json
+		}
+		
+		if ((o.method == 'json' && spy.json.constructor == Array) || o.method == 'html') {
+			if (spy.parseItem(e)) {
+				spy.waitTimer = window.setInterval(function() {
+					if (spyRunning) {
+						if (!spy.parseItem(e)) {
+							spy.parsing = 0;
+							clearInterval(spy.waitTimer);
+						}
+					}
+				}, o.timeout);
+			} else {
+				spy.parsing = 0;
+			}
+		} else if (o.method == 'json') { // we just have 1
+			eval('spy.json = ' + r)
+			spy.addItem(e, spy.json);
+			spy.parsing = 0;
+		}
+	}
+	
+	// returns true if there's more to parse
+	spy.parseItem = function(e) {
+		if (o.method == 'html') {
+			// note: pre jq-1.0 doesn't return the object
+			var i = $('div#_spyTmp').find('div:first').remove();
+			if (i.size() > 0) {
+				i.hide();
+				spy.addItem(e, i);
+			}		
+			return ($('div#_spyTmp').find('div').size() != 0);
+		} else {
+			if (spy.json.length) {
+				var i = spy.json.shift();
+				spy.addItem(e, i);
+			}
+
+			return (spy.json.length != 0);
+		}
+	}
+	
+	spy.addItem = function(e, i) {
+		if (! o.isDupe.call(this, i, spy.last)) {
+			spy.last = i; // note i is a pointer - so when it gets modified, so does spy.last
+			$('#' + e.id + ' > div:gt(' + (o.limit - 2) + ')').remove();
+			$('#' + e.id + ' > div:gt(' + (o.limit - o.fadeLast - 2) + ')').fadeEachDown();
+			o.push.call(e, i);
+			$('#' + e.id + ' > div:first').fadeIn(o.fadeInSpeed);
+		}
+	}
+	
+	spy.push = function(r) {
+		$('#' + this.id).prepend(r);
+	}
+	
+	var o = {
+		limit: (settings.limit || 10),
+		fadeLast: (settings.fadeLast || 5),
+		ajax: settings.ajax,
+		timeout: (settings.timeout || 3000),
+		method: (settings.method || 'html').toLowerCase(),
+		push: (settings.push || spy.push),
+		fadeInSpeed: (settings.fadeInSpeed || 'slow'), // 1400 = crawl
+		timestamp: (settings.timestamp || spy.timestamp),
+		isDupe: (settings.isDupe || spy.isDupe)
+	};
+
+	spy.attachHolder();
+
+	return this.each(function() {
+		var e = this;
+	    var timestamp = o.timestamp.call();
+		var lr = ''; // last ajax return
+		
+		spy.ajaxTimer = window.setInterval(function() {
+			if (spyRunning && (!spy.parsing)) {
+				$.get(o.ajax, owa_getData()
+				 , function(r) {
+					spy.parse(e, r);
+				});
+			    timestamp = o.timestamp.call();
+			} else {
+			
+				var d = new Date();
+				timestamp = Math.round(d.getTime() / 1000);
+			
+			}
+		}, o.timeout);
+	});
+};
+
+$.fn.fadeEachDown = function() {
+	var s = this.size();
+	return this.each(function(i) {
+		var o = 1 - (s == 1 ? 0.5 : 0.85/s*(i+1));
+		var e = this.style;
+		if (window.ActiveXObject)
+			e.filter = "alpha(opacity=" + o*100 + ")";
+		e.opacity = o;
+	});
+};
+
+function pauseSpy() {
+	spyRunning = 0; 
+	var temp_time;
+	last_end_time = temp_time;
+	$('div#_spyTmp').html("");
+	$('div#spyContainer').prepend('<div class="status">The spy has been paused...</div>');
+
+	return false;
+}
+
+function playSpy() {
+	spyRunning = 1; 
+	$('div#spyContainer').prepend('<div class="status">The spy has been re-started...</div>');
+	return false;
+}