All pastes #1213157 Raw Edit

smd

public diff v1 · immutable
#1213157 ·published 2008-09-28 23:11 UTC
rendered paste body
diff -Nur zotero@chnm.gmu.edu.orig/chrome/content/zotero/overlay.js zotero@chnm.gmu.edu/chrome/content/zotero/overlay.js--- zotero@chnm.gmu.edu.orig/chrome/content/zotero/overlay.js	2008-07-16 01:59:00.000000000 +0200+++ zotero@chnm.gmu.edu/chrome/content/zotero/overlay.js	2008-09-28 20:26:03.636275200 +0200 -186,9 +186,36 @@ 			}, 400); 			Zotero.Prefs.set('firstRun', false); 		}+		+		refreshScuttleSiteListOnly(); 	} 	-	+	function refreshScuttleSiteListOnly()+	{+		var sql = "SELECT key AS domainPath, value AS isact FROM settings "+			+ "WHERE setting='scuttleSite' ORDER BY domainPath COLLATE NOCASE";+		var siteData = Zotero.DB.query(sql);+		+		var sitelist = "";+		Zotero.Prefs.set('scuttle.sitelist', sitelist);+		+		if (!siteData) {+			return;+		}+		+		+		for (var i=0; i<siteData.length; i++) {+			+			if (siteData[i].isact) sitelist += siteData[i].domainPath + ",";+			+		}+		+		sitelist = sitelist.substr(0, sitelist.length-1);+		Zotero.Prefs.set('scuttle.sitelist', sitelist);+		Zotero.log("initsitelist "+sitelist+Zotero.Prefs.get('scuttle.sitelist'), 0);+		+	}+ 	/* 	 * Called when the window closes 	 */ -542,7 +569,13 @@ 		//set to Info tab 		document.getElementById('zotero-view-item').selectedIndex = 0; 		-		this.selectItem(item.getID());+		//this.selectItem(item.getID());+		var si = function() {+			//alert("si " + ZoteroPane + ' ' + item + ' ' + item.getID());+			ZoteroPane.selectItem(item.getID());+		};+		+		window.setTimeout(si, Zotero.tDelay); 		 		return item; 	}diff -Nur zotero@chnm.gmu.edu.orig/chrome/content/zotero/preferences/preferences.js zotero@chnm.gmu.edu/chrome/content/zotero/preferences/preferences.js--- zotero@chnm.gmu.edu.orig/chrome/content/zotero/preferences/preferences.js	2008-01-14 20:21:00.000000000 +0100+++ zotero@chnm.gmu.edu/chrome/content/zotero/preferences/preferences.js	2008-09-28 20:26:03.646289600 +0200 -34,6 +34,7 @@ 	populateQuickCopyList(); 	updateQuickCopyInstructions(); 	initSearchPane();+	refreshScuttleSiteList(); }   -334,6 +335,80 @@ }  +function showScuttleSiteEditor(index) {+	var treechildren = document.getElementById('scuttle-serverSettings-rows');+	+	if (index != undefined && index > -1 && index < treechildren.childNodes.length) {+		var treerow = treechildren.childNodes[index].firstChild;+		var domain = treerow.childNodes[0].getAttribute('label');+		var isact = treerow.childNodes[1].getAttribute('label');+	}+	+	var io = {domain: domain, isact: isact, ok: false};+	window.openDialog('chrome://zotero/content/preferences/scuttleSiteEditor.xul', "zotero-preferences-scuttleSiteEditor", "chrome, modal", io);+	+	if (!io.ok) {+		return;+	}+	+	if (domain && domain != io.domain) {+		Zotero.DB.query("DELETE FROM settings WHERE setting='scuttleSite' AND key=?", [domain]);+	}+	+	Zotero.DB.query("REPLACE INTO settings VALUES ('scuttleSite', ?, ?)", [io.domain, io.isact]);+	+	refreshScuttleSiteList();+}++function refreshScuttleSiteList() {+	var treechildren = document.getElementById('scuttle-serverSettings-rows');+	while (treechildren.hasChildNodes()) {+		treechildren.removeChild(treechildren.firstChild);+	}+	+	var sql = "SELECT key AS domainPath, value AS isact FROM settings "+		+ "WHERE setting='scuttleSite' ORDER BY domainPath COLLATE NOCASE";+	var siteData = Zotero.DB.query(sql);+	+	var sitelist = "";+	Zotero.Prefs.set('scuttle.sitelist', sitelist);+	+	if (!siteData) {+		return;+	}+	+	+	for (var i=0; i<siteData.length; i++) {+		var treeitem = document.createElement('treeitem');+		var treerow = document.createElement('treerow');+		var domainCell = document.createElement('treecell');+		var isActCell = document.createElement('treecell');+		+		domainCell.setAttribute('label', siteData[i].domainPath);+		isActCell.setAttribute('label', siteData[i].isact);++		if (siteData[i].isact) sitelist += siteData[i].domainPath + ",";+		+		treerow.appendChild(domainCell);+		treerow.appendChild(isActCell);+		treeitem.appendChild(treerow);+		treechildren.appendChild(treeitem);+	}+	sitelist = sitelist.substr(0, sitelist.length-1);+	Zotero.Prefs.set('scuttle.sitelist', sitelist);+}++++function deleteSelectedScuttleSite() {+	var tree = document.getElementById('scuttle-serverSettings');+	var treeitem = tree.lastChild.childNodes[tree.currentIndex];+	var domainPath = treeitem.firstChild.firstChild.getAttribute('label');+	Zotero.DB.query("DELETE FROM settings WHERE setting='scuttleSite' AND key=?", [domainPath]);+	refreshScuttleSiteList();+}++ function rebuildIndexPrompt() { 	var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. 			createInstance(Components.interfaces.nsIPromptService);diff -Nur zotero@chnm.gmu.edu.orig/chrome/content/zotero/preferences/preferences.xul zotero@chnm.gmu.edu/chrome/content/zotero/preferences/preferences.xul--- zotero@chnm.gmu.edu.orig/chrome/content/zotero/preferences/preferences.xul	2008-01-14 20:21:00.000000000 +0100+++ zotero@chnm.gmu.edu/chrome/content/zotero/preferences/preferences.xul	2008-09-28 20:26:03.646289600 +0200 -423,6 +423,60 @@ 		</groupbox> 	</prefpane> 	+	<prefpane id="zotero-prefpane-scuttleservers"+						label="Scuttle servers"+						image="chrome://zotero/skin/prefs-general.png">+		+		<preferences>+			<preference id="pref-scuttle-active" name="extensions.zotero.scuttle.active" type="bool"/>+			<preference id="pref-scuttle-showprogwin" name="extensions.zotero.scuttle.showprogwin" type="bool"/>+			<preference id="pref-scuttle-log" name="extensions.zotero.scuttle.log" type="bool"/>+			<preference id="pref-scuttle-sitelist" name="extensions.zotero.scuttle.sitelist" type="string"/>+			<preference id="pref-scuttle-clTimeout" name="extensions.zotero.scuttle.clTimeout" type="int"/>+		</preferences>+		+		<groupbox>+			<caption label="Scuttle Servers"/>+			+			<separator class="thin"/>+			<checkbox label="Activated?" preference="pref-scuttle-active"/>+			<label id="quickCopy-instructions">When activated, upon each command, Zotero will send a copy of create/update/insert sql commands to online scuttle servers, which are active in the list below. </label>+			<separator class="thin"/>+			+			<label value="Scuttle servers:" control="scuttle-serverSettings"/>+			<label id="quickCopy-instructions">(must not contain a comma, as it is used for delimitation)</label>+			<tree flex="1" id="scuttle-serverSettings" hidecolumnpicker="true" rows="6" seltype="single"+					ondblclick="showScuttleSiteEditor(this.currentIndex)"+					onkeypress="if (event.keyCode == event.DOM_VK_DELETE) { deleteSelectedScuttleSite(); }">+				<treecols>+					<treecol id="scuttle-urlColumn" label="Domain/path to Scuttle" flex="1"/>+					<treecol id="scuttle-isActColumn" label="Active" flex="2"/>+				</treecols>+				<treechildren id="scuttle-serverSettings-rows"/>+			</tree>+			<separator class="thin"/>+			<hbox pack="end">+				<button label="-" onclick="deleteSelectedScuttleSite()"/>+				<button label="+" onclick="showScuttleSiteEditor()"/>+			</hbox>++			<separator class="thin"/>+			<checkbox label="Show progress windows?" preference="pref-scuttle-showprogwin"/>++			<separator class="thin"/>+			<checkbox label="Log to console?" preference="pref-scuttle-log"/>++			<separator class="thin"/>+			<hbox align="center">+				<label value="Callback timeout (ms)"/>+				<textbox size="10" preference="pref-scuttle-clTimeout"/>+				<label value="(&zotero.preferences.default; 30)"/>+			</hbox>+			+			<separator/>+		</groupbox>+			+	</prefpane> 	 	<!-- These mess up the prefwindow if they come before the prefpanes 	     https://bugzilla.mozilla.org/show_bug.cgi?id=296418 -->diff -Nur zotero@chnm.gmu.edu.orig/chrome/content/zotero/preferences/scuttleSiteEditor.xul zotero@chnm.gmu.edu/chrome/content/zotero/preferences/scuttleSiteEditor.xul--- zotero@chnm.gmu.edu.orig/chrome/content/zotero/preferences/scuttleSiteEditor.xul	1970-01-01 01:00:00.000000000 +0100+++ zotero@chnm.gmu.edu/chrome/content/zotero/preferences/scuttleSiteEditor.xul	2008-09-28 20:26:03.646289600 +0200 -0,0 +1,45 @@+<?xml version="1.0"?>+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>+<?xml-stylesheet href="chrome://zotero/skin/preferences.css"?>++<!DOCTYPE window SYSTEM "chrome://zotero/locale/preferences.dtd">+<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"+	title="" buttons="cancel,accept"+	id="zotero-scuttleSiteEditor"+	onload="sizeToContent();"+	ondialogaccept="Zotero_scuttleSiteEditor.onAccept();">+	+	<script src="chrome://zotero/content/include.js"/>+	<script src="preferences.js"/>+	+	<script>+	<![CDATA[+		var Zotero_scuttleSiteEditor = new function () {+			this.onAccept = onAccept;+			+			function onAccept() {+				var io = window.arguments[0];+				io.domain = document.getElementById('zotero-scuttleSite-domain').value;+				io.isact = Number(document.getElementById('zotero-scuttleSite-active').checked);+				io.ok = true;+			}+		}+	]]>+	</script>+	+	<vbox id="zotero-preferences-scuttleSiteEditor">+		<label value="Domain/path (e.g. http://mydomain.com/scuttle/)" control="zotero-scuttleSite-domain"/>+		<textbox id="zotero-scuttleSite-domain"/>+		<separator class="thin"/>+		<checkbox id="zotero-scuttleSite-active" label="Is Active?" />+		<separator class="thin"/>+	</vbox>+	+	<script>+	<![CDATA[+		var io = window.arguments[0];+		document.getElementById('zotero-scuttleSite-domain').value = io.domain ? io.domain : '';+		document.getElementById('zotero-scuttleSite-active').checked = Boolean(io.isact);+	]]>+	</script>+</dialog>diff -Nur zotero@chnm.gmu.edu.orig/chrome/content/zotero/xpcom/data_access.js zotero@chnm.gmu.edu/chrome/content/zotero/xpcom/data_access.js--- zotero@chnm.gmu.edu.orig/chrome/content/zotero/xpcom/data_access.js	2008-07-06 15:58:00.000000000 +0200+++ zotero@chnm.gmu.edu/chrome/content/zotero/xpcom/data_access.js	2008-09-28 20:26:03.666318400 +0200 -760,6 +760,7 @@ 	// 	// Existing item, update 	//+	var tempstat; 	if (this.getID()){ 		Zotero.debug('Updating database with new item data', 4); 		 -857,12 +858,15 @@ 				var del = new Array(); 				 				sql = "SELECT valueID FROM itemDataValues WHERE value=?";+				var valueStatementSQL = sql; 				var valueStatement = Zotero.DB.getStatement(sql); 				 				sql = "INSERT INTO itemDataValues VALUES (?,?)";+				var insertStatementSQL = sql; 				var insertStatement = Zotero.DB.getStatement(sql); 				 				sql = "REPLACE INTO itemData VALUES (?,?,?)";+				var replaceStatementSQL = sql; 				var replaceStatement = Zotero.DB.getStatement(sql); 				 				for (fieldID in this._changedItemData.items){ -887,6 +891,7 @@ 							var valueID = null; 						} 						valueStatement.reset();+						tempstat = Zotero.DB.getStatement(valueStatementSQL, [{string:value}] ); //trick for full getStatement 						 						if (!valueID) { 							valueID = Zotero.getRandomID('itemDataValues', 'valueID', 2097152); // stored in 3 bytes -933,6 +938,7 @@ 								catch (e) { 									throw (Zotero.DB.getLastErrorString()); 								}+								tempstat = Zotero.DB.getStatement(insertStatementSQL, [{int: valueID}, value] ); //trick for full getStatement 							} 						} 						 -946,6 +952,7 @@ 						catch (e) { 							throw (Zotero.DB.getLastErrorString()); 						}+						tempstat = Zotero.DB.getStatement(replaceStatementSQL, [this.getID(), fieldID, valueID] ); //trick for full  getStatement 					} 					 					// If field changed and is empty, mark row for deletion -1033,12 +1040,15 @@ 			if (this._changedItemData.length){ 				// Use manual bound parameters to speed things up 				sql = "SELECT valueID FROM itemDataValues WHERE value=?";+				var valueStatementSQL = sql; 				var valueStatement = Zotero.DB.getStatement(sql); 				 				sql = "INSERT INTO itemDataValues VALUES (?,?)";+				var insertValueStatementSQL = sql; 				var insertValueStatement = Zotero.DB.getStatement(sql); 				 				sql = "INSERT INTO itemData VALUES (?,?,?)";+				var insertStatementSQL = sql; 				var insertStatement = Zotero.DB.getStatement(sql); 				 				for (fieldID in this._changedItemData.items){ -1055,6 +1065,8 @@ 						var valueID = null; 					} 					valueStatement.reset();+					tempstat = Zotero.DB.getStatement(valueStatementSQL, [{string:value}] ); //trick for full  getStatement+ 					 					if (!valueID) { 						valueID = Zotero.getRandomID('itemDataValues', 'valueID', 2097152); // stored in 3 bytes -1081,6 +1093,7 @@ 							catch (e) { 								throw (Zotero.DB.getLastErrorString()); 							}+							tempstat = Zotero.DB.getStatement(insertValueStatementSQL, [valueID, value] ); //trick for full  getStatement 						} 					} 					 -1095,6 +1108,8 @@ 						throw(Zotero.DB.getLastErrorString()); 					} 					+					tempstat = Zotero.DB.getStatement(insertStatementSQL, [this.getID(), fieldID, valueID] ); //trick for full  getStatement+ 					Zotero.History.add('itemData', 'itemID-fieldID', 						[itemID, fieldID]); 				} -2291,6 +2306,7 @@ 	} 	 	Zotero.debug('Deleting item ' + this.getID());+	// using sqlq array for extern sql - taken care of in db.query, db.getStatement  	 	var changedItems = []; 	var changedItemsNotifierData = {};diff -Nur zotero@chnm.gmu.edu.orig/chrome/content/zotero/xpcom/db.js zotero@chnm.gmu.edu/chrome/content/zotero/xpcom/db.js--- zotero@chnm.gmu.edu.orig/chrome/content/zotero/xpcom/db.js	2008-01-28 15:20:00.000000000 +0100+++ zotero@chnm.gmu.edu/chrome/content/zotero/xpcom/db.js	2008-09-28 21:16:08.627240000 +0200 -103,8 +103,35 @@ 			else { 				this._debug(sql,5); 				db.executeSimpleSQL(sql);+				Zotero.ssql = sql;+				var psq = function (insql) {+					if (!Zotero.ProcessingScuttleSQL) Zotero.ProcessScuttleSQL(insql);+				}+				+				var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]+				                   .getService(Components.interfaces.nsIWindowMediator);+				var win = wm.getMostRecentWindow("");+				if (Zotero.ssql != "") +				{+					// could be a list, parse+					Zotero.ssql = Zotero.ssql.replace(/\n/g,"").replace(/\r/g,"");+					var lista = Zotero.ssql.split(";");+					if (lista.length > 0) +					{+						ilen = lista.length; +						while (ilen > 0)+						{+							Zotero.sqlq.push(lista[ilen-1]);+							ilen -= 1;+						}+					}+					win.setTimeout(psq, Zotero.tDelay, Zotero.ssql); +				}				 			} 			++			+			 			if (op=='insert') { 				return db.lastInsertRowID; 			} -183,7 +210,8 @@  */ Zotero.DBConnection.prototype.getStatement = function (sql, params) { 	var db = this._getDBConnection();-	+	var tsql = sql; +	Zotero.ssql = ""; 	try { 		this._debug(sql,5); 		var statement = db.createStatement(sql); -239,26 +267,50 @@ 			} 			 			// Bind the parameter as the correct type+			var value1; 			switch (type) { 				case 'int': 					this._debug('Binding parameter ' + (i+1) 						+ ' of type int: ' + value, 5); 					statement.bindInt32Parameter(i, value);+					value1 = value;  					break; 					 				case 'string': 					this._debug('Binding parameter ' + (i+1) 						+ ' of type string: "' + value + '"', 5); 					statement.bindUTF8StringParameter(i, value);+					value1 = "'"+ value.replace("'", "''", "g") +"'";  					break; 					 				case 'null': 					this._debug('Binding parameter ' + (i+1) 						+ ' of type NULL', 5); 					statement.bindNullParameter(i);+					value1 = value;  					break; 			}-		}+		var tsql1 = tsql.replace("?", value1);+		tsql = tsql1;+        }+	}+	+	var op = tsql.match(/^[^a-z]*[^ ]+/i);+	if (op) { op = op.toString().toLowerCase(); }+	if (op!='select') +		Zotero.ssql = tsql;++	var psq = function (insql) {+		if (!Zotero.ProcessingScuttleSQL) Zotero.ProcessScuttleSQL(insql);+	}+	+	var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]+	                   .getService(Components.interfaces.nsIWindowMediator);+	var win = wm.getMostRecentWindow("");+	if (Zotero.ssql != "") +	{+		Zotero.sqlq.push(Zotero.ssql);+		win.setTimeout(psq, Zotero.tDelay, Zotero.ssql);  	} 	return statement; }diff -Nur zotero@chnm.gmu.edu.orig/chrome/content/zotero/xpcom/zotero.js zotero@chnm.gmu.edu/chrome/content/zotero/xpcom/zotero.js--- zotero@chnm.gmu.edu.orig/chrome/content/zotero/xpcom/zotero.js	2008-06-24 06:13:00.000000000 +0200+++ zotero@chnm.gmu.edu/chrome/content/zotero/xpcom/zotero.js	2008-09-29 00:11:12.360867200 +0200 -61,6 +61,18 @@ 	this.randomString = randomString; 	this.getRandomID = getRandomID; 	this.moveToUnique = moveToUnique;+	this.ProcessScuttleSQL = ProcessScuttleSQL;+	this.rqsts = 0;+	this.ProcessingScuttleSQL = false;+	this.tDelay = 30; // delay for setInterval calls+    this.__defineGetter__("tDelay", function(){+	return Zotero.Prefs.get('scuttle.clTimeout');+    });+   +    this.__defineSetter__("tDelay", function(val){+	tDelay = val;+       Zotero.Prefs.set('scuttle.clTimeout', intval(val));+    }); 	 	// Public properties 	this.initialized = false; -74,6 +86,10 @@ 	this.isMac; 	this.isWin; 	this.initialURL; // used by Schema to show the changelog on upgrades+	this.collectSQL = false; // not used, sqlq is+	this.csql = ""; //(total) //not used, sqlq is+	this.ssql=""; //(single) // nt used, sqlq is+	this.sqlq=[]; // sql queue array  	 	var _startupError; 	var _startupErrorHandler; -869,10 +885,177 @@ 		file.moveTo(newFile.parent, newName); 		return file; 	}+	+	function ProcessScuttleSQL(sql)+	{+		//Zotero.log(sql + " " + Zotero.sqlq.length, 0);+		var stlist = Zotero.Prefs.get('scuttle.sitelist');+		var showprogwin = Zotero.Prefs.get('scuttle.showprogwin');+		var act = Zotero.Prefs.get('scuttle.active');+		var dolog = Zotero.Prefs.get('scuttle.log');+		+		var logger = act + "-" + stlist; +		var status;+		var pw = new Zotero.ProgressWindow();+		var icon = 'chrome://zotero/skin/treeitem-attachment-' + 'snapshot' + '.png';+		+		if (Zotero.sqlq.length < 1) return;+		else sql = Zotero.sqlq.shift();+		var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]+						   .getService(Components.interfaces.nsIWindowMediator);+		var win = wm.getMostRecentWindow("");		++		if (act && (stlist != ""))+		{+			+			if ( (sql != "") ) +			{+				//Zotero.csql += Zotero.ssql + ";\n";+				var tsql = sql.replace('CURRENT_TIMESTAMP', "DATETIME('NOW')");+				sql = tsql;+				if (sql.indexOf("(?") != -1) // unparsed, don't process+				{+					logger += " ign: " + sql;+					if ((Zotero.sqlq.length > 0) && (Zotero.rqsts==0)) win.setTimeout(Zotero.ProcessScuttleSQL, Zotero.tDelay);+				}+				else //parsed, do process+				{+					+					if (showprogwin)+					{+						pw.changeHeadline("sending sql");+						//pw.addDescription("");+						pw.show(); /**/+					}+					// here stlist contains only active servers - could be null !!   ... if (stlist.indexOf(",") != -1) // is a list +					var stlista = stlist.split(",");+					var stlistlen = stlista.length; +					+					logger += stlistlen + ".." + sql + "\n"; +					+					// pass to each server. +					Zotero.ProcessingScuttleSQL = true;+					sql = urlencode(sql);+					var querystring = "";+					var params = "sql="+sql;+					var b; +					+					for(i = 0; i < stlistlen; i++)+					{+						// start a new XMLHttpRequest +						var xmlhttp = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();+						querystring = stlista[i]+'api/zoterosql.php';+						+						logger += i + "-" + querystring + " " + params + " \n"; +						+						xmlhttp.open("POST", querystring, true);+						//xmlhttp.overrideMimeType("text/plain");+						xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");+						xmlhttp.setRequestHeader("Content-length", params.length);+						xmlhttp.setRequestHeader("Connection", "close");+						+						status = false;+						try {+							logger += "_______rqsts is " + Zotero.rqsts + " \n";+							xmlhttp.send(params);+							Zotero.rqsts++;+							xmlhttp.onreadystatechange=function(xmlhttp)+							{+								if(this.readyState==4)+								{+									trep = "";+									//for (var j=0; j<Zotero.sqlq.length; j++) trep += Zotero.sqlq[j] + ",";+									if (dolog) Zotero.log("xmlhttp.response2 is " + this.readyState + " " + Zotero.rqsts + " " + Zotero.sqlq.length + " " + trep + " " + this.responseText, 0);+									Zotero.rqsts--;+									if (Zotero.rqsts == 0)+									{+										// ready to run another process from queue - only when all servers have answered a given request +										Zotero.ProcessingScuttleSQL = false;							+										if (Zotero.sqlq.length > 0) win.setTimeout(Zotero.ProcessScuttleSQL, Zotero.tDelay);+									}+								}							+							}+						}+						catch (e) {+							status = false;+						}+						status = true;+						+						logger += "midstatus is " + status + "\n";+						+						// invalid now that it is via POST : TODO - change/remove +						if (status) {+							logger += "xmlhttp.response is " + xmlhttp.responseText + "\n";+						}						+						+						try {+							logger += "xmlhttp.status is " + xmlhttp.status + " xmlhttp.responseXML is " + xmlhttp.responseXML + "\n";+							+							switch(xmlhttp.status) {+								case 503:+									logger += "statusthrottled";+									break;+								case 401:+								case 403:+									logger += "statusauthenticationfailed";+									break;+								case 200:+									status=true;+								default:+									break;+							}+						} catch (e) {+							logger += 'statusconnectionerror' + "\n";+							status = false;++						}+						+						if(showprogwin) pw.addDescription("Server " + i + " " + status + " " + stlista[i]);++					}+					+					if(showprogwin) pw.startCloseTimer(500);+					if (dolog) Zotero.log(status + " " + logger, 0); //uncomment to trace forwarded calls, and comment below 					+					+				}+			}+			else+			{+				if ((Zotero.sqlq.length > 0) && (Zotero.rqsts==0)) win.setTimeout(Zotero.ProcessScuttleSQL, Zotero.tDelay);+			}+			+		}+		+		if(showprogwin) if (pw._progressWindow) pw.startCloseTimer(500); //_progressWindow+		+		+	}+	+	+	function urlencode(str) +	{+		str = escape(str);+		str = str.replace('+', '%2B');+		str = str.replace('%20', '+');+		str = str.replace('*', '%2A');+		str = str.replace('/', '%2F');+		str = str.replace('@', '%40');+		return str;+	}++	function urldecode(str) +	{+		str = str.replace('+', ' ');+		str = unescape(str);+		return str;+	}	+	 };   ++ Zotero.Prefs = new function(){ 	// Privileged methods 	this.init = init;diff -Nur zotero@chnm.gmu.edu.orig/defaults/preferences/zotero.js zotero@chnm.gmu.edu/defaults/preferences/zotero.js--- zotero@chnm.gmu.edu.orig/defaults/preferences/zotero.js	2008-05-27 14:52:08.000000000 +0200+++ zotero@chnm.gmu.edu/defaults/preferences/zotero.js	2008-09-28 20:26:03.736419200 +0200 -70,4 +70,9 @@ pref("extensions.zotero.integration.autoRegenerate", -1);	// -1 = ask; 0 = no; 1 = yes  // Annotation settings-pref("extensions.zotero.annotations.warnOnClose", true);\ No newline at end of file+pref("extensions.zotero.annotations.warnOnClose", true);++//scuttle+pref("extensions.zotero.scuttle.sitelist", '');+pref("extensions.zotero.scuttle.active", false);+pref("extensions.zotero.scuttle.clTimeout", 30);diff -Nur zotero@chnm.gmu.edu.orig/install.rdf zotero@chnm.gmu.edu/install.rdf--- zotero@chnm.gmu.edu.orig/install.rdf	2008-07-16 02:19:50.000000000 +0200+++ zotero@chnm.gmu.edu/install.rdf	2008-09-28 20:26:03.736419200 +0200 -6,7 +6,7 @@        <em:id>zotero@chnm.gmu.edu</em:id>     <em:name>Zotero</em:name>-    <em:version>1.0.7</em:version>+    <em:version>1.0.7scut</em:version>     <em:creator>Center for History and New Media<br/>George Mason University</em:creator>     <em:contributor>Dan Cohen</em:contributor>     <em:contributor>Sean Takats</em:contributor>