galaxy-commits
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
February 2011
- 1 participants
- 166 discussions
commit/galaxy-central: natefoo: Don't use 'python -ES' when scrambling eggs due to '-S' breaking virtualenv.
by Bitbucket 21 Feb '11
by Bitbucket 21 Feb '11
21 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/2c9ce797953d/
changeset: r5096:2c9ce797953d
user: natefoo
date: 2011-02-21 15:46:54
summary: Don't use 'python -ES' when scrambling eggs due to '-S' breaking virtualenv.
affected #: 1 file (4 bytes)
--- a/lib/galaxy/eggs/scramble.py Fri Feb 18 17:47:07 2011 -0500
+++ b/lib/galaxy/eggs/scramble.py Mon Feb 21 09:46:54 2011 -0500
@@ -193,7 +193,7 @@
def run_scramble_script( self ):
log.warning( "%s(): Beginning build" % sys._getframe().f_code.co_name )
# subprocessed to sterilize the env
- cmd = "%s -ES %s" % ( self.python, "scramble.py" )
+ cmd = "%s %s" % ( self.python, "scramble.py" )
log.debug( '%s(): Executing in %s:' % ( sys._getframe().f_code.co_name, self.buildpath ) )
log.debug( ' %s' % cmd )
p = subprocess.Popen( args = cmd, shell = True, cwd = self.buildpath )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/040d6f59f464/
changeset: r5095:040d6f59f464
user: kanwei
date: 2011-02-18 23:47:07
summary: Update distutils egg to 0.7, and use the provided HTML output writer to do rst->html conversion. Remove old code that previously did this. This fixes a bug where an extra "</div>" was appended after every output, resulting in the tool config not showing in workflows, in IE.
affected #: 5 files (115 bytes)
--- a/eggs.ini Fri Feb 18 16:21:11 2011 -0500
+++ b/eggs.ini Fri Feb 18 17:47:07 2011 -0500
@@ -32,7 +32,7 @@
amqplib = 0.6.1
Beaker = 1.4
decorator = 3.1.2
-docutils = 0.4
+docutils = 0.7
drmaa = 0.4b3
elementtree = 1.2.6_20050316
GeneTrack = 2.0.0_beta_1
--- a/lib/galaxy/util/__init__.py Fri Feb 18 16:21:11 2011 -0500
+++ b/lib/galaxy/util/__init__.py Fri Feb 18 17:47:07 2011 -0500
@@ -19,7 +19,7 @@
pkg_resources.require( 'docutils' )
import docutils.core
-from galaxy.util.docutils_ext.htmlfrag import Writer as HTMLFragWriter
+import docutils.writers.html4css1
pkg_resources.require( 'elementtree' )
from elementtree import ElementTree, ElementInclude
@@ -252,7 +252,9 @@
def write( self, str ):
if len( str ) > 0 and not str.isspace():
log.warn( str )
- return docutils.core.publish_string( s, writer=HTMLFragWriter(), settings_overrides=dict( warning_stream=FakeStream() ) )
+ return docutils.core.publish_string(s,
+ writer=docutils.writers.html4css1.Writer(),
+ settings_overrides={"embed_stylesheet": False, "template": os.path.join(os.path.dirname(__file__), "docutils_template.txt"), "warning_stream": FakeStream()})
def xml_text(root, name=None):
"""Returns the text inside an element"""
--- a/lib/galaxy/util/docutils_ext/htmlfrag.py Fri Feb 18 16:21:11 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
-# Author: Ollie Rutherfurd
-# Contact: oliver(a)rutherfurd.net
-# Revision: $Revision: 2884 $
-# Date: $Date: 2004-12-08 20:49:05 +0100 (Wed, 08 Dec 2004) $
-# Copyright: This module has been placed in the public domain.
-
-"""
-Simple .ht (HyperText Template) document tree Writer.
-
-.ht tmeplate files are essentially normal HTML, with
-an option set of RFC 2822-like headers at the top of
-the file. There must be at least one blank line between
-the last header and the start of the body HTML.
-
-See http://ht2html.sf.net/ for more information on
-.ht files and ht2html..
-"""
-
-__docformat__ = 'reStructuredText'
-
-import os
-from docutils import nodes
-from docutils import writers
-from docutils import frontend
-from docutils.writers.html4css1 import HTMLTranslator, utils
-
-
-class Writer(writers.Writer):
-
- supported = ('htmlfrag',)
- """Formats this writer supports."""
-
- settings_spec = (
- 'HTML-Specific Options',
- None,
- (('Specify a stylesheet URL, used verbatim. Default is '
- '"default.css". Overrides --stylesheet-path.',
- ['--stylesheet'],
- {'default': 'default.css', 'metavar': '<URL>',
- 'overrides': 'stylesheet_path'}),
- ('Specify a stylesheet file, relative to the current working '
- 'directory. The path is adjusted relative to the output HTML '
- 'file. Overrides --stylesheet.',
- ['--stylesheet-path'],
- {'metavar': '<file>', 'overrides': 'stylesheet'}),
- ('Link to the stylesheet in the output HTML file. This is the '
- 'default.',
- ['--link-stylesheet'],
- {'dest': 'embed_stylesheet', 'action': 'store_false',
- 'validator': frontend.validate_boolean}),
- ('Embed the stylesheet in the output HTML file. The stylesheet '
- 'file must be accessible during processing (--stylesheet-path is '
- 'recommended). Default: link the stylesheet, do not embed it.',
- ['--embed-stylesheet'],
- {'action': 'store_true', 'validator': frontend.validate_boolean}),
- ('Specify the initial header level. Default is 1 for "<h1>". '
- 'Does not affect document title & subtitle (see --no-doc-title).',
- ['--initial-header-level'],
- {'choices': '1 2 3 4 5 6'.split(), 'default': '3',
- 'metavar': '<level>'}),
- ('Specify the maximum width (in characters) for one-column field '
- 'names. Longer field names will span an entire row of the table '
- 'used to render the field list. Default is 14 characters. '
- 'Use 0 for "no limit".',
- ['--field-name-limit'],
- {'default': 14, 'metavar': '<level>',
- 'validator': frontend.validate_nonnegative_int}),
- ('Specify the maximum width (in characters) for options in option '
- 'lists. Longer options will span an entire row of the table used '
- 'to render the option list. Default is 14 characters. '
- 'Use 0 for "no limit".',
- ['--option-limit'],
- {'default': 14, 'metavar': '<level>',
- 'validator': frontend.validate_nonnegative_int}),
- ('Format for footnote references: one of "superscript" or '
- '"brackets". Default is "brackets".',
- ['--footnote-references'],
- {'choices': ['superscript', 'brackets'], 'default': 'brackets',
- 'metavar': '<format>',
- 'overrides': 'trim_footnote_reference_space'}),
- ('Format for block quote attributions: one of "dash" (em-dash '
- 'prefix), "parentheses"/"parens", or "none". Default is "dash".',
- ['--attribution'],
- {'choices': ['dash', 'parentheses', 'parens', 'none'],
- 'default': 'dash', 'metavar': '<format>'}),
- ('Remove extra vertical whitespace between items of bullet lists '
- 'and enumerated lists, when list items are "simple" (i.e., all '
- 'items each contain one paragraph and/or one "simple" sublist '
- 'only). Default: enabled.',
- ['--compact-lists'],
- {'default': 1, 'action': 'store_true',
- 'validator': frontend.validate_boolean}),
- ('Disable compact simple bullet and enumerated lists.',
- ['--no-compact-lists'],
- {'dest': 'compact_lists', 'action': 'store_false'}),
- ('Omit the XML declaration. Use with caution.',
- ['--no-xml-declaration'],
- {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
- 'validator': frontend.validate_boolean}),
- ('Scramble email addresses to confuse harvesters. '
- 'For example, "abc(a)example.org" will become '
- '``<a href="mailto:%61%62%63%40...">abc at example dot org</a>``.',
- ['--cloak-email-addresses'],
- {'action': 'store_true', 'validator': frontend.validate_boolean}),))
-
-
- relative_path_settings = ('stylesheet_path',)
-
- output = None
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = HTMLFragTranslator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
- self.stylesheet = visitor.stylesheet
- self.body = visitor.body
-
-
-class HTMLFragTranslator(HTMLTranslator):
-
- def __init__(self, document):
- # I don't believe we can embed any style content
- # the header, so always link to the stylesheet.
- document.settings.embed_stylesheet = 0
- HTMLTranslator.__init__(self, document)
-
- def astext(self):
- # kludge! want footer, but not '</body></html>'
- body = self.body_pre_docinfo + self.docinfo + self.body + \
- self.body_suffix[:-1]
- return ''.join(body)
-
-# :indentSize=4:lineSeparator=\n:noTabs=true:tabSize=4:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/751b80f0bbf4/
changeset: r5094:751b80f0bbf4
user: natefoo
date: 2011-02-18 22:21:11
summary: Fix for 3 of the 4 failing upload tests.
affected #: 1 file (3 bytes)
--- a/test/functional/test_get_data.py Fri Feb 18 15:06:34 2011 -0500
+++ b/test/functional/test_get_data.py Fri Feb 18 16:21:11 2011 -0500
@@ -228,7 +228,7 @@
hda = get_latest_hda()
assert hda is not None, "Problem retrieving hda from database"
self.verify_dataset_correctness( 'qualscores.qualsolid', hid=str( hda.hid ) )
- self.check_history_for_string( '48 lines, format: <span class="qualsolid">qualsolid</span>, database: \? Info: uploaded file' )
+ self.check_history_for_string( '48 lines format: <span class="qualsolid">qualsolid</span>, database: \? Info: uploaded file' )
self.check_metadata_for_string( 'Change data type value="qualsolid" selected="yes">qualsolid' )
self.delete_history( id=self.security.encode_id( history.id ) )
def test_0090_upload_file( self ):
@@ -240,7 +240,7 @@
hda = get_latest_hda()
assert hda is not None, "Problem retrieving hda from database"
self.verify_dataset_correctness( 'qualscores.qual454', hid=str( hda.hid ) )
- self.check_history_for_string( '49 lines, format: <span class="qual454">qual454</span>, database: \?' )
+ self.check_history_for_string( '49 lines format: <span class="qual454">qual454</span>, database: \?' )
self.check_metadata_for_string( 'Change data type value="qual454" selected="yes">qual454' )
self.delete_history( id=self.security.encode_id( history.id ) )
def test_0095_upload_file( self ):
@@ -357,7 +357,7 @@
hda = get_latest_hda()
assert hda is not None, "Problem retrieving hda from database"
self.verify_dataset_correctness( 'shrimp_cs_test1.csfasta', hid=str( hda.hid ) )
- self.check_history_for_string( '2,500 sequences, format: <span class="csfasta">csfasta</span>, <td>>2_14_26_F3,-1282216.0</td>' )
+ self.check_history_for_string( '2,500 sequences format: <span class="csfasta">csfasta</span>, <td>>2_14_26_F3,-1282216.0</td>' )
self.check_metadata_for_string( 'value="shrimp_cs_test1.csfasta" value="\?" Change data type value="csfasta" selected="yes"' )
self.delete_history( id=self.security.encode_id( history.id ) )
def test_0140_upload_file( self ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/1dfad17e81a8/
changeset: r5093:1dfad17e81a8
user: kanwei
date: 2011-02-18 21:06:34
summary: Use jStorage (http://www.jstorage.info/) instead of jStore. Tested to be working on IE7 and IE8, where the latter was failing. Fixes links not showing up in history pane to expand histories.
affected #: 15 files (779 bytes)
--- a/static/scripts/class.js Fri Feb 18 14:53:35 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*!
- * Class definition
- *
- * Copyright (c) 2008 John Resig (http://ejohn.org/blog/simple-javascript-inheritance/)
- * Inspired by base2 and Prototype
- */
-
-//"use strict";
-
-(function () {
-
- var initializing = false,
-
- fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
-
- // The base Class implementation (does nothing)
- this.Class = function(){};
-
- // Create a new Class that inherits from this class
- Class.extend = function (prop)
- {
- var _super = this.prototype;
-
- // Instantiate a base class (but only create the instance, don't run the init constructor)
- initializing = true;
-
- var prototype = new this();
-
- initializing = false;
-
- // Copy the properties over onto the new prototype
- for (var name in prop)
- {
-
- // Check if we're overwriting an existing function
- prototype[name] = (typeof prop[name] === "function" && typeof _super[name] === "function" && fnTest.test(prop[name]) ?
-
- (function(name, fn)
- {
- return function()
- {
- var tmp = this._super;
-
- // Add a new ._super() method that is the same method
- // but on the super-class
- this._super = _super[name];
-
- // The method only need to be bound temporarily, so we
- // remove it when we're done executing
- var ret = fn.apply(this, arguments);
- this._super = tmp;
-
- return ret;
- };
- }(name, prop[name])) : prop[name]);
- }
-
- // The dummy class constructor
- function Class()
- {
- // All construction is actually done in the init method
- if (!initializing && this.init)
- {
- this.init.apply(this, arguments);
- }
- }
-
- // Populate our constructed prototype object
- Class.prototype = prototype;
-
- // Enforce the constructor to be what we expect
- Class.constructor = Class;
-
- // And make this class extendable
- Class.extend = arguments.callee;
-
- return Class;
- };
-
-}());
--- a/static/scripts/galaxy.base.js Fri Feb 18 14:53:35 2011 -0500
+++ b/static/scripts/galaxy.base.js Fri Feb 18 15:06:34 2011 -0500
@@ -424,7 +424,7 @@
var action = function() {
// Load saved state and show as necessary
try {
- var stored = $.jStore.store("history_expand_state");
+ var stored = $.jStorage.get("history_expand_state");
if (stored) {
for (var id in stored) {
$("#" + id + " div.historyItemBody" ).show();
@@ -432,7 +432,7 @@
}
} catch(err) {
// Something was wrong with values in storage, so clear storage
- $.jStore.remove("history_expand_state");
+ $.jStorage.deleteKey("history_expand_state");
}
// If Mozilla, hide scrollbars in hidden items since they cause animation bugs
@@ -455,10 +455,10 @@
if (!nochanges) { // Ignore embedded item actions
// Save setting
- prefs = $.jStore.store("history_expand_state");
+ prefs = $.jStorage.get("history_expand_state");
if (prefs) {
delete prefs[id];
- $.jStore.store("history_expand_state", prefs);
+ $.jStorage.set("history_expand_state", prefs);
}
}
} else {
@@ -469,10 +469,10 @@
if (!nochanges) {
// Save setting
- prefs = $.jStore.store("history_expand_state");
- if (prefs === undefined) { prefs = {}; }
+ prefs = $.jStorage.get("history_expand_state");
+ if (!prefs) { prefs = {}; }
prefs[id] = true;
- $.jStore.store("history_expand_state", prefs);
+ $.jStorage.set("history_expand_state", prefs);
}
}
return false;
@@ -481,8 +481,8 @@
// Generate 'collapse all' link
$("#top-links > a.toggle").click( function() {
- var prefs = $.jStore.store("history_expand_state");
- if (prefs === undefined) { prefs = {}; }
+ var prefs = $.jStorage.get("history_expand_state");
+ if (!prefs) { prefs = {}; }
$( "div.historyItemBody:visible" ).each( function() {
if ( $.browser.mozilla ) {
$(this).find( "pre.peek" ).css( "overflow", "hidden" );
@@ -492,19 +492,11 @@
delete prefs[$(this).parent().attr("id")];
}
});
- $.jStore.store("history_expand_state", prefs);
+ $.jStorage.set("history_expand_state", prefs);
}).show();
};
- if (noinit) {
- action();
- } else {
- // Load jStore for local storage
- $.jStore.init("galaxy"); // Auto-select best storage
- $.jStore.ready(function() {
- action();
- });
- }
+ action();
}
function commatize( number ) {
--- a/static/scripts/jquery.jstore.js Fri Feb 18 14:53:35 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1810 +0,0 @@
-/*!
- * jStore 2.0 - Persistent Client Side Storage
- *
- * Copyright (c) 2010 Eric Garside (http://eric.garside.name/)
- * Dual licensed under:
- * MIT: http://www.opensource.org/licenses/mit-license.php
- * GPLv3: http://www.opensource.org/licenses/gpl-3.0.html
- *
- * ---------------------------
- *
- * jStore Flash Storage Component
- *
- * Copyright (c) 2006 Jeff Lerman (jeff(a)blip.tv)
- * Licensed under the Creative Commons Attribution 3.0 United States License:
- * http://creativecommons.org/licenses/by/3.0/us
- */
-
-//"use strict";
-
-/*global Class, window, jQuery, ActiveXObject, google */
-
-/*jslint white: true, browser: true, onevar: true, undef: true, eqeqeq: true, bitwise: true, regexp: false, strict: true, newcap: true, immed: true, maxerr: 50, indent: 4 */
-
-(function ($, window) {
-
- //------------------------------
- //
- // Constants
- //
- //------------------------------
-
- //------------------------------
- // Exceptions
- //------------------------------
-
- /**
- * An exception thrown by the StorageEngine class whenever its data accessor methods
- * are called before the engine is ready to transact data.
- */
- var EX_UNSTABLE = 'JSTORE_ENGINE_UNSTABLE',
-
- /**
- * An exception thrown by jStore whenever an undefined storage engine is referenced for
- * some task by an invalid JRI (jStore Resource Identifier).
- */
- EX_UNKNOWN = 'JSTORE_UNKNOWN_ENGINE_REQUESTED',
-
- /**
- * An exception thrown by jStore whenever a given flavor of storage is double defined.
- */
- EX_COLLISION = 'JSTORE_ENGINE_NAMESPACE_COLLISION',
-
- /**
- * An exception thrown by jStore whenever a jri is double applied to a resource.
- */
- EX_DUPLICATE = 'JSTORE_RESOURCE_NAMESPACE_COLLISION',
-
- /**
- * An exception thrown by jStore whenever a given flavor of storage has no defined engine.
- */
- EX_UNAVAILABLE = 'JSTORE_ENGINE_UNAVAILABLE',
-
- /**
- * An exception thrown by jStore whenever an invalid flavor type is used.
- */
- EX_INVALID = 'JSTORE_INVALID_FLAVOR',
-
- //------------------------------
- // Regular Expressions
- //------------------------------
-
- /**
- * Regular expression to test property values for being JSON.
- */
- RX_JSON = (function ()
- {
- try
- {
- return new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$');
- }
- catch (e)
- {
- return (/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/);
- }
- }()),
-
- //------------------------------
- // Storage Flavors
- //------------------------------
-
- /**
- * The storage flavor identifier for HTML5 local storage.
- */
- FLAVOR_LOCAL = 'jstore-html5-local',
-
- /**
- * The storage flavor identifier for HTML5 database storage.
- */
- FLAVOR_SQL = 'jstore-html5-sql',
-
- /**
- * The storage flavor identifier for Adobe Flash SharedObject storage.
- */
- FLAVOR_FLASH = 'jstore-flash',
-
- /**
- * The storage flavor identifier for Google Gears storage.
- */
- FLAVOR_GEARS = 'jstore-google-gears',
-
- /**
- * The storage flavor identifier for Internet Explorer storage, available to IE7 and IE6.
- */
- FLAVOR_MSIE = 'jstore-msie',
-
- //------------------------------
- //
- // Property Declaration
- //
- //------------------------------
-
- /**
- * The base StorageEngine class which each "storage flavor" will extend to meet the
- * requirements for its specific implementation.
- */
- StorageEngine,
-
- /**
- * The jStore object. Internal to this closure, jStore is referenced by "_". It is
- * exposed to jQuery below, and made publicly accessible through jQuery.jStore
- */
- _ = {},
-
- /**
- * The engines available to jStore for use. These are the class definitions for flavored
- * storage engines.
- *
- * Signature:
- * {
- * <storageFlavor>: <flavoredStorageEngineDefinition>,
- *
- * ...
- * }
- */
- definitions = {},
-
- /**
- * Active engines instantiated by jStore, indexed by their JRI.
- *
- * Signature:
- * {
- * <engineJRI>: <engineInstance>,
- *
- * ...
- * }
- */
- engines = {},
-
- /**
- * If we are going to be using the flash storage engine, we want to postpone the jStore ready event until the jStore
- * isFlashReady flag is also true. This property is set whenever flash is determined to be the storage engine.
- */
- waitForFlash = false,
-
- /**
- * Storage for listeners, indexed by content and event type.
- *
- * Signature:
- * {
- * <context>:
- * {
- * <eventType>: [<listener>, ...],
- *
- * ...
- * },
- *
- * ...
- * }
- */
- events = {},
-
- /**
- * The configuration for this implementation.
- *
- * Signature:
- * {
- * project: <defaultProjectName>,
- *
- * flash: <pathToFlashBootloader>,
- *
- * json: <pathToJSONFile>,
- *
- * errorCallback: <listenerToNotifyOnError>
- * }
- */
- configurations =
- {
- project: undefined,
-
- flash: 'jStore.Flash.html',
-
- json: 'browser.json.js'
- },
-
- /**
- * The active storage engine, being used to satisfy the get/set/remove functions on the jStore and jQuery
- * objects.
- */
- active;
-
- //------------------------------
- //
- // Internal Methods
- //
- //------------------------------
-
- /**
- * Determine if the given flavor is valid.
- *
- * @param flavor The flavor to test.
- *
- * @return True if the flavor is valid, false otherwise.
- */
- function validFlavor(flavor)
- {
- switch (flavor)
- {
-
- case FLAVOR_LOCAL:
- case FLAVOR_SQL:
- case FLAVOR_FLASH:
- case FLAVOR_GEARS:
- case FLAVOR_MSIE:
- return true;
-
- default:
- return false;
-
- }
- }
-
- /**
- * Performs enhanced type comparison on an object. This is more reliable method
- * of type checking a variable than a simple typeof comparison. The reason is that,
- * typeof will reduce to the lowest common type.
- *
- * "typeof []" returns Object, and not Array.
- * "typeof {}" returns Object as well.
- *
- * typecheck( [], 'Array' ) : returns true;
- * typecheck( [], 'Object' ) : returns false;
- *
- * @param type The variable type to check.
- *
- * @param compare A string representing the literal type to check.
- *
- * @return True if the variable "type" matches the compare literal.
- */
- function typecheck(type, compare)
- {
- return !type ? false : type.constructor.toString().match(new RegExp(compare + '\\(\\)', 'i')) !== null;
- }
-
- /**
- * If the provided listener is a valid function, it will be triggered with the provided context
- * and parameters.
- *
- * @param listener The listener being triggered.
- *
- * @param context The context to provide to the listener.
- *
- * @param parameters The parameters to pass to the listener as arguments.
- *
- * @return The response of the notified listener.
- */
- function notify(listener, context, parameters)
- {
- if (typecheck(listener, 'Function'))
- {
- return listener.apply(context || _, typecheck(parameters, 'Array') ? parameters : [parameters]);
- }
- }
-
- /**
- * Load the given script.
- *
- * @param path The path to the file to include.
- *
- * @param listener The listener to notify when the file finishes loading.
- */
- function loadScript(path, listener)
- {
- $.ajax(
- {
- url: path,
- complete: listener || $.noop(),
- type: 'GET',
- dataType: 'script',
- cache: false
- });
- }
-
- /**
- * Checks the type of the value, and returns a value safe to persist in any client-side mechanism.
- *
- * @param value The value which should be prepared for storage.
- *
- * @return A value safe for storage.
- */
- function prepareForStorage(value)
- {
- if (value === undefined)
- {
- return '';
- }
-
- if (typecheck(value, 'Object') ||
- typecheck(value, 'Array') ||
- typecheck(value, 'Function'))
- {
- return JSON.stringify(value);
- }
-
- return value;
- }
-
- /**
- * Checks the type of the value, and returns a value safe for access in any client-side mechanism.
- *
- * @param value The value which should be prepared for use.
- *
- * @return A value safe for use.
- */
- function prepareForRevival(value)
- {
- return RX_JSON.test(value) ? JSON.parse(value) : value;
- }
-
- /**
- * Normalize a key before using it, to ensure it's valid.
- *
- * @param key The key to normalize.
- *
- * @return A normalized key, safe for storage.
- */
- function normalizeKey(key)
- {
- return key.replace(/^\s+|\s+$/g, "");
- }
-
- /**
- * Define a flavored storage engine.
- *
- * @throws EX_COLLISION, EX_INVALID
- *
- * @param flavor The flavor of engine being defined.
- *
- * @param definition An object containing the new properties and methods for the engine extension.
- *
- * @param availability A function to invoke which must return a boolean value indicating the
- * availability of the storage flavor on this browser.
- */
- function define(flavor, definition, availability)
- {
- if (!validFlavor(flavor))
- {
- throw EX_INVALID;
- }
-
- if (availability[flavor] !== undefined)
- {
- throw EX_COLLISION;
- }
-
- /**
- * The logic here has been reworked so unavailable flavors are discarded, so we don't needlessly
- * bloat the runtime size of jStore.
- */
- if (notify(availability) === true)
- {
- _.available[flavor] = true;
-
- definition.flavor = flavor;
-
- definitions[flavor] = StorageEngine.extend(definition);
- }
- else
- {
- _.available[flavor] = false;
-
- // Filter the invalid flavor out of the priority list.
- _.enginePriority = $.map(_.enginePriority, function (engine)
- {
- if (engine === flavor)
- {
- return null;
- }
- else
- {
- return engine;
- }
- });
- }
- }
-
- /**
- * Make the jStore library ready.
- */
- function makeReady()
- {
- if (_.isReady)
- {
- return;
- }
-
- if ((waitForFlash && _.isFlashReady) || !waitForFlash)
- {
- _.isReady = true;
- _.trigger('jstore-ready', [engines[active]]);
- }
- }
-
- /**
- * Create a best-fit engine.
- */
- function createBestFitEngine()
- {
- _.create(_.enginePriority[0], undefined, 'best-fit');
- }
-
- /**
- * Get the flash version currently supported in this browser.
- *
- * @return The flash version.
- */
- function flashVersion()
- {
- // MSIE
- try
- {
- // avoid fp6 minor version lookup issues
- // see: http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet…
- var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
-
- try
- {
- axo.AllowScriptAccess = 'always';
- }
- catch (axo_e)
- {
- return '6,0,0';
- }
-
- return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
- }
-
- // Real browsers
- catch (e)
- {
- try
- {
- if (navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)
- {
- return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
- }
- }
- catch (flash_e)
- {}
- }
-
- return '0,0,0';
- }
-
- /**
- * Flash Detection functions copied from the jQuery Flash Plugin
- *
- * Copyright (c) 2006 Luke Lutman (http://jquery.lukelutman.com/plugins/flash)
- *
- * Dual licensed under the MIT and GPL licenses.
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.opensource.org/licenses/gpl-license.php
- *
- * @param version The version to compare to.
- *
- * @return True if the version is greater than or equal to the required version, false otherwise.
- */
- function hasFlashVersion(version)
- {
- var playerVersion = flashVersion().match(/\d+/g),
- requiredVersion = version.match(/\d+/g),
- index = 0,
- player,
- required;
-
- for (; index < 3; index++)
- {
- player = parseInt(playerVersion[index], 10);
- required = parseInt(requiredVersion[index], 10);
-
- // Player version is less than what is required.
- if (player < required)
- {
- return false;
- }
-
- // Player version is greater than what is required.
- else if (player > required)
- {
- return true;
- }
- }
-
- // Player and required version match exactly.
- return true;
- }
-
- //------------------------------
- //
- // Plugin Definition
- //
- //------------------------------
-
- //------------------------------
- // Error Declaration
- //------------------------------
-
- //------------------------------
- // Plugin Creation
- //------------------------------
-
- /**
- * The jStore object. Manages a collection of StorageEngines for particular "storage flavors", or the types
- * of storage solutions available to each browser.
- *
- * 2.0 Version Notes:
- *
- * - The user is now responsible for third-party script includes, with the exception of flash.
- *
- * - jStore has been given sole responsibility for testing engine availability.
- *
- * - For the sake of naming conventions, all property names now start with a lowercase, and are camel-cased.
- *
- * The following properties have been changed since the 1.2.x release:
- *
- * - EngineOrder: For the sake of naming conventions, renamed to enginePriority.
- *
- * The following properties and methods have been removed since the 1.2.x release:
- *
- * - Availability: jStore's engines would add their availability tests to this object, so jStore could test
- * them. With the changes to how availability testing works, this property has been removed.
- * A new property, "available" on jStore contains a set of available engines.
- *
- * - Engines: Formerly contained the definitions of storage engines. This property has been removed, and
- * storage of these definitions has been moved internal to the closure.
- *
- * - Instances: Formerly contained instantiated storage engines. This property has been removed, and storage
- * of instantiated engines has been moved internal to the closure.
- *
- * - CurrentEngine: Formerly contained the active storage engine being used for transacting data through the jStore
- * and/or jQuery objects. This property has been removed, and storage of the current engine has
- * been moved internal to the closure. A new method, "activeEngine" has been added to jQuery to
- * get and set the active engine to use.
- *
- * - defaults: Formerly used to set the implementation options for jStore. This property has been removed and
- * replaced with a new configuration metho on the jStore object.
- *
- * - delegate: The delegate class has been removed in favor of a much simpler bind/trigger accessor system, which
- * is accessible contextually through storage engines, or generically through jStore.
- *
- * + fail: This registration class bound events on the delegate for jstore-fail events. Instead, use:
- * jStore.bind('jstore-failure', listener);
- *
- * + flashReady: This registration class bound events on the delegate for flash-ready events. The jstore-ready method
- * now accounts for waiting for flash readyness, if and only if the flash engine is being used. Simply
- * call to jStore.ready().
- *
- * + load: Replaced with the init() method, which performs the same basic functions as the old load() method. Also,
- * the init function is now domready safe, meaning it wraps itself in a domready listener, so the end user
- * doesn't have to.
- *
- * + FindEngine: Removed entirely. The functionality provided by this method now implicitly occurs with the new define()
- * system implemented for engine flavors.
- *
- * + setCurrentEngine: Replaced by activeEngine(). Set the current active engine by passing in the JRI.
- *
- * + safeStore: Replaced by a method internal to this closure, "prepareForStorage".
- *
- * + safeResurrect: Replaced by a method internal to this closure, "prepareForRevival".
- *
- * + use: Replaced by "create".
- */
- $.extend(_, {
-
- //------------------------------
- // Properties
- //------------------------------
-
- /**
- * The priority order in which engines should be tested for use. The lower their index in the array, the higher
- * their priority for use.
- *
- * Be weary when reconfiguring the priority order of engines! jStore will use the first available engine it finds
- * based on its priority when autoloading.
- *
- * This array is filtered out as engines are defined, with invalid engines being removed.
- *
- * Signature:
- * [FLAVOR_<storageFlavor>, ...]
- */
- enginePriority: [FLAVOR_LOCAL, FLAVOR_SQL, FLAVOR_FLASH, FLAVOR_MSIE],
-
- /**
- * A collection of the availability states of engines, indexed by their flavor.
- *
- * Signature:
- * {
- * <storageFlavor>: true|false,
- *
- * ...
- * }
- */
- available: {},
-
- /**
- * Flag to determine if the jStore library is ready. jStore becomes ready once the dom is ready and all necessary
- * startup procedures required by jStore to function properly are completed.
- */
- isReady: false,
-
- /**
- * With the flash storage engine, we have to jump through a couple of hoops before the flash engine is ready to work.
- * This flag tracks whether or not the flash storage is available.
- */
- isFlashReady: false,
-
- /**
- * The available engine flavors.
- */
- flavors:
- {
- local: FLAVOR_LOCAL,
-
- sql: FLAVOR_SQL,
-
- flash: FLAVOR_FLASH,
-
- gears: FLAVOR_GEARS,
-
- msie: FLAVOR_MSIE
- },
-
- //------------------------------
- // Constructor
- //------------------------------
-
- /**
- * Constructor.
- *
- * @throws EX_INVALID
- *
- * @param project The name of the jStore project. Used to generate a JRI for the engine we create.
- *
- * @param configuration Optionally, an object containing configuration options for this implementation.
- *
- * @param flavor Optionally, the flavor of storage to use. If not provided, jStore will pick the
- * best flavor, based on the current browser.
- *
- * @return jStore
- */
- init: function (project, configuration, flavor)
- {
- // Extend our plugin configurations
- $.extend(configurations, {project: project}, configuration);
-
- $(function ()
- {
- // If JSON parsing isn't defined in this browser, include it.
- if (window.JSON === undefined)
- {
- loadScript(configurations.json);
- }
-
- // If we have an explicit flavor to use, use it.
- if (flavor !== undefined)
- {
- _.create(flavor, project, 'default');
- }
-
- // Otherwise, attempt to create a best-fit engine.
- else
- {
- createBestFitEngine();
- }
- });
-
- return _;
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- /**
- * Create an instance of a flavored engine.
- *
- * @throws EX_INVALID, EX_UNAVAILABLE, EX_DUPLICATE
- *
- * @param flavor The flavor to create the engine with.
- *
- * @param project The project identifier for this instance.
- *
- * @param identifier Some arbitrary identifier for this project instance of the engine.
- *
- * @return The created instance.
- */
- create: function (flavor, project, identifier)
- {
- project = project || configurations.project || location.hostname.replace(/\./g, '-') || 'unknown';
-
- if (!validFlavor(flavor))
- {
- throw EX_INVALID;
- }
-
- if (definitions[flavor] === undefined)
- {
- throw EX_UNAVAILABLE;
- }
-
- var jri = (identifier !== undefined ? identifier + '.' : '') + project + '.' + flavor,
- engine;
-
- if (engines[jri] !== undefined)
- {
- throw EX_DUPLICATE;
- }
-
- // Create our engine instance.
- engine = engines[jri] = new definitions[flavor](project, jri);
-
- // Set up a listener for our jstore-engine-ready event.
- engine.ready(function ()
- {
- _.trigger('jstore-engine-ready', [engine]);
- });
-
- if (flavor === FLAVOR_FLASH && !_.isFlashReady)
- {
- if (active === undefined)
- {
- waitForFlash = true;
- }
-
- // Define a window-accessible function for flash to call via ExternalInterface
- window.jstore_ready = function ()
- {
- _.isFlashReady = true;
- _.trigger('flash-ready');
-
- if (active === undefined)
- {
- makeReady();
- }
-
- // Remove the callback from the window scope, as it is no longer necessary
- window.flash_ready = undefined;
- };
-
- window.jstore_error = function (message)
- {
- _.trigger('jstore-error', ['JSTORE_FLASH_EXCEPTION', null, message]);
- };
-
- $('<iframe style="height:1px;width:1px;position:absolute;left:0;top:0;margin-left:-100px;" id="jStoreFlashFrame" src="' +
- configurations.flash + '"></iframe>').appendTo('body');
- }
- else if (active === undefined)
- {
- active = jri;
- makeReady();
- }
-
- return engine;
- },
-
- /**
- * Fetch an engine by it's JRI.
- *
- * @param jri The JRI of the engine to retrieve.
- *
- * @return The requested engine.
- */
- engine: function (jri)
- {
- return engines[jri];
- },
-
- /**
- * Returns the active storage engine being used. If a value is passed, sets that engine as the active engine.
- *
- * @throws EX_UNKNOWN
- *
- * @param jri Optionally, the JRI of the engine to make active, if it should be changed.
- *
- * @return The active storage engine.
- */
- activeEngine: function (jri)
- {
- if (jri !== undefined)
- {
- if (engines[jri] === undefined)
- {
- throw EX_UNKNOWN;
- }
- else
- {
- active = jri;
- }
- }
-
- return engines[active];
- },
-
- /**
- * Bind an event listener.
- *
- * @param event The event to bind a listener on.
- *
- * @param listener The listener to notify when the event occurs.
- *
- * @param context The context of the binding. A string representing the engine flavor
- * binding the event, or undefined to indicate it's a jStore event.
- *
- * @return jStore
- */
- bind: function (event, listener, context)
- {
- context = context || 'jstore';
-
- if (events[context] === undefined)
- {
- events[context] = {};
- }
-
- if (events[context][event] === undefined)
- {
- events[context][event] = [listener];
- }
- else
- {
- events[context][event].push(listener);
- }
-
- return _;
- },
-
- /**
- * Trigger an event, notifying any bound listeners.
- *
- * @param event The event to trigger.
- *
- * @param parameters Any additional parameters to pass to the listeners being notified.
- *
- * @param context The context of the binding. A string representing the engine flavor
- * binding the event, or undefined to indicate it's a jStore event.
- *
- * @return jStore
- */
- trigger: function (event, parameters, context)
- {
- context = context || 'jstore';
-
- if (events[context] !== undefined)
- {
- if (events[context][event] !== undefined)
- {
- $.each(events[context][event], function ()
- {
- notify(this, _, parameters);
- });
- }
- }
-
- return _;
- },
-
- /**
- * Bind a listener to be notified when jStore causes a non-fatal exception.
- *
- * @param listener The listener to notify when a failure occurs.
- */
- error: function (listener)
- {
- _.bind('jstore-error', listener);
- },
-
- /**
- * Bind a listener to be notified when jStore is ready.
- *
- * @param listener The listener to notify when jStore is ready.
- *
- * @return jStore
- */
- ready: function (listener)
- {
- if (_.isReady)
- {
- notify(listener);
- }
- else
- {
- _.bind('jstore-ready', listener);
- }
-
- return _;
- },
-
- /**
- * Bind a listener to be notified when jStore and the default engine are ready.
- *
- * @param listener The listener to notify when jStore and it's default engine are ready.
- *
- * @return jStore
- */
- engineReady: function (listener)
- {
- if (_.isReady)
- {
- notify(listener);
- }
- else
- {
- _.bind('jstore-engine-ready', listener);
- }
-
- return _;
- },
-
- /**
- * A combined getter/setter for the active engine.
- *
- * @param key The key of the property to get, or set.
- *
- * @param value If a valid value is provided, sets the engine.
- *
- * @return The requested property value.
- */
- store: function (key, value)
- {
- return value === undefined ? _.get(key) : _.set(key, value);
- },
-
- /**
- * Remove a property from the active engine.
- *
- * @param key The key of the property to remove.
- *
- * @return The value of the property before removal.
- */
- remove: function (key)
- {
- return _.activeEngine().remove(key);
- },
-
- /**
- * Get a property from the active engine.
- *
- * @param key The key of the property to get.
- *
- * @return The value of the property.
- */
- get: function (key)
- {
- return _.activeEngine().get(key);
- },
-
- /**
- * Set a property on the active engine.
- *
- * @param key The key of the property to set.
- *
- * @param value The value to set the property to.
- *
- * @return The new value of the property.
- */
- set: function (key, value)
- {
- return _.activeEngine().set(key, value);
- }
-
- });
-
- //------------------------------
- // Core Extension
- //------------------------------
-
- //------------------------------
- //
- // Class Definition
- //
- //------------------------------
-
- /**
- * The StorageEngine class is the unified API through which jStore accesses and manipulates
- * the various storage flavors available.
- *
- * 2.0 Version Notes:
- *
- * - All third-party loading is now the responsibility of the developer.
- *
- * - The delegate class has been removed entirely. Engines have been given "bind" and "trigger" methods
- * to interact directly with the delegate like-replacement that has been added to jStore.
- *
- * - Engine availability has been moved out of the engines themselves, and elevated to a jStore
- * responsibility.
- *
- * The following methods have changed since the 1.2.x release:
- *
- * - get: When "get"ting a non-stored property, the get function will now return "undefined"
- * instead of "null". "null" can now be used as a valid property value.
- *
- * - rem: Renamed to "remove". I always felt dirty about "rem" being vaguely explicit.
- *
- * The following properties have been removed since the 1.2.x release:
- *
- * - autoload: Part of the third-party loading logic.
- *
- * - hasIncluded: Part of the third-party loading logic.
- *
- * - includes: Part of the third-party loading logic.
- *
- * - isAvailable: Part of the availability logic elevated to jStore.
- *
- * @throws EX_UNSTABLE
- */
- StorageEngine = Class.extend({
-
- //------------------------------
- // Properties
- //------------------------------
-
- /**
- * The project which owns this storage engine.
- */
- project: undefined,
-
- /**
- * The JRI (jStore Resource Identifier) acts as a uuid for this specific instance
- * of the storage engine.
- */
- jri: undefined,
-
- /**
- * The flavor of this engine.
- */
- flavor: undefined,
-
- /**
- * The actual database object which data is transacted through.
- */
- database: undefined,
-
- /**
- * A StorageEngine should always respond to fetch requests synchronously. However, some
- * of the storage flavors require callback-based asynchronous access. To get around this,
- * we simlpy require all engines to function off a primary data cache, to allow for
- * synchronous access across all implementations.
- *
- * Signature:
- * {
- * <propertyKey>: <propertyValue>,
- *
- * ...
- * }
- */
- data: undefined,
-
- /**
- * A number of storage engines enforce a size limit as to what they will persist for a given site.
- * This limit is not monitored or computed by jStore currently, and this property will merely give
- * a static indication of the total size alloted to the engine, as defined by the storage flavor.
- */
- limit: undefined,
-
- /**
- * Each storage flavor has a different process to go through before it's "ready" to transact data. This
- * property stores the state of the engine's readyness, and uses it to notify listeners whenever jStore
- * is ready to function.
- */
- isReady: undefined,
-
- //------------------------------
- // Constructor
- //------------------------------
-
- /**
- * Constructor.
- *
- * @param project The project which instantiated this engine.
- *
- * @param jri The uuid assigned to this instance by jStore.
- */
- init: function (project, jri)
- {
- this.project = project;
- this.jri = jri;
- this.data = {};
- this.isReady = false;
- this.updateCache();
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- /**
- * Update the cache.
- */
- updateCache: function ()
- {
- this.isReady = true;
- this.trigger('engine-ready', [this]);
- },
-
- /**
- * Bind a listener to an event dispatched by this engine.
- *
- * @param event The event to bind on.
- *
- * @param listener The listener to notify when the event occurs.
- */
- bind: function (event, listener)
- {
- _.bind(event, listener, this.jri);
- },
-
- /**
- * Trigger an event, notifying all bound listeners.
- *
- * @param event The event to trigger.
- *
- * @param parameters An optional Array of parameters to pass to the listeners.
- */
- trigger: function (event, parameters)
- {
- _.trigger(event, parameters, this.jri);
- },
-
- /**
- * Bind a listener to the StorageEngine's ready event.
- *
- * @param listener The listener to notify whenever this engine is ready to transact data.
- */
- ready: function (listener)
- {
- if (this.isReady)
- {
- notify(listener, this);
- }
- else
- {
- this.bind('engine-ready', listener);
- }
- },
-
- /**
- * Get a property from the StorageEngine.
- *
- * @param key The property key of the data to retrieve.
- *
- * @return The property value, or "undefined" if the property isn't stored.
- */
- get: function (key)
- {
- this.__interruptAccess();
-
- return this.data[key];
- },
-
- /**
- * Sets a property in the StorageEngine.
- *
- * @param key The key of the property.
- *
- * @param value The value of the property.
- *
- * @return The new value of the property.
- */
- set: function (key, value)
- {
- this.__interruptAccess();
-
- key = normalizeKey(key);
-
- try
- {
- this.__set(key, value);
- }
- catch (e)
- {
- _.trigger('jstore-error', ['JSTORE_STORAGE_FAILURE', this.jri, e]);
- }
-
- this.data[key] = value;
-
- return value;
- },
-
- /**
- * Removes a property from the StorageEngine.
- *
- * @param key The property key of the data to remove.
- *
- * @return The value of the property, before it was removed.
- */
- remove: function (key)
- {
- this.__interruptAccess();
-
- key = normalizeKey(key);
-
- try
- {
- this.__remove(key);
- }
- catch (e)
- {
- _.trigger('jstore-error', ['JSTORE_REMOVE_FAILURE', this.jri, e]);
- }
-
- var buffer = this.data[key];
-
- this.data[key] = undefined;
-
- return buffer;
- },
-
- //------------------------------
- // Internal Methods
- //------------------------------
-
- /**
- * Ensures the engine is in a stable state for transacting data.
- *
- * @throws EX_UNSTABLE
- */
- __interruptAccess: function ()
- {
- if (!this.isReady)
- {
- throw EX_UNSTABLE;
- }
- },
-
- /**
- * Sets a property in the StorageEngine. This method should be overloaded to provide actual
- * storage flavor integration.
- *
- * @param key The key of the property.
- *
- * @param value The value of the property.
- *
- * @return The new value of the property.
- */
- __set: function (key, value)
- {
- return;
- },
-
- /**
- * Removes a property from the StorageEngine. This method should be overloaded to provide actual
- * storage flavor integration.
- *
- * @param key The property key of the data to remove.
- *
- * @return The value of the property, before it was removed.
- */
- __remove: function (key)
- {
- return;
- }
-
- });
-
- //------------------------------
- //
- // jQuery Hooks
- //
- //------------------------------
-
- $.extend($.fn, {
-
- //------------------------------
- // Methods
- //------------------------------
-
- /**
- * A combined getter/setter for the active engine.
- *
- * @param key The key of the property to get, or set.
- *
- * @param value If a valid value is provided, sets the engine.
- *
- * @return jQuery
- */
- store: function (key, value)
- {
- if (value === undefined)
- {
- _.get(key);
- }
- else
- {
- _.set(key, value);
- }
-
- return this;
- },
-
- /**
- * Remove a property from the active engine.
- *
- * @param key The key of the property to remove.
- *
- * @return jQuery
- */
- removeStore: function (key)
- {
- _.activeEngine().remove(key);
-
- return this;
- },
-
- /**
- * Get a property from the active engine.
- *
- * @param key The key of the property to get.
- *
- * @return The value of the property.
- */
- getStore: function (key)
- {
- return _.activeEngine().get(key);
- },
-
- /**
- * Set a property on the active engine.
- *
- * @param key The key of the property to set.
- *
- * @param value The value to set the property to.
- *
- * @return jQuery
- */
- setStore: function (key, value)
- {
- _.activeEngine().set(key, value);
-
- return this;
- }
-
- });
-
- //------------------------------
- //
- // Event Bindings
- //
- //------------------------------
-
- //------------------------------
- //
- // Startup Code
- //
- //------------------------------
-
- //------------------------------
- // Expose jStore through jQuery
- //------------------------------
-
- window.jStore = $.jStore = _;
-
- //------------------------------
- //
- // Engine Definitions
- //
- //------------------------------
-
- //------------------------------
- // Local
- //------------------------------
-
- define(FLAVOR_LOCAL,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: parseInt(5e5, 16),
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- this.database = window.globalStorage === undefined ? window.localStorage : window.globalStorage[location.hostname];
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function ()
- {
- var key, value;
-
- for (key in this.database)
- {
- var has_key = false;
- if (this.database.hasOwnProperty) {
- if (this.database.hasOwnProperty(key)) {
- has_key = true;
- }
- } else { // IE 8
- if (this.database.getItem(key) !== null) {
- has_key = true;
- }
- }
-
- if (has_key) {
- value = this.database.getItem(key);
-
- // Gecko's getItem returns {value: 'the value'}, WebKit returns 'the value'
- this.data[key] = prepareForRevival(value && value.value ? value.value : value);
- }
- }
-
- this._super();
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- this.database.setItem(key, prepareForStorage(value));
- },
-
- __remove: function (key)
- {
- this.database.removeItem(key);
- }
- },
-
- function ()
- {
- return window.localStorage !== undefined || window.globalStorage !== undefined;
- });
-
- //------------------------------
- // SQL
- //------------------------------
-
- define(FLAVOR_SQL,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: parseInt(32e3, 16),
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- this.database = window.openDatabase('jstore-' + project, '1.0', project, this.limit);
-
- if (!this.database)
- {
- throw 'JSTORE_SQL_NO_DB';
- }
-
- this.database.transaction(function (database)
- {
- database.executeSql('CREATE TABLE IF NOT EXISTS jstore (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)');
- });
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function ()
- {
- var self = this,
- _super = this._super;
-
- this.database.transaction(function (database)
- {
- database.executeSql('SELECT k,v FROM jstore', [], function (database, result)
- {
- var rows = result.rows,
- index = 0,
- row;
-
- for (; index < rows.length; ++index)
- {
- row = rows.item(index);
- self.data[row.k] = prepareForRevival(row.v);
- }
-
- _super.apply(self);
- });
- });
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- this.database.transaction(function (database)
- {
- database.executeSql('INSERT OR REPLACE INTO jstore(k, v) VALUES (?, ?)', [key, prepareForStorage(value)]);
- });
- },
-
- __remove: function (key)
- {
- this.database.transaction(function (database)
- {
- database.executeSql('DELETE FROM jstore WHERE k = ?', [key]);
- });
- }
- },
-
- function ()
- {
- return window.openDatabase !== undefined;
- });
-
- //------------------------------
- // Flash
- //------------------------------
-
- define(FLAVOR_FLASH,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: -1,
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- var self = this;
-
- _.bind('flash-ready', function ()
- {
- self.__flashReadyListener();
- });
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function (enable)
- {
- /**
- * The default call to updateCache passes no variable, so we can short circuit the
- * ready state until we explictly call this after flash ready.
- */
- if (enable === true)
- {
- var key,
- dataset = this.database.jstore_get_all();
-
- for (key in dataset)
- {
- if (dataset.hasOwnProperty(key))
- {
- this.data[key] = prepareForRevival(this.database.jstore_get(key));
- }
- }
-
- this._super();
- }
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- if (!this.database.jstore_set(key, prepareForStorage(value)))
- {
- _.trigger('jstore-error', ['JSTORE_STORAGE_FAILURE', this.jri, 'Flash Exception']);
- }
- },
-
- __remove: function (key)
- {
- this.database.jstore_remove(key);
- },
-
- /**
- * Triggered whenever flash is ready.
- */
- __flashReadyListener: function ()
- {
- var iFrame = $('#jStoreFlashFrame')[0],
- frameDocument;
-
- // MSIE
- if (iFrame.Document !== undefined && typecheck(iFrame.Document.jStoreFlash.jstore_get, 'Function'))
- {
- this.database = iFrame.Document.jStoreFlash;
- }
-
- // Real Browsers
- else if (iFrame.contentWindow && iFrame.contentWindow.document)
- {
- frameDocument = $(iFrame.contentWindow.document);
-
- // Webkit
- if (typecheck($('object', frameDocument)[0].jstore_get, 'Function'))
- {
- this.database = $('object', frameDocument)[0];
- }
-
- // Gecko
- else if (typecheck($('embed', frameDocument)[0].jstore_get, 'Function'))
- {
- this.database = $('embed', frameDocument)[0];
- }
- }
-
- if (this.database === undefined)
- {
- throw 'JSTORE_FLASH_REFERENCE_ISSUE';
- }
- else
- {
- this.updateCache(true);
- }
- }
- },
-
- function ()
- {
- return hasFlashVersion('9.0.0');
- });
-
- //------------------------------
- // Gears
- //------------------------------
-
- define(FLAVOR_GEARS,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: -1,
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- this.database = google.gears.factory.create('beta.database');
- this.database.open('jstore-' + project);
- this.database.execute('CREATE TABLE IF NOT EXISTS jstore (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)');
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function ()
- {
- var result = this.database.execute('SELECT k,v FROM jstore');
-
- while (result.isValidRow())
- {
- this.data[result.field(0)] = prepareForRevival(result.field(1));
- result.next();
- }
-
- result.close();
-
- this._super();
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- this.database.execute('BEGIN');
- this.database.execute('INSERT OR REPLACE INTO jstore(k, v) VALUES (?, ?)', [key, prepareForStorage(value)]);
- this.database.execute('COMMIT');
- },
-
- __remove: function (key)
- {
- this.database.execute('BEGIN');
- this.database.execute('DELETE FROM jstore WHERE k = ?', [key]);
- this.database.execute('COMMIT');
- }
- },
-
- function ()
- {
- return window.google !== undefined && window.google.gears !== undefined;
- });
-
- //------------------------------
- // MSIE
- //------------------------------
-
- define(FLAVOR_MSIE,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: parseInt(1e4, 16),
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- this.database = $('<div style="display:none;behavior:url(\'#default#userData\')" id="jstore-' + project + '"></div>')
- .appendTo(document.body).get(0);
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function ()
- {
- this.database.load(this.project);
-
- var node = document.getElementById('jstore-' + this.project),
- xmlDoc = node.XMLDocument,
- root,
- index = 0;
-
- if (xmlDoc && xmlDoc.documentElement && xmlDoc.documentElement.attributes)
- {
- root = xmlDoc.documentElement;
-
- for (; index < root.attributes.length; ++index)
- {
- this.data[root.attributes.item(index).nodeName] = prepareForRevival(root.attributes.item(index).nodeValue);
- }
- }
-
- this._super();
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- this.database.setAttribute(key, prepareForStorage(value));
- this.database.save(this.project);
- },
-
- __remove: function (key)
- {
- this.database.removeAttribute(key);
- this.database.save(this.project);
- }
- },
-
- function ()
- {
- return window.ActiveXObject !== undefined;
- });
-
-}(jQuery, window));
--- a/static/scripts/packed/class.js Fri Feb 18 14:53:35 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-/*
- * Class definition
- *
- * Copyright (c) 2008 John Resig (http://ejohn.org/blog/simple-javascript-inheritance/)
- * Inspired by base2 and Prototype
- */
-(function(){var a=false,b=/xyz/.test(function(){xyz})?/\b_super\b/:/.*/;this.Class=function(){};Class.extend=function(g){var f=this.prototype;a=true;var e=new this();a=false;for(var d in g){e[d]=(typeof g[d]==="function"&&typeof f[d]==="function"&&b.test(g[d])?(function(h,i){return function(){var k=this._super;this._super=f[h];var j=i.apply(this,arguments);this._super=k;return j}}(d,g[d])):g[d])}function c(){if(!a&&this.init){this.init.apply(this,arguments)}}c.prototype=e;c.constructor=c;c.extend=arguments.callee;return c}}());
\ No newline at end of file
--- a/static/scripts/packed/galaxy.base.js Fri Feb 18 14:53:35 2011 -0500
+++ b/static/scripts/packed/galaxy.base.js Fri Feb 18 15:06:34 2011 -0500
@@ -1,1 +1,1 @@
-if(!Array.indexOf){Array.prototype.indexOf=function(c){for(var b=0,a=this.length;b<a;b++){if(this[b]==c){return b}}return -1}}function obj_length(c){if(c.length!==undefined){return c.length}var b=0;for(var a in c){b++}return b}$.fn.makeAbsolute=function(a){return this.each(function(){var b=$(this);var c=b.position();b.css({position:"absolute",marginLeft:0,marginTop:0,top:c.top,left:c.left,right:$(window).width()-(c.left+b.width())});if(a){b.remove().appendTo("body")}})};function show_hide_popupmenu_options(d,c,a){a=(a===undefined?true:a);var b=new RegExp(c);$(d).find("li").each(function(){if(b.exec($(this).text())){if(a){$(this).show()}else{$(this).hide()}}})}function make_popupmenu(a,b){a.data("menu_options",b);a.bind("click.show_popup",function(c){$(".popmenu-wrapper").remove();setTimeout(function(){var f=$("<ul id='"+a.attr("id")+"-menu'></ul>");var e=a.data("menu_options");if(obj_length(e)<=0){$("<li>No Options.</li>").appendTo(f)}$.each(e,function(i,h){if(h){$("<li/>").html(i).click(h).appendTo(f)}else{$("<li class='head'/>").html(i).appendTo(f)}});var g=$("<div class='popmenu-wrapper' style='position: absolute;left: 0; top: -1000;'>");g.append(f).append("<div class='overlay-border'>").appendTo("body");var d=c.pageX-g.width()/2;d=Math.min(d,$(document).scrollLeft()+$(window).width()-$(g).width()-20);d=Math.max(d,$(document).scrollLeft()+20);g.css({top:c.pageY-5,left:d})},10);setTimeout(function(){var e=function(g){$(g).bind("click.close_popup",function(){$(".popmenu-wrapper").remove();g.unbind("click.close_popup")})};e($(window.document));e($(window.top.document));for(var d=window.top.frames.length;d--;){var f=$(window.top.frames[d].document);e(f)}},50);return false})}function make_popup_menus(){jQuery("div[popupmenu]").each(function(){var a={};var c=$(this);c.find("a").each(function(){var f=$(this),h=f.get(0);var d=h.getAttribute("confirm"),e=h.getAttribute("href"),g=h.getAttribute("target");if(!e){a[f.text()]=null}else{a[f.text()]=function(){if(!d||confirm(d)){var i;if(g=="_parent"){window.parent.location=e}else{if(g=="_top"){window.top.location=e}else{if(g=="demo"){if(i==undefined||i.closed){i=window.open(e,g);i.creator=self}}else{window.location=e}}}}}}});var b=$("#"+c.attr("popupmenu"));b.find("a").bind("click",function(d){d.stopPropagation();return true});make_popupmenu(b,a);b.addClass("popup");c.remove()})}function naturalSort(j,h){var p=/(-?[0-9\.]+)/g,k=j.toString().toLowerCase()||"",g=h.toString().toLowerCase()||"",l=String.fromCharCode(0),n=k.replace(p,l+"$1"+l).split(l),e=g.replace(p,l+"$1"+l).split(l),d=(new Date(k)).getTime(),o=d?(new Date(g)).getTime():null;if(o){if(d<o){return -1}else{if(d>o){return 1}}}var m,f;for(var i=0,c=Math.max(n.length,e.length);i<c;i++){m=parseFloat(n[i])||n[i];f=parseFloat(e[i])||e[i];if(m<f){return -1}else{if(m>f){return 1}}}return 0}function replace_big_select_inputs(a,b){if(!jQuery().autocomplete){return}if(a===undefined){a=20}if(b===undefined){b=3000}$("select").each(function(){var d=$(this);var g=d.find("option").length;if((g<a)||(g>b)){return}if(d.attr("multiple")===true){return}if(d.hasClass("no-autocomplete")){return}var m=d.attr("value");var c=$("<input type='text' class='text-and-autocomplete-select'></input>");c.attr("size",40);c.attr("name",d.attr("name"));c.attr("id",d.attr("id"));c.click(function(){var n=$(this).val();$(this).val("Loading...");$(this).showAllInCache();$(this).val(n);$(this).select()});var e=[];var i={};d.children("option").each(function(){var o=$(this).text();var n=$(this).attr("value");e.push(o);i[o]=n;i[n]=n;if(n==m){c.attr("value",o)}});if(m===""||m==="?"){c.attr("value","Click to Search or Select")}if(d.attr("name")=="dbkey"){e=e.sort(naturalSort)}var f={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:b,minChars:0,hideForLessThanMinChars:false};c.autocomplete(e,f);d.replaceWith(c);var k=function(){var o=c.attr("value");var n=i[o];if(n!==null&&n!==undefined){c.attr("value",n)}else{if(m!==""){c.attr("value",m)}else{c.attr("value","?")}}};c.parents("form").submit(function(){k()});$(document).bind("convert_to_values",function(){k()});if(d.attr("refresh_on_change")=="true"){var h=d.attr("refresh_on_change_values"),l=d.attr("last_selected_value");if(h!==undefined){h=h.split(",")}var j=function(){var n=i[c.attr("value")];if(l!==n&&n!==null&&n!==undefined){if(h!==undefined&&$.inArray(n,h)===-1&&$.inArray(l,h)===-1){return}c.attr("value",n);$(window).trigger("refresh_on_change");c.parents("form").submit()}};c.bind("result",j);c.keyup(function(n){if(n.keyCode===13){j()}});c.keydown(function(n){if(n.keyCode===13){return false}})}})}function async_save_text(d,f,e,a,c,h,i,g,b){if(c===undefined){c=30}if(i===undefined){i=4}$("#"+d).live("click",function(){if($("#renaming-active").length>0){return}var l=$("#"+f),k=l.text(),j;if(h){j=$("<textarea></textarea>").attr({rows:i,cols:c}).text($.trim(k))}else{j=$("<input type='text'></input>").attr({value:$.trim(k),size:c})}j.attr("id","renaming-active");j.blur(function(){$(this).remove();l.show();if(b){b(j)}});j.keyup(function(n){if(n.keyCode===27){$(this).trigger("blur")}else{if(n.keyCode===13){var m={};m[a]=$(this).val();$(this).trigger("blur");$.ajax({url:e,data:m,error:function(){alert("Text editing for elt "+f+" failed")},success:function(o){if(o!==""){l.text(o)}else{l.html("<em>None</em>")}if(b){b(j)}}})}}});if(g){g(j)}l.hide();j.insertAfter(l);j.focus();j.select();return})}function init_history_items(d,a,c){var b=function(){try{var e=$.jStore.store("history_expand_state");if(e){for(var g in e){$("#"+g+" div.historyItemBody").show()}}}catch(f){$.jStore.remove("history_expand_state")}if($.browser.mozilla){$("div.historyItemBody").each(function(){if(!$(this).is(":visible")){$(this).find("pre.peek").css("overflow","hidden")}})}d.each(function(){var j=this.id,h=$(this).children("div.historyItemBody"),i=h.find("pre.peek");$(this).find(".historyItemTitleBar > .historyItemTitle").wrap("<a href='javascript:void(0);'></a>").click(function(){var k;if(h.is(":visible")){if($.browser.mozilla){i.css("overflow","hidden")}h.slideUp("fast");if(!c){k=$.jStore.store("history_expand_state");if(k){delete k[j];$.jStore.store("history_expand_state",k)}}}else{h.slideDown("fast",function(){if($.browser.mozilla){i.css("overflow","auto")}});if(!c){k=$.jStore.store("history_expand_state");if(k===undefined){k={}}k[j]=true;$.jStore.store("history_expand_state",k)}}return false})});$("#top-links > a.toggle").click(function(){var h=$.jStore.store("history_expand_state");if(h===undefined){h={}}$("div.historyItemBody:visible").each(function(){if($.browser.mozilla){$(this).find("pre.peek").css("overflow","hidden")}$(this).slideUp("fast");if(h){delete h[$(this).parent().attr("id")]}});$.jStore.store("history_expand_state",h)}).show()};if(a){b()}else{$.jStore.init("galaxy");$.jStore.ready(function(){b()})}}function commatize(b){b+="";var a=/(\d+)(\d{3})/;while(a.test(b)){b=b.replace(a,"$1,$2")}return b}function reset_tool_search(a){var c=$("#galaxy_tools").contents();if(c.length===0){c=$(document)}$(this).removeClass("search_active");c.find(".toolTitle").removeClass("search_match");c.find(".toolSectionBody").hide();c.find(".toolTitle").show();c.find(".toolPanelLabel").show();c.find(".toolSectionWrapper").each(function(){if($(this).attr("id")!="recently_used_wrapper"){$(this).show()}else{if($(this).hasClass("user_pref_visible")){$(this).show()}}});c.find("#search-no-results").hide();c.find("#search-spinner").hide();if(a){var b=c.find("#tool-search-query");b.val("search tools");b.css("font-style","italic")}}var GalaxyAsync=function(a){this.url_dict={};this.log_action=(a===undefined?false:a)};GalaxyAsync.prototype.set_func_url=function(a,b){this.url_dict[a]=b};GalaxyAsync.prototype.set_user_pref=function(a,b){var c=this.url_dict[arguments.callee];if(c===undefined){return false}$.ajax({url:c,data:{pref_name:a,pref_value:b},error:function(){return false},success:function(){return true}})};GalaxyAsync.prototype.log_user_action=function(c,b,d){if(!this.log_action){return}var a=this.url_dict[arguments.callee];if(a===undefined){return false}$.ajax({url:a,data:{action:c,context:b,params:d},error:function(){return false},success:function(){return true}})};$(document).ready(function(){$("select[refresh_on_change='true']").change(function(){var a=$(this),e=a.val(),d=false,c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var b=a.attr("last_selected_value");if($.inArray(e,c)===-1&&$.inArray(b,c)===-1){return}}$(window).trigger("refresh_on_change");$(document).trigger("convert_to_values");a.get(0).form.submit()});$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus();replace_big_select_inputs(20,1500);$("a").click(function(){var b=$(this);var c=(parent.frames&&parent.frames.galaxy_main);if((b.attr("target")=="galaxy_main")&&(!c)){var a=b.attr("href");if(a.indexOf("?")==-1){a+="?"}else{a+="&"}a+="use_panels=True";b.attr("href",a);b.attr("target","_self")}return b})});
\ No newline at end of file
+if(!Array.indexOf){Array.prototype.indexOf=function(c){for(var b=0,a=this.length;b<a;b++){if(this[b]==c){return b}}return -1}}function obj_length(c){if(c.length!==undefined){return c.length}var b=0;for(var a in c){b++}return b}$.fn.makeAbsolute=function(a){return this.each(function(){var b=$(this);var c=b.position();b.css({position:"absolute",marginLeft:0,marginTop:0,top:c.top,left:c.left,right:$(window).width()-(c.left+b.width())});if(a){b.remove().appendTo("body")}})};function show_hide_popupmenu_options(d,c,a){a=(a===undefined?true:a);var b=new RegExp(c);$(d).find("li").each(function(){if(b.exec($(this).text())){if(a){$(this).show()}else{$(this).hide()}}})}function make_popupmenu(a,b){a.data("menu_options",b);a.bind("click.show_popup",function(c){$(".popmenu-wrapper").remove();setTimeout(function(){var f=$("<ul id='"+a.attr("id")+"-menu'></ul>");var e=a.data("menu_options");if(obj_length(e)<=0){$("<li>No Options.</li>").appendTo(f)}$.each(e,function(i,h){if(h){$("<li/>").html(i).click(h).appendTo(f)}else{$("<li class='head'/>").html(i).appendTo(f)}});var g=$("<div class='popmenu-wrapper' style='position: absolute;left: 0; top: -1000;'>");g.append(f).append("<div class='overlay-border'>").appendTo("body");var d=c.pageX-g.width()/2;d=Math.min(d,$(document).scrollLeft()+$(window).width()-$(g).width()-20);d=Math.max(d,$(document).scrollLeft()+20);g.css({top:c.pageY-5,left:d})},10);setTimeout(function(){var e=function(g){$(g).bind("click.close_popup",function(){$(".popmenu-wrapper").remove();g.unbind("click.close_popup")})};e($(window.document));e($(window.top.document));for(var d=window.top.frames.length;d--;){var f=$(window.top.frames[d].document);e(f)}},50);return false})}function make_popup_menus(){jQuery("div[popupmenu]").each(function(){var a={};var c=$(this);c.find("a").each(function(){var f=$(this),h=f.get(0);var d=h.getAttribute("confirm"),e=h.getAttribute("href"),g=h.getAttribute("target");if(!e){a[f.text()]=null}else{a[f.text()]=function(){if(!d||confirm(d)){var i;if(g=="_parent"){window.parent.location=e}else{if(g=="_top"){window.top.location=e}else{if(g=="demo"){if(i==undefined||i.closed){i=window.open(e,g);i.creator=self}}else{window.location=e}}}}}}});var b=$("#"+c.attr("popupmenu"));b.find("a").bind("click",function(d){d.stopPropagation();return true});make_popupmenu(b,a);b.addClass("popup");c.remove()})}function naturalSort(j,h){var p=/(-?[0-9\.]+)/g,k=j.toString().toLowerCase()||"",g=h.toString().toLowerCase()||"",l=String.fromCharCode(0),n=k.replace(p,l+"$1"+l).split(l),e=g.replace(p,l+"$1"+l).split(l),d=(new Date(k)).getTime(),o=d?(new Date(g)).getTime():null;if(o){if(d<o){return -1}else{if(d>o){return 1}}}var m,f;for(var i=0,c=Math.max(n.length,e.length);i<c;i++){m=parseFloat(n[i])||n[i];f=parseFloat(e[i])||e[i];if(m<f){return -1}else{if(m>f){return 1}}}return 0}function replace_big_select_inputs(a,b){if(!jQuery().autocomplete){return}if(a===undefined){a=20}if(b===undefined){b=3000}$("select").each(function(){var d=$(this);var g=d.find("option").length;if((g<a)||(g>b)){return}if(d.attr("multiple")===true){return}if(d.hasClass("no-autocomplete")){return}var m=d.attr("value");var c=$("<input type='text' class='text-and-autocomplete-select'></input>");c.attr("size",40);c.attr("name",d.attr("name"));c.attr("id",d.attr("id"));c.click(function(){var n=$(this).val();$(this).val("Loading...");$(this).showAllInCache();$(this).val(n);$(this).select()});var e=[];var i={};d.children("option").each(function(){var o=$(this).text();var n=$(this).attr("value");e.push(o);i[o]=n;i[n]=n;if(n==m){c.attr("value",o)}});if(m===""||m==="?"){c.attr("value","Click to Search or Select")}if(d.attr("name")=="dbkey"){e=e.sort(naturalSort)}var f={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:b,minChars:0,hideForLessThanMinChars:false};c.autocomplete(e,f);d.replaceWith(c);var k=function(){var o=c.attr("value");var n=i[o];if(n!==null&&n!==undefined){c.attr("value",n)}else{if(m!==""){c.attr("value",m)}else{c.attr("value","?")}}};c.parents("form").submit(function(){k()});$(document).bind("convert_to_values",function(){k()});if(d.attr("refresh_on_change")=="true"){var h=d.attr("refresh_on_change_values"),l=d.attr("last_selected_value");if(h!==undefined){h=h.split(",")}var j=function(){var n=i[c.attr("value")];if(l!==n&&n!==null&&n!==undefined){if(h!==undefined&&$.inArray(n,h)===-1&&$.inArray(l,h)===-1){return}c.attr("value",n);$(window).trigger("refresh_on_change");c.parents("form").submit()}};c.bind("result",j);c.keyup(function(n){if(n.keyCode===13){j()}});c.keydown(function(n){if(n.keyCode===13){return false}})}})}function async_save_text(d,f,e,a,c,h,i,g,b){if(c===undefined){c=30}if(i===undefined){i=4}$("#"+d).live("click",function(){if($("#renaming-active").length>0){return}var l=$("#"+f),k=l.text(),j;if(h){j=$("<textarea></textarea>").attr({rows:i,cols:c}).text($.trim(k))}else{j=$("<input type='text'></input>").attr({value:$.trim(k),size:c})}j.attr("id","renaming-active");j.blur(function(){$(this).remove();l.show();if(b){b(j)}});j.keyup(function(n){if(n.keyCode===27){$(this).trigger("blur")}else{if(n.keyCode===13){var m={};m[a]=$(this).val();$(this).trigger("blur");$.ajax({url:e,data:m,error:function(){alert("Text editing for elt "+f+" failed")},success:function(o){if(o!==""){l.text(o)}else{l.html("<em>None</em>")}if(b){b(j)}}})}}});if(g){g(j)}l.hide();j.insertAfter(l);j.focus();j.select();return})}function init_history_items(d,a,c){var b=function(){try{var e=$.jStorage.get("history_expand_state");if(e){for(var g in e){$("#"+g+" div.historyItemBody").show()}}}catch(f){$.jStorage.deleteKey("history_expand_state")}if($.browser.mozilla){$("div.historyItemBody").each(function(){if(!$(this).is(":visible")){$(this).find("pre.peek").css("overflow","hidden")}})}d.each(function(){var j=this.id,h=$(this).children("div.historyItemBody"),i=h.find("pre.peek");$(this).find(".historyItemTitleBar > .historyItemTitle").wrap("<a href='javascript:void(0);'></a>").click(function(){var k;if(h.is(":visible")){if($.browser.mozilla){i.css("overflow","hidden")}h.slideUp("fast");if(!c){k=$.jStorage.get("history_expand_state");if(k){delete k[j];$.jStorage.set("history_expand_state",k)}}}else{h.slideDown("fast",function(){if($.browser.mozilla){i.css("overflow","auto")}});if(!c){k=$.jStorage.get("history_expand_state");if(!k){k={}}k[j]=true;$.jStorage.set("history_expand_state",k)}}return false})});$("#top-links > a.toggle").click(function(){var h=$.jStorage.get("history_expand_state");if(!h){h={}}$("div.historyItemBody:visible").each(function(){if($.browser.mozilla){$(this).find("pre.peek").css("overflow","hidden")}$(this).slideUp("fast");if(h){delete h[$(this).parent().attr("id")]}});$.jStorage.set("history_expand_state",h)}).show()};b()}function commatize(b){b+="";var a=/(\d+)(\d{3})/;while(a.test(b)){b=b.replace(a,"$1,$2")}return b}function reset_tool_search(a){var c=$("#galaxy_tools").contents();if(c.length===0){c=$(document)}$(this).removeClass("search_active");c.find(".toolTitle").removeClass("search_match");c.find(".toolSectionBody").hide();c.find(".toolTitle").show();c.find(".toolPanelLabel").show();c.find(".toolSectionWrapper").each(function(){if($(this).attr("id")!="recently_used_wrapper"){$(this).show()}else{if($(this).hasClass("user_pref_visible")){$(this).show()}}});c.find("#search-no-results").hide();c.find("#search-spinner").hide();if(a){var b=c.find("#tool-search-query");b.val("search tools");b.css("font-style","italic")}}var GalaxyAsync=function(a){this.url_dict={};this.log_action=(a===undefined?false:a)};GalaxyAsync.prototype.set_func_url=function(a,b){this.url_dict[a]=b};GalaxyAsync.prototype.set_user_pref=function(a,b){var c=this.url_dict[arguments.callee];if(c===undefined){return false}$.ajax({url:c,data:{pref_name:a,pref_value:b},error:function(){return false},success:function(){return true}})};GalaxyAsync.prototype.log_user_action=function(c,b,d){if(!this.log_action){return}var a=this.url_dict[arguments.callee];if(a===undefined){return false}$.ajax({url:a,data:{action:c,context:b,params:d},error:function(){return false},success:function(){return true}})};$(document).ready(function(){$("select[refresh_on_change='true']").change(function(){var a=$(this),e=a.val(),d=false,c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var b=a.attr("last_selected_value");if($.inArray(e,c)===-1&&$.inArray(b,c)===-1){return}}$(window).trigger("refresh_on_change");$(document).trigger("convert_to_values");a.get(0).form.submit()});$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus();replace_big_select_inputs(20,1500);$("a").click(function(){var b=$(this);var c=(parent.frames&&parent.frames.galaxy_main);if((b.attr("target")=="galaxy_main")&&(!c)){var a=b.attr("href");if(a.indexOf("?")==-1){a+="?"}else{a+="&"}a+="use_panels=True";b.attr("href",a);b.attr("target","_self")}return b})});
\ No newline at end of file
--- a/static/scripts/packed/jquery.jstore.js Fri Feb 18 14:53:35 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/*
- * jStore 2.0 - Persistent Client Side Storage
- *
- * Copyright (c) 2010 Eric Garside (http://eric.garside.name/)
- * Dual licensed under:
- * MIT: http://www.opensource.org/licenses/mit-license.php
- * GPLv3: http://www.opensource.org/licenses/gpl-3.0.html
- *
- * ---------------------------
- *
- * jStore Flash Storage Component
- *
- * Copyright (c) 2006 Jeff Lerman (jeff(a)blip.tv)
- * Licensed under the Creative Commons Attribution 3.0 United States License:
- * http://creativecommons.org/licenses/by/3.0/us
- */
-(function(i,n){var h="JSTORE_ENGINE_UNSTABLE",t="JSTORE_UNKNOWN_ENGINE_REQUESTED",r="JSTORE_ENGINE_NAMESPACE_COLLISION",j="JSTORE_RESOURCE_NAMESPACE_COLLISION",m="JSTORE_ENGINE_UNAVAILABLE",o="JSTORE_INVALID_FLAVOR",f=(function(){try{return new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}catch(I){return(/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/)}}()),b="jstore-html5-local",y="jstore-html5-sql",F="jstore-flash",G="jstore-google-gears",A="jstore-msie",u,E={},D={},C={},c=false,d={},q={project:undefined,flash:"jStore.Flash.html",json:"browser.json.js"},l;function z(I){switch(I){case b:case y:case F:case G:case A:return true;default:return false}}function g(I,J){return !I?false:I.constructor.toString().match(new RegExp(J+"\\(\\)","i"))!==null}function s(K,I,J){if(g(K,"Function")){return K.apply(I||E,g(J,"Array")?J:[J])}}function p(J,I){i.ajax({url:J,complete:I||i.noop(),type:"GET",dataType:"script",cache:false})}function x(I){if(I===undefined){return""}if(g(I,"Object")||g(I,"Array")||g(I,"Function")){return JSON.stringify(I)}return I}function k(I){return f.test(I)?JSON.parse(I):I}function w(I){return I.replace(/^\s+|\s+$/g,"")}function e(I,J,K){if(!z(I)){throw o}if(K[I]!==undefined){throw r}if(s(K)===true){E.available[I]=true;J.flavor=I;D[I]=u.extend(J)}else{E.available[I]=false;E.enginePriority=i.map(E.enginePriority,function(L){if(L===I){return null}else{return L}})}}function v(){if(E.isReady){return}if((c&&E.isFlashReady)||!c){E.isReady=true;E.trigger("jstore-ready",[C[l]])}}function a(){E.create(E.enginePriority[0],undefined,"best-fit")}function H(){try{var J=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");try{J.AllowScriptAccess="always"}catch(L){return"6,0,0"}return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(K){try{if(navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){return(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}}catch(I){}}return"0,0,0"}function B(I){var N=H().match(/\d+/g),L=I.match(/\d+/g),J=0,K,M;for(;J<3;J++){K=parseInt(N[J],10);M=parseInt(L[J],10);if(K<M){return false}else{if(K>M){return true}}}return true}i.extend(E,{enginePriority:[b,y,F,A],available:{},isReady:false,isFlashReady:false,flavors:{local:b,sql:y,flash:F,gears:G,msie:A},init:function(J,K,I){i.extend(q,{project:J},K);i(function(){if(n.JSON===undefined){p(q.json)}if(I!==undefined){E.create(I,J,"default")}else{a()}});return E},create:function(I,M,J){M=M||q.project||location.hostname.replace(/\./g,"-")||"unknown";if(!z(I)){throw o}if(D[I]===undefined){throw m}var L=(J!==undefined?J+".":"")+M+"."+I,K;if(C[L]!==undefined){throw j}K=C[L]=new D[I](M,L);K.ready(function(){E.trigger("jstore-engine-ready",[K])});if(I===F&&!E.isFlashReady){if(l===undefined){c=true}n.jstore_ready=function(){E.isFlashReady=true;E.trigger("flash-ready");if(l===undefined){v()}n.flash_ready=undefined};n.jstore_error=function(N){E.trigger("jstore-error",["JSTORE_FLASH_EXCEPTION",null,N])};i('<iframe style="height:1px;width:1px;position:absolute;left:0;top:0;margin-left:-100px;" id="jStoreFlashFrame" src="'+q.flash+'"></iframe>').appendTo("body")}else{if(l===undefined){l=L;v()}}return K},engine:function(I){return C[I]},activeEngine:function(I){if(I!==undefined){if(C[I]===undefined){throw t}else{l=I}}return C[l]},bind:function(J,K,I){I=I||"jstore";if(d[I]===undefined){d[I]={}}if(d[I][J]===undefined){d[I][J]=[K]}else{d[I][J].push(K)}return E},trigger:function(K,J,I){I=I||"jstore";if(d[I]!==undefined){if(d[I][K]!==undefined){i.each(d[I][K],function(){s(this,E,J)})}}return E},error:function(I){E.bind("jstore-error",I)},ready:function(I){if(E.isReady){s(I)}else{E.bind("jstore-ready",I)}return E},engineReady:function(I){if(E.isReady){s(I)}else{E.bind("jstore-engine-ready",I)}return E},store:function(I,J){return J===undefined?E.get(I):E.set(I,J)},remove:function(I){return E.activeEngine().remove(I)},get:function(I){return E.activeEngine().get(I)},set:function(I,J){return E.activeEngine().set(I,J)}});u=Class.extend({project:undefined,jri:undefined,flavor:undefined,database:undefined,data:undefined,limit:undefined,isReady:undefined,init:function(J,I){this.project=J;this.jri=I;this.data={};this.isReady=false;this.updateCache()},updateCache:function(){this.isReady=true;this.trigger("engine-ready",[this])},bind:function(I,J){E.bind(I,J,this.jri)},trigger:function(J,I){E.trigger(J,I,this.jri)},ready:function(I){if(this.isReady){s(I,this)}else{this.bind("engine-ready",I)}},get:function(I){this.__interruptAccess();return this.data[I]},set:function(I,J){this.__interruptAccess();I=w(I);try{this.__set(I,J)}catch(K){E.trigger("jstore-error",["JSTORE_STORAGE_FAILURE",this.jri,K])}this.data[I]=J;return J},remove:function(J){this.__interruptAccess();J=w(J);try{this.__remove(J)}catch(K){E.trigger("jstore-error",["JSTORE_REMOVE_FAILURE",this.jri,K])}var I=this.data[J];this.data[J]=undefined;return I},__interruptAccess:function(){if(!this.isReady){throw h}},__set:function(I,J){return},__remove:function(I){return}});i.extend(i.fn,{store:function(I,J){if(J===undefined){E.get(I)}else{E.set(I,J)}return this},removeStore:function(I){E.activeEngine().remove(I);return this},getStore:function(I){return E.activeEngine().get(I)},setStore:function(I,J){E.activeEngine().set(I,J);return this}});n.jStore=i.jStore=E;e(b,{limit:parseInt(500000,16),init:function(J,I){this.database=n.globalStorage===undefined?n.localStorage:n.globalStorage[location.hostname];this._super(J,I)},updateCache:function(){var J,K;for(J in this.database){var I=false;if(this.database.hasOwnProperty){if(this.database.hasOwnProperty(J)){I=true}}else{if(this.database.getItem(J)!==null){I=true}}if(I){K=this.database.getItem(J);this.data[J]=k(K&&K.value?K.value:K)}}this._super()},__set:function(I,J){this.database.setItem(I,x(J))},__remove:function(I){this.database.removeItem(I)}},function(){return n.localStorage!==undefined||n.globalStorage!==undefined});e(y,{limit:parseInt(32000,16),init:function(J,I){this.database=n.openDatabase("jstore-"+J,"1.0",J,this.limit);if(!this.database){throw"JSTORE_SQL_NO_DB"}this.database.transaction(function(K){K.executeSql("CREATE TABLE IF NOT EXISTS jstore (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)")});this._super(J,I)},updateCache:function(){var I=this,J=this._super;this.database.transaction(function(K){K.executeSql("SELECT k,v FROM jstore",[],function(O,L){var N=L.rows,M=0,P;for(;M<N.length;++M){P=N.item(M);I.data[P.k]=k(P.v)}J.apply(I)})})},__set:function(I,J){this.database.transaction(function(K){K.executeSql("INSERT OR REPLACE INTO jstore(k, v) VALUES (?, ?)",[I,x(J)])})},__remove:function(I){this.database.transaction(function(J){J.executeSql("DELETE FROM jstore WHERE k = ?",[I])})}},function(){return n.openDatabase!==undefined});e(F,{limit:-1,init:function(K,J){var I=this;E.bind("flash-ready",function(){I.__flashReadyListener()});this._super(K,J)},updateCache:function(I){if(I===true){var J,K=this.database.jstore_get_all();for(J in K){if(K.hasOwnProperty(J)){this.data[J]=k(this.database.jstore_get(J))}}this._super()}},__set:function(I,J){if(!this.database.jstore_set(I,x(J))){E.trigger("jstore-error",["JSTORE_STORAGE_FAILURE",this.jri,"Flash Exception"])}},__remove:function(I){this.database.jstore_remove(I)},__flashReadyListener:function(){var I=i("#jStoreFlashFrame")[0],J;if(I.Document!==undefined&&g(I.Document.jStoreFlash.jstore_get,"Function")){this.database=I.Document.jStoreFlash}else{if(I.contentWindow&&I.contentWindow.document){J=i(I.contentWindow.document);if(g(i("object",J)[0].jstore_get,"Function")){this.database=i("object",J)[0]}else{if(g(i("embed",J)[0].jstore_get,"Function")){this.database=i("embed",J)[0]}}}}if(this.database===undefined){throw"JSTORE_FLASH_REFERENCE_ISSUE"}else{this.updateCache(true)}}},function(){return B("9.0.0")});e(G,{limit:-1,init:function(J,I){this.database=google.gears.factory.create("beta.database");this.database.open("jstore-"+J);this.database.execute("CREATE TABLE IF NOT EXISTS jstore (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)");this._super(J,I)},updateCache:function(){var I=this.database.execute("SELECT k,v FROM jstore");while(I.isValidRow()){this.data[I.field(0)]=k(I.field(1));I.next()}I.close();this._super()},__set:function(I,J){this.database.execute("BEGIN");this.database.execute("INSERT OR REPLACE INTO jstore(k, v) VALUES (?, ?)",[I,x(J)]);this.database.execute("COMMIT")},__remove:function(I){this.database.execute("BEGIN");this.database.execute("DELETE FROM jstore WHERE k = ?",[I]);this.database.execute("COMMIT")}},function(){return n.google!==undefined&&n.google.gears!==undefined});e(A,{limit:parseInt(10000,16),init:function(J,I){this.database=i('<div style="display:none;behavior:url(\'#default#userData\')" id="jstore-'+J+'"></div>').appendTo(document.body).get(0);this._super(J,I)},updateCache:function(){this.database.load(this.project);var K=document.getElementById("jstore-"+this.project),L=K.XMLDocument,I,J=0;if(L&&L.documentElement&&L.documentElement.attributes){I=L.documentElement;for(;J<I.attributes.length;++J){this.data[I.attributes.item(J).nodeName]=k(I.attributes.item(J).nodeValue)}}this._super()},__set:function(I,J){this.database.setAttribute(I,x(J));this.database.save(this.project)},__remove:function(I){this.database.removeAttribute(I);this.database.save(this.project)}},function(){return n.ActiveXObject!==undefined})}(jQuery,window));
\ No newline at end of file
--- a/templates/display_base.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/display_base.mako Fri Feb 18 15:06:34 2011 -0500
@@ -32,7 +32,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js( "jquery", "jquery.tipsy", "galaxy.base", "json2", "class", "jquery.jstore", "jquery.autocomplete", "jquery.rating", "autocomplete_tagging", "trackster" )}
+ ${h.js( "jquery", "jquery.tipsy", "galaxy.base", "json2", "jstorage", "jquery.autocomplete", "jquery.rating", "autocomplete_tagging", "trackster" )}
<script type="text/javascript">
--- a/templates/history/view.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/history/view.mako Fri Feb 18 15:06:34 2011 -0500
@@ -5,7 +5,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js( "galaxy.base", "jquery", "json2", "class", "jquery.jstore" )}
+ ${h.js( "galaxy.base", "jquery", "json2", "jstorage" )}
<script type="text/javascript">
$(function() {
init_history_items( $("div.historyItemWrapper"), false, "nochanges" );
--- a/templates/library/common/browse_library.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/library/common/browse_library.mako Fri Feb 18 15:06:34 2011 -0500
@@ -48,7 +48,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js("class", "jquery.jstore")}
+ ${h.js("json2", "jstorage")}
${common_javascripts()}
${self.grid_javascripts()}
</%def>
@@ -56,11 +56,10 @@
<%def name="grid_javascripts()"><script type="text/javascript">
$(function() {
- $.jStore.init("galaxy"); // Auto-select best storage
var storage_id = "library-expand-state-${trans.security.encode_id(library.id)}";
var restore_folder_state = function() {
- var state = $.jStore.store(storage_id);
+ var state = $.jStorage.get(storage_id);
if (state) {
for (var id in state) {
if (state[id] === true) {
@@ -79,7 +78,7 @@
var folder = $(this);
state[folder.attr("id")] = folder.hasClass("expanded");
});
- $.jStore.store(storage_id, state);
+ $.jStorage.set(storage_id, state);
};
$("#library-grid").each(function() {
@@ -131,10 +130,10 @@
// Initialize dict[parent_id] = rows_which_have_that_parent_id_as_parent_attr
var par_child_dict = {},
no_parent = [];
-
+
$(this).find("tbody tr").each( function() {
- if (this.hasAttribute("parent")) {
- var parent = this.getAttribute("parent");
+ if ( $(this).attr("parent")) {
+ var parent = $(this).attr("parent");
if (par_child_dict[parent] !== undefined) {
par_child_dict[parent].push(this);
} else {
@@ -151,9 +150,7 @@
});
});
- $.jStore.engineReady(function() {
- restore_folder_state();
- });
+ restore_folder_state();
});
// Looks for changes in dataset state using an async request. Keeps
--- a/templates/library/common/library_dataset_search_results.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/library/common/library_dataset_search_results.mako Fri Feb 18 15:06:34 2011 -0500
@@ -46,7 +46,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js("class", "jquery.jstore")}
+ ${h.js("jstorage")}
${common_javascripts()}
</%def>
--- a/templates/page/editor.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/page/editor.mako Fri Feb 18 15:06:34 2011 -0500
@@ -21,7 +21,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js( "jquery.event.drag", "jquery.event.drop", "jquery.event.hover", "jquery.form", "class", "jquery.jstore", "json2",
+ ${h.js( "jquery.event.drag", "jquery.event.drop", "jquery.event.hover", "jquery.form", "json2", "jstorage"
"galaxy.base", "jquery.wymeditor", "jquery.autocomplete", "autocomplete_tagging")}
<script type="text/javascript">
--- a/templates/root/history.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/root/history.mako Fri Feb 18 15:06:34 2011 -0500
@@ -15,7 +15,7 @@
<meta http-equiv="Pragma" content="no-cache">
${h.css( "base", "history", "autocomplete_tagging" )}
-${h.js( "jquery", "jquery.tipsy", "galaxy.base", "json2", "class", "jquery.jstore", "jquery.autocomplete", "autocomplete_tagging" )}
+${h.js( "jquery", "jquery.tipsy", "galaxy.base", "json2", "jstorage", "jquery.autocomplete", "autocomplete_tagging" )}
<script type="text/javascript">
--- a/templates/workflow/editor.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/workflow/editor.mako Fri Feb 18 15:06:34 2011 -0500
@@ -31,9 +31,8 @@
"jquery.event.drop",
"jquery.event.hover",
"jquery.form",
- "class",
"json2",
- "jquery.jstore",
+ "jstorage",
"galaxy.base",
"galaxy.workflow_editor.canvas",
"jquery.autocomplete",
@@ -177,9 +176,6 @@
});
%endif
- // Load jStore for local storage
- $.jStore.init("galaxy"); // Auto-select best storage
-
// Canvas overview management
canvas_manager = new CanvasManager( $("#canvas-viewport"), $("#overview") );
@@ -309,23 +305,21 @@
}
- $.jStore.ready(function() {
- // On load, set the size to the pref stored in local storage if it exists
- overview_size = $.jStore.store("overview-size");
- if (overview_size !== undefined) {
- $("#overview-border").css( {
- width: overview_size,
- height: overview_size
- });
- }
-
- // Show viewport on load unless pref says it's off
- if ($.jStore.store("overview-off")) {
- hide_overview();
- } else {
- show_overview();
- }
- });
+ // On load, set the size to the pref stored in local storage if it exists
+ overview_size = $.jStorage.get("overview-size");
+ if (overview_size !== undefined) {
+ $("#overview-border").css( {
+ width: overview_size,
+ height: overview_size
+ });
+ }
+
+ // Show viewport on load unless pref says it's off
+ if ($.jStorage.get("overview-off")) {
+ hide_overview();
+ } else {
+ show_overview();
+ }
// Stores the size of the overview into local storage when it's resized
$("#overview-border").bind( "dragend", function( e, d ) {
@@ -333,17 +327,17 @@
var opo = op.offset();
var new_size = Math.max( op.width() - ( d.offsetX - opo.left ),
op.height() - ( d.offsetY - opo.top ) );
- $.jStore.store("overview-size", new_size + "px");
+ $.jStorage.set("overview-size", new_size + "px");
});
function show_overview() {
- $.jStore.remove("overview-off");
+ $.jStorage.set("overview-off", false);
$("#overview-border").css("right", "0px");
$("#close-viewport").css("background-position", "0px 0px");
}
function hide_overview() {
- $.jStore.store("overview-off", true);
+ $.jStorage.set("overview-off", true);
$("#overview-border").css("right", "20000px");
$("#close-viewport").css("background-position", "12px 0px");
}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Another fix for rendering the contents of a data library - the form to acti on multiple datasets should now be rendered correclty.
by Bitbucket 18 Feb '11
by Bitbucket 18 Feb '11
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/5f5dae7e7ccc/
changeset: r5092:5f5dae7e7ccc
user: greg
date: 2011-02-18 20:53:35
summary: Another fix for rendering the contents of a data library - the form to acti on multiple datasets should now be rendered correclty.
affected #: 1 file (378 bytes)
--- a/templates/library/common/browse_library.mako Fri Feb 18 14:46:16 2011 -0500
+++ b/templates/library/common/browse_library.mako Fri Feb 18 14:53:35 2011 -0500
@@ -349,10 +349,6 @@
form_type = trans.model.FormDefinition.types.LIBRARY_INFO_TEMPLATE
info_association, inherited = folder.get_info_association( restrict=True )
-
- if not self.has_accessible_datasets:
- # If we already know the library contains accessible datasets, no need to check again (and we may set it to False if we do).
- self.has_accessible_datasets = trans.app.security_agent.has_accessible_library_datasets( trans, folder, trans.user, current_user_roles, search_downward=False )
%>
%if not root_folder and ( not folder.deleted or show_deleted ):
<% encoded_id = trans.security.encode_id(folder.id) %>
@@ -489,7 +485,7 @@
info_association, inherited = library.get_info_association()
form_type = trans.model.FormDefinition.types.LIBRARY_INFO_TEMPLATE
- self.has_accessible_datasets = trans.app.security_agent.has_accessible_library_datasets( trans, library.root_folder, trans.user, current_user_roles, search_downward=False )
+ self.has_accessible_datasets = trans.app.security_agent.has_accessible_library_datasets( trans, library.root_folder, trans.user, current_user_roles )
has_accessible_folders = is_admin or trans.app.security_agent.has_accessible_folders( trans, library.root_folder, trans.user, current_user_roles )
tracked_datasets = {}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: rc: renamed 'samples' to 'sample_widgets' in __save_samples
by Bitbucket 18 Feb '11
by Bitbucket 18 Feb '11
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/6cf34552c6f5/
changeset: r5091:6cf34552c6f5
user: rc
date: 2011-02-18 20:46:16
summary: renamed 'samples' to 'sample_widgets' in __save_samples
affected #: 1 file (63 bytes)
--- a/lib/galaxy/web/controllers/requests_common.py Fri Feb 18 14:34:14 2011 -0500
+++ b/lib/galaxy/web/controllers/requests_common.py Fri Feb 18 14:46:16 2011 -0500
@@ -1093,7 +1093,7 @@
request_widgets=request_widgets,
displayable_sample_widgets=displayable_sample_widgets,
sample_copy_select_field=sample_copy_select_field )
- def __save_samples( self, trans, cntrller, request, samples, saving_new_samples=False, **kwd ):
+ def __save_samples( self, trans, cntrller, request, sample_widgets, saving_new_samples=False, **kwd ):
# Here we handle saving all new samples added by the user as well as saving
# changes to any subset of the request's samples. A sample will not have an
# associated SampleState until the request is submitted, at which time the
@@ -1109,7 +1109,7 @@
else:
redirect_action = 'edit_samples'
# Check for duplicate sample names within the request
- self.__validate_sample_names( trans, cntrller, request, samples, **kwd )
+ self.__validate_sample_names( trans, cntrller, request, sample_widgets, **kwd )
if not saving_new_samples:
library = None
folder = None
@@ -1138,8 +1138,8 @@
# TODO: make changes necessary to just send the samples...
encoded_selected_sample_ids = self.__get_encoded_selected_sample_ids( trans, request, **kwd )
# Make sure all samples have a unique bar_code if the state is changing
- for sample_index in range( len( samples ) ):
- current_sample = samples[ sample_index ]
+ for sample_index in range( len( sample_widgets ) ):
+ current_sample = sample_widgets[ sample_index ]
if current_sample is None:
# We have a None value because the user did not select this sample
# on which to perform the action.
@@ -1163,15 +1163,15 @@
library_id = params.get( 'sample_operation_library_id', 'none' )
folder_id = params.get( 'sample_operation_folder_id', 'none' )
library, folder = self.__get_library_and_folder( trans, library_id, folder_id )
- for sample_index in range( len( samples ) ):
- current_sample = samples[ sample_index ]
+ for sample_index in range( len( sample_widgets ) ):
+ current_sample = sample_widgets[ sample_index ]
if current_sample is None:
# We have a None value because the user did not select this sample
# on which to perform the action.
continue
current_sample[ 'library' ] = library
current_sample[ 'folder' ] = folder
- self.__update_samples( trans, cntrller, request, samples, **kwd )
+ self.__update_samples( trans, cntrller, request, sample_widgets, **kwd )
message = 'Changes made to the samples have been saved. '
else:
# Saving a newly created sample. The sample will not have an associated SampleState
@@ -1179,9 +1179,9 @@
# set to the first SampleState configured for the request's RequestType configured
# by the admin ( i.e., the sample's SampleState would be set to request.type.states[0] ).
new_samples = []
- for index in range( len( samples ) - len( request.samples ) ):
+ for index in range( len( sample_widgets ) - len( request.samples ) ):
sample_index = len( request.samples )
- sample_widget = samples[ sample_index ]
+ sample_widget = sample_widgets[ sample_index ]
form_values = trans.model.FormValues( request.type.sample_form, sample_widget[ 'field_values' ] )
trans.sa_session.add( form_values )
trans.sa_session.flush()
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Remove the new/ subdirectory from the eggs repository and update the pysam egg.
by Bitbucket 18 Feb '11
by Bitbucket 18 Feb '11
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/41b368b104ff/
changeset: r5090:41b368b104ff
user: natefoo
date: 2011-02-18 20:34:14
summary: Remove the new/ subdirectory from the eggs repository and update the pysam egg.
affected #: 2 files (5 bytes)
--- a/dist-eggs.ini Fri Feb 18 13:22:31 2011 -0500
+++ b/dist-eggs.ini Fri Feb 18 14:34:14 2011 -0500
@@ -22,7 +22,7 @@
py2.4-macosx-10.3-fat-ucs2 = lonnie.bx.psu.edu /usr/local/bin/python2.4
py2.5-macosx-10.3-fat-ucs2 = lonnie.bx.psu.edu /usr/local/bin/python2.5
py2.6-macosx-10.3-fat-ucs2 = lonnie.bx.psu.edu /usr/local/bin/python2.6
-py2.6-macosx-10.6-universal-ucs2 = bach.bx.psu.edu /usr/bin/python2.6
+py2.6-macosx-10.6-universal-ucs2 = fanty.bx.psu.edu /usr/bin/python2.6
py2.4-solaris-2.10-i86pc_32-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc_32-ucs2/bin/python2.4
py2.5-solaris-2.10-i86pc_32-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc_32-ucs2/bin/python2.5
py2.6-solaris-2.10-i86pc_32-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc_32-ucs2/bin/python2.6
--- a/eggs.ini Fri Feb 18 13:22:31 2011 -0500
+++ b/eggs.ini Fri Feb 18 14:34:14 2011 -0500
@@ -7,7 +7,7 @@
;
[general]
-repository = http://eggs.g2.bx.psu.edu/new
+repository = http://eggs.g2.bx.psu.edu
; these eggs must be scrambled for your local environment
no_auto = pbs_python DRMAA_python
@@ -69,7 +69,7 @@
bx_python = _14b6a6c95da6
GeneTrack = _dev_48da9e998f0caf01c5be731e926f4b0481f658f0
SQLAlchemy = _dev_r6498
-pysam = _kanwei_a92c29d5cdec
+pysam = _kanwei_ae2bd50d9945
; dependency source urls, necessary for scrambling. for an explanation, see
; the wiki page above
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Don't copy ez_setup.py to egg build directories anymore, and provide a more useful error message when an egg is missing a dependency with a version conflict.
by Bitbucket 18 Feb '11
by Bitbucket 18 Feb '11
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/c8f8f80902d1/
changeset: r5089:c8f8f80902d1
user: natefoo
date: 2011-02-18 19:22:31
summary: Don't copy ez_setup.py to egg build directories anymore, and provide a more useful error message when an egg is missing a dependency with a version conflict.
affected #: 2 files (427 bytes)
--- a/lib/galaxy/eggs/__init__.py Fri Feb 18 12:07:27 2011 -0500
+++ b/lib/galaxy/eggs/__init__.py Fri Feb 18 13:22:31 2011 -0500
@@ -187,6 +187,10 @@
else:
raise EggNotFetchable( self )
except pkg_resources.VersionConflict, e:
+ if e.args[1].key != e.args[0].key:
+ log.error( "One of Galaxy's managed eggs depends on something which is missing, this is almost certainly a bug in the egg distribution." )
+ log.error( 'Dependency "%s" requires "%s"' % ( e.args[0].project_name, str( e.args[1] ) ) )
+ raise
# there's a conflicting egg on the path, remove it
return self.version_conflict( e.args[0], e.args[1] )
def version_conflict( self, conflict_dist, conflict_req ):
--- a/lib/galaxy/eggs/scramble.py Fri Feb 18 12:07:27 2011 -0500
+++ b/lib/galaxy/eggs/scramble.py Fri Feb 18 13:22:31 2011 -0500
@@ -54,7 +54,6 @@
self.copy_build_script()
if not os.path.exists( ScrambleEgg.ez_setup ):
URLRetriever().retrieve( ScrambleEgg.ez_setup_url, ScrambleEgg.ez_setup )
- shutil.copyfile( ScrambleEgg.ez_setup, os.path.join( self.buildpath, 'ez_setup.py' ) )
self.run_scramble_script()
new_egg = os.path.join( self.buildpath, 'dist', os.path.basename( self.distribution.location ) )
if not os.path.exists( new_egg ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Do not print summary information in FASTQ groomer when grooming an empty file.
by Bitbucket 18 Feb '11
by Bitbucket 18 Feb '11
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/2af990906c8f/
changeset: r5088:2af990906c8f
user: dan
date: 2011-02-18 18:07:27
summary: Do not print summary information in FASTQ groomer when grooming an empty file.
affected #: 2 files (168 bytes)
--- a/lib/galaxy_utils/sequence/fastq.py Fri Feb 18 12:04:26 2011 -0500
+++ b/lib/galaxy_utils/sequence/fastq.py Fri Feb 18 12:07:27 2011 -0500
@@ -314,8 +314,12 @@
rval.append( fastq_format )
return rval
def get_ascii_range( self ):
+ if not self.ascii_values_used:
+ return None
return ( min( self.ascii_values_used ), max( self.ascii_values_used ) )
def get_decimal_range( self ):
+ if not self.nuc_index_quality:
+ return None
decimal_values_used = []
for scores in self.nuc_index_quality:
decimal_values_used.extend( scores.keys() )
--- a/tools/fastq/fastq_groomer.py Fri Feb 18 12:04:26 2011 -0500
+++ b/tools/fastq/fastq_groomer.py Fri Feb 18 12:07:27 2011 -0500
@@ -23,15 +23,16 @@
if read_count is not None:
print "Groomed %i %s reads into %s reads." % ( read_count + 1, input_type, output_type )
+ if input_type != output_type and 'solexa' in [ input_type, output_type ]:
+ print "Converted between Solexa and PHRED scores."
+ if summarize_input:
+ print "Based upon quality and sequence, the input data is valid for: %s" % ( ", ".join( aggregator.get_valid_formats() ) or "None" )
+ ascii_range = aggregator.get_ascii_range()
+ decimal_range = aggregator.get_decimal_range()
+ print "Input ASCII range: %s(%i) - %s(%i)" % ( repr( ascii_range[0] ), ord( ascii_range[0] ), repr( ascii_range[1] ), ord( ascii_range[1] ) ) #print using repr, since \x00 (null) causes info truncation in galaxy when printed
+ print "Input decimal range: %i - %i" % ( decimal_range[0], decimal_range[1] )
else:
print "No valid FASTQ reads were provided."
- if input_type != output_type and 'solexa' in [ input_type, output_type ]:
- print "Converted between Solexa and PHRED scores."
- if summarize_input:
- print "Based upon quality and sequence, the input data is valid for: %s" % ( ", ".join( aggregator.get_valid_formats() ) or "None" )
- ascii_range = aggregator.get_ascii_range()
- decimal_range = aggregator.get_decimal_range()
- print "Input ASCII range: %s(%i) - %s(%i)" % ( repr( ascii_range[0] ), ord( ascii_range[0] ), repr( ascii_range[1] ), ord( ascii_range[1] ) ) #print using repr, since \x00 (null) causes info truncation in galaxy when printed
- print "Input decimal range: %i - %i" % ( decimal_range[0], decimal_range[1] )
-if __name__ == "__main__": main()
\ No newline at end of file
+
+if __name__ == "__main__": main()
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix for changing the selected data library and folder for a checked list of samples ( a subset of the entire list of the request's samples ).
by Bitbucket 18 Feb '11
by Bitbucket 18 Feb '11
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/c0f7d67ece33/
changeset: r5087:c0f7d67ece33
user: greg
date: 2011-02-18 18:04:26
summary: Fix for changing the selected data library and folder for a checked list of samples ( a subset of the entire list of the request's samples ).
affected #: 1 file (1.0 KB)
--- a/lib/galaxy/web/controllers/requests_common.py Fri Feb 18 11:18:52 2011 -0500
+++ b/lib/galaxy/web/controllers/requests_common.py Fri Feb 18 12:04:26 2011 -0500
@@ -463,8 +463,18 @@
samples.append( sample )
else:
samples.append( None )
- # The __save_samples method requires sample_widgets, not sample objects
- sample_widgets = self.__get_sample_widgets( trans, request, samples, **kwd )
+ # The __save_samples method requires sample_widgets, not sample objects, so we'll get what we
+ # need by calling __get_sample_widgets(). However, we need to take care here because __get_sample_widgets()
+ # is used to populate the sample widget dicts from kwd, and the method assumes that a None object in the
+ # received list of samples should be populated from the db. Since we're just re-using the method here to
+ # change our list of samples into a list of sample widgets, we'll need to make sure to keep track of our
+ # None objects.
+ sample_widgets = [ obj for obj in samples ]
+ sample_widgets = self.__get_sample_widgets( trans, request, sample_widgets, **kwd )
+ # Replace each sample widget dict with a None object if necessary
+ for index, obj in enumerate( samples ):
+ if obj is None:
+ sample_widgets[ index ] = None
else:
sample_widgets = displayable_sample_widgets
return self.__save_samples( trans, cntrller, request, sample_widgets, saving_new_samples=False, **kwd )
@@ -1155,6 +1165,10 @@
library, folder = self.__get_library_and_folder( trans, library_id, folder_id )
for sample_index in range( len( samples ) ):
current_sample = samples[ sample_index ]
+ if current_sample is None:
+ # We have a None value because the user did not select this sample
+ # on which to perform the action.
+ continue
current_sample[ 'library' ] = library
current_sample[ 'folder' ] = folder
self.__update_samples( trans, cntrller, request, samples, **kwd )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0