2
0
Nicolas Petton 13 лет назад
Сommit
dc8e021881

+ 233 - 0
css/jtalk.css

@@ -0,0 +1,233 @@
+body.jtalkBody {
+    margin-bottom: 320px;
+}
+
+#jtalkTabs {
+    position: fixed;
+    font-family: helvetica,arial,sans;
+    font-size: 12px;
+    background: white;
+    z-index: 1;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    margin: 0;
+    padding: 0 0 3px 0;
+    height: 19px;
+    background: white;
+}
+#jtalkTabs li {
+    list-style-type: none;
+    display: inline;
+    background: #c8c8c8;
+    font-weight: bold;
+    color: #414141;
+    padding: 4px;
+    border: 1px solid #acacac;
+    cursor: pointer;
+    line-height: 14px;
+}
+
+#jtalkTabs li.selected {
+    background: #dbdbdb;
+    border-top: 0 none;
+    padding: 5px 4px;
+    color: #222;
+}
+
+#jtalkTabs li span.close {
+    margin-left: 10px;
+}
+
+#jtalkTabs li.closeAll {
+    -moz-border-radius: 10px;
+    -webkit-border-radius: 10px;
+    border-radius: 10px;
+    background: #ef3b3b;
+    color: #e3e3e3;
+    font-weight: bold;
+    border: 1px solid #ac1616;
+    margin: 4px;
+    padding: 2px 6px;
+    font-size: 10px;
+}
+
+#jtalkTabs li.closeAll:hover {		
+    background: #e72a2a;
+}
+
+#jtalk {
+       position: fixed;
+       bottom: 27px;
+       left: 0;
+       right: 0;
+       height: 300px;
+}
+
+#jtalk .ui-resizable-handle {
+    background-color: #a8a8a8;
+    top: 0;
+    cursor: row-resize;
+    height: 4px;
+    left: 0;
+    position: absolute;
+    right: 0;
+    width: auto !important;
+}
+
+.jtalkTool {
+    width: 98%;
+    background: #dbdbdb;
+    border-style: solid;
+    border-width: 2px 0 1px 0;
+    border-color: #a8a8a8;
+    color: @dark;
+    font-family: Arial, Helvetica, sans;
+    font-size: 12px;
+    line-height: 1.5em;
+    padding: 15px 1%;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    top: 4px;
+}
+
+.jtalkTool .jt_box {
+    width: 98%;
+    margin: 0;
+    position: absolute;
+    top: 15px;
+    bottom: 45px;
+}
+
+.jtalkTool .jt_buttons {
+    position: absolute;
+    bottom: 15px;    
+}
+
+    
+.jtalkTool .jt_buttons button {
+    font-size: 12px;
+}
+
+.jtalkTool textarea {
+    border: 1px solid;
+    border-color: #a8a8a8;
+    font-family: Arial, Helvetica, sans;
+    line-height: 1.2em;
+    font-size: 13px;
+    position: relative;
+    padding: 3px;
+}
+
+.jtalkTool .jt_clear {	 
+    clear: both;
+}
+
+.jtalkTool .jt_transcript,
+.jtalkTool .jt_workspace {
+    width: 100%;
+    height: 100%;
+}
+
+.jtalkTool ul.jt_column {
+    width: 24%;
+    padding: 0;
+    margin: 0;
+    float: left;
+    border: 1px solid;
+    border-color: #a8a8a8;
+    height: 130px;
+    overflow-y: scroll;
+    background: white;
+    position: absolute;
+    top: 0;
+}
+
+.jtalkTool ul.jt_column.categories {
+    left: 0%
+}
+
+.jtalkTool ul.jt_column.classes {
+    height: 105px;
+    left: 25.2%
+}
+
+.jtalkTool ul.jt_column.protocols {
+    left: 50.4%
+}
+
+.jtalkTool ul.jt_column.methods {
+    left: 75.6%
+}
+
+.jtalkTool ul.jt_column li {
+    list-style-type: none;
+    padding-left: 5px;
+    cursor: pointer;
+}
+
+.jtalkTool ul.jt_column li.selected {
+	background: #e3e3e3;
+	color: #222;
+}
+
+.jtalkTool ul.jt_column li:hover {
+    background: #08c;
+    color: white;
+}
+
+.jtalkTool .jt_tabs {
+    top: 106px;
+    position: absolute;
+    left: 25.2%;
+    padding: 0;
+    margin: 0;
+}
+
+.jtalkTool .jt_tabs li {
+    color: #8c8c8c;
+    cursor: pointer;
+    list-style-type: none;
+    float: left;
+    padding: 2px 4px;
+    margin-right: 2px;
+    background: #ccc;
+    border: 1px solid #a8a8a8;
+    -moz-border-radius-bottomleft: 8px;
+    -moz-border-radius-bottomright: 8px;
+    -webkit-border-bottom-left-radius: 8px;
+    -webkit-border-bottom-right-radius: 8px;
+    border-bottom-left-radius: 8px;
+    border-bottom-right-radius: 8px;
+    height: 20px;
+    line-height: 18px;
+}
+
+.jtalkTool .jt_tabs li:hover {
+    background: #08c;
+    color: white;
+    border-color: #08c;
+}
+
+.jtalkTool .jt_tabs li.selected,
+.jtalkTool .jt_tabs li.selected:hover {
+    background: white;
+    border: 1px solid #b3b3b3;
+    border-top: 1px solid white;
+    color: #222;
+}
+
+
+.jtalkTool .jt_sourceCode {
+    position: absolute;
+    top: 145px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+.jtalkTool .jt_sourceCode textarea.source {
+    width: 100%;
+    height: 100%;
+}

+ 144 - 0
js/boot.js

@@ -0,0 +1,144 @@
+function Smalltalk(){};
+function SmalltalkObject(){};
+function SmalltalkBehavior(){};
+function SmalltalkClass(){};
+function SmalltalkMetaclass(){
+    this.meta = true;
+};
+function SmalltalkMethod(){};
+function SmalltalkNil(){};
+
+var nil = new SmalltalkNil();
+var smalltalk = new Smalltalk();
+
+smalltalk.klass = function(spec) {
+    var spec = spec || {};
+    var that;
+    if(spec.meta) {
+	that = new SmalltalkMetaclass();
+    } else {
+	that = new (smalltalk.klass({meta: true})).fn;
+	that.klass.instanceClass = that;
+	that.className = spec.className;
+	that.klass.className = that.className + ' class';
+    }
+	
+    that.fn = spec.fn || function(){};
+    that.superclass = spec.superclass;
+    that.iVarNames = spec.iVarNames || [];
+    if(that.superclass) {
+	that.klass.superclass = that.superclass.klass;
+    }
+    that.category = spec.category || "";
+    that.fn.prototype.methods = {};
+    that.fn.prototype.klass = that;
+
+    return that;
+};
+
+smalltalk.method = function(spec) {
+    var that = new SmalltalkMethod();
+    that.selector = spec.selector;
+    that.category = spec.category;
+    that.source   = spec.source;
+    that.fn       = spec.fn;
+    return that
+};
+
+smalltalk.init = function(klass) {
+    var subclasses = smalltalk.subclasses(klass);
+    for(var i=0;i<klass.iVarNames.length;i++) {
+	klass.fn.prototype["@"+klass.iVarNames[i]] = nil;
+    }
+    if(klass.superclass && klass.superclass !== nil) {
+	klass.fn.prototype.__proto__ = klass.superclass.fn.prototype;
+	for(var i=0;i<klass.superclass.iVarNames.length;i++) {
+	    if(!klass["@"+klass.superclass.iVarNames[i]]) {
+		klass.fn.prototype["@"+klass.superclass.iVarNames[i]] = nil;
+	    }
+	}
+    }
+    for(var i=0;i<subclasses.length;i++) {
+     	smalltalk.init(subclasses[i]);
+    }
+    if(klass.klass && !klass.meta) {
+	smalltalk.init(klass.klass);
+    }
+};
+
+smalltalk.classes = function() {
+    var classes = [];
+    for(var i in smalltalk) {
+	if(i.search(/^[A-Z]/g) != -1) {
+	    classes.push(smalltalk[i]);
+	}
+
+    }
+    return classes
+};
+
+smalltalk.subclasses = function(klass) {
+    var subclasses = [];
+    var classes = smalltalk.classes();
+    for(var i in classes) {
+	if(classes[i].fn) {
+	    //Metaclasses
+	    if(classes[i].klass && classes[i].klass.superclass === klass) {
+		subclasses.push(classes[i].klass);
+	    }
+	    //Classes
+	    if(classes[i].superclass === klass) {
+		subclasses.push(classes[i]);
+	    }
+	}
+    }
+    return subclasses;
+};
+
+smalltalk.mapClassName = function(className, category, fn, superclass) {
+    smalltalk[className] = smalltalk.klass({
+		className:  className, 
+		category:   category, 
+		superclass: superclass,
+		fn:         fn
+	});
+};
+
+smalltalk.addClass = function(className, superclass, iVarNames, category) {
+    if(smalltalk[className]) {
+	smalltalk[className].superclass = superclass;
+	smalltalk[className].iVarNames = iVarNames;
+    } else {
+	smalltalk[className] = smalltalk.klass({
+		className: className, 
+		iVarNames: iVarNames,
+		superclass: superclass
+	    });
+    }
+    smalltalk[className].category = category || '';
+};
+
+smalltalk.addMethod = function(jsSelector, method, klass) {
+    klass.fn.prototype[jsSelector] = method.fn;
+    klass.fn.prototype.methods[method.selector] = method;
+};
+
+smalltalk.mapClassName("Object", "Kernel", SmalltalkObject);
+smalltalk.mapClassName("Smalltalk", "Kernel", Smalltalk, smalltalk.Object);
+smalltalk.mapClassName("Behavior", "Kernel", SmalltalkBehavior, smalltalk.Object);
+smalltalk.mapClassName("Class", "Kernel", SmalltalkClass, smalltalk.Behavior);
+smalltalk.mapClassName("Metaclass", "Kernel", SmalltalkMetaclass, smalltalk.Behavior);
+smalltalk.mapClassName("CompiledMethod", "Kernel", SmalltalkMethod, smalltalk.Object);
+
+smalltalk.Object.klass.superclass = smalltalk.Class
+
+smalltalk.mapClassName("Number", "Kernel", Number, smalltalk.Object);
+smalltalk.mapClassName("BlockClosure", "Kernel", Function, smalltalk.Object);
+smalltalk.mapClassName("Boolean", "Kernel", Boolean, smalltalk.Object);
+smalltalk.mapClassName("UndefinedObject", "Kernel", SmalltalkNil, smalltalk.Object);
+
+smalltalk.mapClassName("Collection", "Kernel", null, smalltalk.Object);
+smalltalk.mapClassName("String", "Kernel", String, smalltalk.Collection);
+smalltalk.mapClassName("RegularExpression", "Kernel", RegExp, smalltalk.String);
+smalltalk.mapClassName("Array", "Kernel", Array, smalltalk.Collection);
+

+ 898 - 0
js/canvas.js

@@ -0,0 +1,898 @@
+smalltalk.addClass('HTMLCanvas', smalltalk.Object, ['root'], 'Canvas');
+smalltalk.addMethod(
+'_root_',
+smalltalk.method({
+selector: 'root:',
+category: 'accessing',
+fn: function (aTagBrush){
+var self=this;
+self['@root']=aTagBrush;
+return self;},
+source: unescape('root%3A%20aTagBrush%0A%20%20%20%20root%20%3A%3D%20aTagBrush%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_root',
+smalltalk.method({
+selector: 'root',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@root'];
+return self;},
+source: unescape('root%0A%20%20%20%20%5Eroot%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
+self['@root']=smalltalk.TagBrush._fromString_canvas_("div",self);
+return self;},
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20root%20%3A%3D%20TagBrush%20fromString%3A%20%27div%27%20canvas%3A%20self%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_newTag_',
+smalltalk.method({
+selector: 'newTag:',
+category: 'tags',
+fn: function (aString){
+var self=this;
+return smalltalk.TagBrush._fromString_canvas_(aString,self);
+return self;},
+source: unescape('newTag%3A%20aString%0A%20%20%20%20%5ETagBrush%20fromString%3A%20aString%20canvas%3A%20self%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_tag_',
+smalltalk.method({
+selector: 'tag:',
+category: 'tags',
+fn: function (aString){
+var self=this;
+return self['@root']._addBrush_(self._newTag_(aString));
+return self;},
+source: unescape('tag%3A%20aString%0A%20%20%20%20%5Eroot%20addBrush%3A%20%28self%20newTag%3A%20aString%29%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_h1',
+smalltalk.method({
+selector: 'h1',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("h1");
+return self;},
+source: unescape('h1%0A%20%20%20%20%5Eself%20tag%3A%20%27h1%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_h2',
+smalltalk.method({
+selector: 'h2',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("h2");
+return self;},
+source: unescape('h2%0A%20%20%20%20%5Eself%20tag%3A%20%27h2%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_h3',
+smalltalk.method({
+selector: 'h3',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("h3");
+return self;},
+source: unescape('h3%0A%20%20%20%20%5Eself%20tag%3A%20%27h3%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_h4',
+smalltalk.method({
+selector: 'h4',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("h4");
+return self;},
+source: unescape('h4%0A%20%20%20%20%5Eself%20tag%3A%20%27h4%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_h5',
+smalltalk.method({
+selector: 'h5',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("h5");
+return self;},
+source: unescape('h5%0A%20%20%20%20%5Eself%20tag%3A%20%27h5%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_h6',
+smalltalk.method({
+selector: 'h6',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("h6");
+return self;},
+source: unescape('h6%0A%20%20%20%20%5Eself%20tag%3A%20%27h6%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_p',
+smalltalk.method({
+selector: 'p',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("p");
+return self;},
+source: unescape('p%0A%20%20%20%20%5Eself%20tag%3A%20%27p%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_div',
+smalltalk.method({
+selector: 'div',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("div");
+return self;},
+source: unescape('div%0A%20%20%20%20%5Eself%20tag%3A%20%27div%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_span',
+smalltalk.method({
+selector: 'span',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("span");
+return self;},
+source: unescape('span%0A%20%20%20%20%5Eself%20tag%3A%20%27span%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_img',
+smalltalk.method({
+selector: 'img',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("img");
+return self;},
+source: unescape('img%0A%20%20%20%20%5Eself%20tag%3A%20%27img%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_ul',
+smalltalk.method({
+selector: 'ul',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("ul");
+return self;},
+source: unescape('ul%0A%20%20%20%20%5Eself%20tag%3A%20%27ul%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_ol',
+smalltalk.method({
+selector: 'ol',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("ol");
+return self;},
+source: unescape('ol%0A%20%20%20%20%5Eself%20tag%3A%20%27ol%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_li',
+smalltalk.method({
+selector: 'li',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("li");
+return self;},
+source: unescape('li%0A%20%20%20%20%5Eself%20tag%3A%20%27li%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_table',
+smalltalk.method({
+selector: 'table',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("table");
+return self;},
+source: unescape('table%0A%20%20%20%20%5Eself%20tag%3A%20%27table%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_tr',
+smalltalk.method({
+selector: 'tr',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("tr");
+return self;},
+source: unescape('tr%0A%20%20%20%20%5Eself%20tag%3A%20%27tr%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_td',
+smalltalk.method({
+selector: 'td',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("td");
+return self;},
+source: unescape('td%20%0A%20%20%20%20%5Eself%20tag%3A%20%27td%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_th',
+smalltalk.method({
+selector: 'th',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("th");
+return self;},
+source: unescape('th%0A%20%20%20%20%5Eself%20tag%3A%20%27th%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_form',
+smalltalk.method({
+selector: 'form',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("form");
+return self;},
+source: unescape('form%0A%20%20%20%20%5Eself%20tag%3A%20%27form%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_input',
+smalltalk.method({
+selector: 'input',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("input");
+return self;},
+source: unescape('input%0A%20%20%20%20%5Eself%20tag%3A%20%27input%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_button',
+smalltalk.method({
+selector: 'button',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("button");
+return self;},
+source: unescape('button%0A%20%20%20%20%5Eself%20tag%3A%20%27button%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_select',
+smalltalk.method({
+selector: 'select',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("select");
+return self;},
+source: unescape('select%0A%20%20%20%20%5Eself%20tag%3A%20%27select%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_option',
+smalltalk.method({
+selector: 'option',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("option");
+return self;},
+source: unescape('option%0A%20%20%20%20%5Eself%20tag%3A%20%27option%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_textarea',
+smalltalk.method({
+selector: 'textarea',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("textarea");
+return self;},
+source: unescape('textarea%0A%20%20%20%20%5Eself%20tag%3A%20%27textarea%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_a',
+smalltalk.method({
+selector: 'a',
+category: 'tags',
+fn: function (){
+var self=this;
+return self._tag_("a");
+return self;},
+source: unescape('a%0A%20%20%20%20%5Eself%20tag%3A%20%27a%27%0A')}),
+smalltalk.HTMLCanvas);
+
+smalltalk.addMethod(
+'_appendToJQuery_',
+smalltalk.method({
+selector: 'appendToJQuery:',
+category: '*JQuery',
+fn: function (aJQuery){
+var self=this;
+aJQuery._appendElement_(self['@root']._element());
+return self;},
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20appendElement%3A%20root%20element%0A')}),
+smalltalk.HTMLCanvas);
+
+
+
+smalltalk.addClass('TagBrush', smalltalk.Object, ['element'], 'Canvas');
+smalltalk.addMethod(
+'_contents_',
+smalltalk.method({
+selector: 'contents:',
+category: 'adding',
+fn: function (anObject){
+var self=this;
+self._asJQuery()._empty();
+self._append_(anObject);
+return self;},
+source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20asJQuery%20empty.%0A%20%20%20%20self%20append%3A%20anObject%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_addBrush_',
+smalltalk.method({
+selector: 'addBrush:',
+category: 'adding',
+fn: function (aTagBrush){
+var self=this;
+self._appendChild_(aTagBrush._element());
+return aTagBrush;
+return self;},
+source: unescape('addBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendChild%3A%20aTagBrush%20element.%0A%20%20%20%20%5EaTagBrush%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_with_',
+smalltalk.method({
+selector: 'with:',
+category: 'adding',
+fn: function (anObject){
+var self=this;
+self._append_(anObject);
+return self;},
+source: unescape('with%3A%20anObject%0A%20%20%20%20self%20append%3A%20anObject%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_append_',
+smalltalk.method({
+selector: 'append:',
+category: 'adding',
+fn: function (anObject){
+var self=this;
+anObject._appendToBrush_(self);
+return self;},
+source: unescape('append%3A%20anObject%0A%20%20%20%20anObject%20appendToBrush%3A%20self%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_appendToBrush_',
+smalltalk.method({
+selector: 'appendToBrush:',
+category: 'adding',
+fn: function (aTagBrush){
+var self=this;
+aTagBrush._addBrush_(self);
+return self;},
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20addBrush%3A%20self%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_appendBlock_',
+smalltalk.method({
+selector: 'appendBlock:',
+category: 'adding',
+fn: function (aBlock){
+var self=this;
+var root=nil;
+root=canvas._root();
+canvas._root_(self);
+aBlock._value_(canvas);
+canvas._root_(root);
+return self;},
+source: unescape('appendBlock%3A%20aBlock%0A%20%20%20%20%7C%20root%20%7C%0A%20%20%20%20root%20%3A%3D%20canvas%20root.%0A%20%20%20%20canvas%20root%3A%20self.%0A%20%20%20%20aBlock%20value%3A%20canvas.%0A%20%20%20%20canvas%20root%3A%20root%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_appendChild_',
+smalltalk.method({
+selector: 'appendChild:',
+category: 'adding',
+fn: function (anElement){
+var self=this;
+(function(){self['@element'].appendChild(anElement)})();
+return self;},
+source: unescape('appendChild%3A%20anElement%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.appendChild%28anElement%29%27%7D%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_appendString_',
+smalltalk.method({
+selector: 'appendString:',
+category: 'adding',
+fn: function (aString){
+var self=this;
+self._appendChild_(self._createTextNodeFor_(aString));
+return self;},
+source: unescape('appendString%3A%20aString%0A%20%20%20%20self%20appendChild%3A%20%28self%20createTextNodeFor%3A%20aString%29%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_at_put_',
+smalltalk.method({
+selector: 'at:put:',
+category: 'attributes',
+fn: function (aString, aValue){
+var self=this;
+(function(){self['@element'].setAttribute(aString, aValue)})();
+return self;},
+source: unescape('at%3A%20aString%20put%3A%20aValue%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.setAttribute%28aString%2C%20aValue%29%27%7D%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_removeAt_',
+smalltalk.method({
+selector: 'removeAt:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+(function(){self['@element'].removeAttribute(aString)})();
+return self;},
+source: unescape('removeAt%3A%20aString%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.removeAttribute%28aString%29%27%7D%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_class_',
+smalltalk.method({
+selector: 'class:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+self._at_put_("class",aString);
+return self;},
+source: unescape('class%3A%20aString%0A%20%20%20%20self%20at%3A%20%27class%27%20put%3A%20aString%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_id_',
+smalltalk.method({
+selector: 'id:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+self._at_put_("id",aString);
+return self;},
+source: unescape('id%3A%20aString%0A%20%20%20%20self%20at%3A%20%27id%27%20put%3A%20aString%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_src_',
+smalltalk.method({
+selector: 'src:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+self._at_put_("src",aString);
+return self;},
+source: unescape('src%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27src%27%20put%3A%20aString%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_href_',
+smalltalk.method({
+selector: 'href:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+self._at_put_("href",aString);
+return self;},
+source: unescape('href%3A%20aString%0A%20%20%20%20self%20at%3A%20%27href%27%20put%3A%20aString%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_title_',
+smalltalk.method({
+selector: 'title:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+self._at_put_("title",aString);
+return self;},
+source: unescape('title%3A%20aString%0A%20%20%20%20self%20at%3A%20%27title%27%20put%3A%20aString%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_style_',
+smalltalk.method({
+selector: 'style:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+self._at_put_("style",aString);
+return self;},
+source: unescape('style%3A%20aString%0A%20%20%20%20self%20at%3A%20%27style%27%20put%3A%20aString%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_initializeFromString_canvas_',
+smalltalk.method({
+selector: 'initializeFromString:canvas:',
+category: 'initialization',
+fn: function (aString, aCanvas){
+var self=this;
+self['@element']=self._createElementFor_(aString);
+canvas=aCanvas;
+return self;},
+source: unescape('initializeFromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20element%20%3A%3D%20self%20createElementFor%3A%20aString.%0A%20%20%20%20canvas%20%3A%3D%20aCanvas%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_element',
+smalltalk.method({
+selector: 'element',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@element'];
+return self;},
+source: unescape('element%0A%20%20%20%20%5Eelement%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_asJQuery',
+smalltalk.method({
+selector: 'asJQuery',
+category: 'converting',
+fn: function (){
+var self=this;
+return (function(){return smalltalk.JQuery._from_(jQuery(self['@element']))})();
+return self;},
+source: unescape('asJQuery%0A%20%20%20%20%5E%7B%27return%20smalltalk.JQuery._from_%28jQuery%28self%5B%27%27@element%27%27%5D%29%29%27%7D%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_onKeyDown_',
+smalltalk.method({
+selector: 'onKeyDown:',
+category: 'events',
+fn: function (aBlock){
+var self=this;
+self._asJQuery()._on_do_("keydown",aBlock);
+return self;},
+source: unescape('onKeyDown%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keydown%27%20do%3A%20aBlock%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_onKeyPress_',
+smalltalk.method({
+selector: 'onKeyPress:',
+category: 'events',
+fn: function (aBlock){
+var self=this;
+self._asJQuery()._on_do_("keypress",aBlock);
+return self;},
+source: unescape('onKeyPress%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keypress%27%20do%3A%20aBlock%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_onKeyUp_',
+smalltalk.method({
+selector: 'onKeyUp:',
+category: 'events',
+fn: function (aBlock){
+var self=this;
+self._asJQuery()._on_do_("keyup",aBlock);
+return self;},
+source: unescape('onKeyUp%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keyup%27%20do%3A%20aBlock%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_onFocus_',
+smalltalk.method({
+selector: 'onFocus:',
+category: 'events',
+fn: function (aBlock){
+var self=this;
+self._asJQuery()._on_do_("focus",aBlock);
+return self;},
+source: unescape('onFocus%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27focus%27%20do%3A%20aBlock%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_onBlur_',
+smalltalk.method({
+selector: 'onBlur:',
+category: 'events',
+fn: function (aBlock){
+var self=this;
+self._asJQuery()._on_do_("blur",aBlock);
+return self;},
+source: unescape('onBlur%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27blur%27%20do%3A%20aBlock%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_onChange_',
+smalltalk.method({
+selector: 'onChange:',
+category: 'events',
+fn: function (aBlock){
+var self=this;
+self._asJQuery()._on_do_("change",aBlock);
+return self;},
+source: unescape('onChange%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27change%27%20do%3A%20aBlock%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_onClick_',
+smalltalk.method({
+selector: 'onClick:',
+category: 'events',
+fn: function (aBlock){
+var self=this;
+self._asJQuery()._on_do_("click",aBlock);
+return self;},
+source: unescape('onClick%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27click%27%20do%3A%20aBlock%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_createElementFor_',
+smalltalk.method({
+selector: 'createElementFor:',
+category: 'private',
+fn: function (aString){
+var self=this;
+return (function(){return document.createElement(String(aString))})();
+return self;},
+source: unescape('createElementFor%3A%20aString%0A%20%20%20%20%5E%7B%27return%20document.createElement%28String%28aString%29%29%27%7D%0A')}),
+smalltalk.TagBrush);
+
+smalltalk.addMethod(
+'_createTextNodeFor_',
+smalltalk.method({
+selector: 'createTextNodeFor:',
+category: 'private',
+fn: function (aString){
+var self=this;
+return (function(){return document.createTextNode(String(aString))})();
+return self;},
+source: unescape('createTextNodeFor%3A%20aString%0A%20%20%20%20%5E%7B%27return%20document.createTextNode%28String%28aString%29%29%27%7D%0A')}),
+smalltalk.TagBrush);
+
+
+smalltalk.addMethod(
+'_fromString_canvas_',
+smalltalk.method({
+selector: 'fromString:canvas:',
+category: 'instance creation',
+fn: function (aString, aCanvas){
+var self=this;
+return (function($rec){$rec._initializeFromString_canvas_(aString,aCanvas);return $rec._yourself();})(self._new());
+return self;},
+source: unescape('fromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20%5Eself%20new%0A%09initializeFromString%3A%20aString%20canvas%3A%20aCanvas%3B%0A%09yourself%0A')}),
+smalltalk.TagBrush.klass);
+
+
+smalltalk.addClass('Widget', smalltalk.Object, ['root'], 'Canvas');
+smalltalk.addMethod(
+'_root',
+smalltalk.method({
+selector: 'root',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@root'];
+return self;},
+source: unescape('root%0A%20%20%20%20%5Eroot%0A')}),
+smalltalk.Widget);
+
+smalltalk.addMethod(
+'_appendToBrush_',
+smalltalk.method({
+selector: 'appendToBrush:',
+category: 'adding',
+fn: function (aTagBrush){
+var self=this;
+self._appendToJQuery_(aTagBrush._asJQuery());
+return self;},
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendToJQuery%3A%20aTagBrush%20asJQuery%0A')}),
+smalltalk.Widget);
+
+smalltalk.addMethod(
+'_appendToJQuery_',
+smalltalk.method({
+selector: 'appendToJQuery:',
+category: 'adding',
+fn: function (aJQuery){
+var self=this;
+self._render();
+aJQuery._append_(self._root()._asJQuery());
+return self;},
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20self%20render.%0A%20%20%20%20aJQuery%20append%3A%20self%20root%20asJQuery%0A')}),
+smalltalk.Widget);
+
+smalltalk.addMethod(
+'_confirm_',
+smalltalk.method({
+selector: 'confirm:',
+category: 'actions',
+fn: function (aString){
+var self=this;
+return (function(){return window.confirm(aString)})();
+return self;},
+source: unescape('confirm%3A%20aString%0A%20%20%20%20%5E%7B%27return%20window.confirm%28aString%29%27%7D%0A')}),
+smalltalk.Widget);
+
+smalltalk.addMethod(
+'_prompt_',
+smalltalk.method({
+selector: 'prompt:',
+category: 'actions',
+fn: function (aString){
+var self=this;
+return self._prompt_default_(aString,"");
+return self;},
+source: unescape('prompt%3A%20aString%0A%20%20%20%20%5Eself%20prompt%3A%20aString%20default%3A%20%27%27%0A')}),
+smalltalk.Widget);
+
+smalltalk.addMethod(
+'_prompt_default_',
+smalltalk.method({
+selector: 'prompt:default:',
+category: 'actions',
+fn: function (aString, anotherString){
+var self=this;
+return (function(){return window.prompt(aString, anotherString)})();
+return self;},
+source: unescape('prompt%3A%20aString%20default%3A%20anotherString%0A%20%20%20%20%5E%7B%27return%20window.prompt%28aString%2C%20anotherString%29%27%7D%0A')}),
+smalltalk.Widget);
+
+smalltalk.addMethod(
+'_update',
+smalltalk.method({
+selector: 'update',
+category: 'actions',
+fn: function (){
+var self=this;
+var canvas=nil;
+canvas=smalltalk.HTMLCanvas._new();
+canvas._root_(self._root());
+self._root()._asJQuery()._empty();
+self._renderOn_(canvas);
+return self;},
+source: unescape('update%0A%20%20%20%20%7C%20canvas%20%7C%0A%20%20%20%20canvas%20%3A%3D%20HTMLCanvas%20new.%0A%20%20%20%20canvas%20root%3A%20self%20root.%0A%20%20%20%20self%20root%20asJQuery%20empty.%0A%20%20%20%20self%20renderOn%3A%20canvas%0A')}),
+smalltalk.Widget);
+
+smalltalk.addMethod(
+'_render',
+smalltalk.method({
+selector: 'render',
+category: 'rendering',
+fn: function (){
+var self=this;
+var canvas=nil;
+canvas=smalltalk.HTMLCanvas._new();
+self['@root']=canvas._root();
+self._renderOn_(canvas);
+return self;},
+source: unescape('render%0A%20%20%20%20%7C%20canvas%20%7C%0A%20%20%20%20canvas%20%3A%3D%20HTMLCanvas%20new.%0A%20%20%20%20root%20%3A%3D%20canvas%20root.%0A%20%20%20%20self%20renderOn%3A%20canvas%0A')}),
+smalltalk.Widget);
+
+smalltalk.addMethod(
+'_renderOn_',
+smalltalk.method({
+selector: 'renderOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+self;
+return self;},
+source: unescape('renderOn%3A%20html%0A%20%20%20%20self%0A')}),
+smalltalk.Widget);
+
+
+
+smalltalk.addClass('Counter', smalltalk.Widget, ['count'], 'Canvas');
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
+self['@count']=(0);
+return self;},
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20count%20%3A%3D%200%0A')}),
+smalltalk.Counter);
+
+smalltalk.addMethod(
+'_renderOn_',
+smalltalk.method({
+selector: 'renderOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+html._h1()._with_(self['@count']._asString());
+(function($rec){$rec._with_(unescape("++"));return $rec._onClick_((function(){return self._increase();}));})(html._button());
+(function($rec){$rec._with_(unescape("--"));return $rec._onClick_((function(){return self._decrease();}));})(html._button());
+return self;},
+source: unescape('renderOn%3A%20html%0A%20%20%20%20html%20h1%20with%3A%20count%20asString.%0A%20%20%20%20html%20button%0A%09with%3A%20%27++%27%3B%0A%09onClick%3A%20%5Bself%20increase%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27--%27%3B%0A%09onClick%3A%20%5Bself%20decrease%5D%0A')}),
+smalltalk.Counter);
+
+smalltalk.addMethod(
+'_increase',
+smalltalk.method({
+selector: 'increase',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@count']=self['@count'].__plus((1));
+self._update();
+return self;},
+source: unescape('increase%0A%20%20%20%20count%20%3A%3D%20count%20+%201.%0A%20%20%20%20self%20update%0A')}),
+smalltalk.Counter);
+
+smalltalk.addMethod(
+'_decrease',
+smalltalk.method({
+selector: 'decrease',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@count']=self['@count'].__minus((1));
+self._update();
+return self;},
+source: unescape('decrease%0A%20%20%20%20count%20%3A%3D%20count%20-%201.%0A%20%20%20%20self%20update%0A')}),
+smalltalk.Counter);
+
+
+
+

+ 1106 - 0
js/compiler.js

@@ -0,0 +1,1106 @@
+smalltalk.addClass('Node', smalltalk.Object, ['nodes'], 'Compiler');
+smalltalk.addMethod(
+'_nodes',
+smalltalk.method({
+selector: 'nodes',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@nodes']._ifNil_((function(){return self['@nodes']=smalltalk.Array._new();}));
+return self;},
+source: unescape('nodes%0A%09%5Enodes%20ifNil%3A%20%5Bnodes%20%3A%3D%20Array%20new%5D%0A')}),
+smalltalk.Node);
+
+smalltalk.addMethod(
+'_nodes_',
+smalltalk.method({
+selector: 'nodes:',
+category: 'building',
+fn: function (aCollection){
+var self=this;
+self['@nodes']=aCollection;
+return self;},
+source: unescape('nodes%3A%20aCollection%0A%09nodes%20%3A%3D%20aCollection%0A')}),
+smalltalk.Node);
+
+smalltalk.addMethod(
+'_addNode_',
+smalltalk.method({
+selector: 'addNode:',
+category: 'accessing',
+fn: function (aNode){
+var self=this;
+self._nodes()._add_(aNode);
+return self;},
+source: unescape('addNode%3A%20aNode%0A%09self%20nodes%20add%3A%20aNode%0A')}),
+smalltalk.Node);
+
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitNode%3A%20self%0A')}),
+smalltalk.Node);
+
+
+
+smalltalk.addClass('MethodNode', smalltalk.Node, ['selector', 'arguments', 'source'], 'Compiler');
+smalltalk.addMethod(
+'_selector',
+smalltalk.method({
+selector: 'selector',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@selector'];
+return self;},
+source: unescape('selector%0A%09%5Eselector%0A')}),
+smalltalk.MethodNode);
+
+smalltalk.addMethod(
+'_selector_',
+smalltalk.method({
+selector: 'selector:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+self['@selector']=aString;
+return self;},
+source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString%0A')}),
+smalltalk.MethodNode);
+
+smalltalk.addMethod(
+'_arguments',
+smalltalk.method({
+selector: 'arguments',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@arguments']._ifNil_((function(){return [];}));
+return self;},
+source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5B%23%28%29%5D%0A')}),
+smalltalk.MethodNode);
+
+smalltalk.addMethod(
+'_arguments_',
+smalltalk.method({
+selector: 'arguments:',
+category: 'accessing',
+fn: function (aCollection){
+var self=this;
+self['@arguments']=aCollection;
+return self;},
+source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection%0A')}),
+smalltalk.MethodNode);
+
+smalltalk.addMethod(
+'_source',
+smalltalk.method({
+selector: 'source',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@source'];
+return self;},
+source: unescape('source%0A%09%5Esource%0A')}),
+smalltalk.MethodNode);
+
+smalltalk.addMethod(
+'_source_',
+smalltalk.method({
+selector: 'source:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+self['@source']=aString;
+return self;},
+source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString%0A')}),
+smalltalk.MethodNode);
+
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitMethodNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitMethodNode%3A%20self%0A')}),
+smalltalk.MethodNode);
+
+
+
+smalltalk.addClass('SendNode', smalltalk.Node, ['selector', 'arguments', 'receiver'], 'Compiler');
+smalltalk.addMethod(
+'_selector',
+smalltalk.method({
+selector: 'selector',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@selector'];
+return self;},
+source: unescape('selector%0A%09%5Eselector%0A')}),
+smalltalk.SendNode);
+
+smalltalk.addMethod(
+'_selector_',
+smalltalk.method({
+selector: 'selector:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+self['@selector']=aString;
+return self;},
+source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString%0A')}),
+smalltalk.SendNode);
+
+smalltalk.addMethod(
+'_arguments',
+smalltalk.method({
+selector: 'arguments',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@arguments']._ifNil_((function(){return self['@arguments']=[];}));
+return self;},
+source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5Barguments%20%3A%3D%20%23%28%29%5D%0A')}),
+smalltalk.SendNode);
+
+smalltalk.addMethod(
+'_arguments_',
+smalltalk.method({
+selector: 'arguments:',
+category: 'accessing',
+fn: function (aCollection){
+var self=this;
+self['@arguments']=aCollection;
+return self;},
+source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection%0A')}),
+smalltalk.SendNode);
+
+smalltalk.addMethod(
+'_receiver',
+smalltalk.method({
+selector: 'receiver',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@receiver'];
+return self;},
+source: unescape('receiver%0A%09%5Ereceiver%0A')}),
+smalltalk.SendNode);
+
+smalltalk.addMethod(
+'_receiver_',
+smalltalk.method({
+selector: 'receiver:',
+category: 'accessing',
+fn: function (aNode){
+var self=this;
+self['@receiver']=aNode;
+return self;},
+source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode%0A')}),
+smalltalk.SendNode);
+
+smalltalk.addMethod(
+'_valueForReceiver_',
+smalltalk.method({
+selector: 'valueForReceiver:',
+category: 'accessing',
+fn: function (anObject){
+var self=this;
+return (function($rec){$rec._receiver_(self._receiver()._ifNil_ifNotNil_((function(){return anObject;}),(function(){return self._receiver()._valueForReceiver_(anObject);})));$rec._selector_(self._selector());$rec._arguments_(self._arguments());return $rec._yourself();})(smalltalk.SendNode._new());
+return self;},
+source: unescape('valueForReceiver%3A%20anObject%0A%09%5ESendNode%20new%0A%09%20%20%20%20receiver%3A%20%28self%20receiver%20%0A%09%09ifNil%3A%20%5BanObject%5D%0A%09%09ifNotNil%3A%20%5Bself%20receiver%20valueForReceiver%3A%20anObject%5D%29%3B%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself%0A')}),
+smalltalk.SendNode);
+
+smalltalk.addMethod(
+'_cascadeNodeWithMessages_',
+smalltalk.method({
+selector: 'cascadeNodeWithMessages:',
+category: 'accessing',
+fn: function (aCollection){
+var self=this;
+var first=nil;
+first=(function($rec){$rec._selector_(self._selector());$rec._arguments_(self._arguments());return $rec._yourself();})(smalltalk.SendNode._new());
+return (function($rec){$rec._receiver_(self._receiver());$rec._nodes_(smalltalk.Array._with_(first).__comma(aCollection));return $rec._yourself();})(smalltalk.CascadeNode._new());
+return self;},
+source: unescape('cascadeNodeWithMessages%3A%20aCollection%0A%09%7C%20first%20%7C%0A%09first%20%3A%3D%20SendNode%20new%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself.%0A%09%5ECascadeNode%20new%0A%09%20%20%20%20receiver%3A%20self%20receiver%3B%0A%09%20%20%20%20nodes%3A%20%28Array%20with%3A%20first%29%2C%20aCollection%3B%0A%09%20%20%20%20yourself%0A')}),
+smalltalk.SendNode);
+
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitSendNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitSendNode%3A%20self%0A')}),
+smalltalk.SendNode);
+
+
+
+smalltalk.addClass('CascadeNode', smalltalk.Node, ['receiver'], 'Compiler');
+smalltalk.addMethod(
+'_receiver',
+smalltalk.method({
+selector: 'receiver',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@receiver'];
+return self;},
+source: unescape('receiver%0A%09%5Ereceiver%0A')}),
+smalltalk.CascadeNode);
+
+smalltalk.addMethod(
+'_receiver_',
+smalltalk.method({
+selector: 'receiver:',
+category: 'accessing',
+fn: function (aNode){
+var self=this;
+self['@receiver']=aNode;
+return self;},
+source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode%0A')}),
+smalltalk.CascadeNode);
+
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitCascadeNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitCascadeNode%3A%20self%0A')}),
+smalltalk.CascadeNode);
+
+
+
+smalltalk.addClass('AssignmentNode', smalltalk.Node, ['left', 'right'], 'Compiler');
+smalltalk.addMethod(
+'_left',
+smalltalk.method({
+selector: 'left',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@left'];
+return self;},
+source: unescape('left%0A%09%5Eleft%0A')}),
+smalltalk.AssignmentNode);
+
+smalltalk.addMethod(
+'_left_',
+smalltalk.method({
+selector: 'left:',
+category: 'accessing',
+fn: function (aNode){
+var self=this;
+self['@left']=aNode;
+return self;},
+source: unescape('left%3A%20aNode%0A%09left%20%3A%3D%20aNode%0A')}),
+smalltalk.AssignmentNode);
+
+smalltalk.addMethod(
+'_right',
+smalltalk.method({
+selector: 'right',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@right'];
+return self;},
+source: unescape('right%0A%09%5Eright%0A')}),
+smalltalk.AssignmentNode);
+
+smalltalk.addMethod(
+'_right_',
+smalltalk.method({
+selector: 'right:',
+category: 'accessing',
+fn: function (aNode){
+var self=this;
+self['@right']=aNode;
+return self;},
+source: unescape('right%3A%20aNode%0A%09right%20%3A%3D%20aNode%0A')}),
+smalltalk.AssignmentNode);
+
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitAssignmentNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitAssignmentNode%3A%20self%0A')}),
+smalltalk.AssignmentNode);
+
+
+
+smalltalk.addClass('BlockNode', smalltalk.Node, ['parameters'], 'Compiler');
+smalltalk.addMethod(
+'_parameters',
+smalltalk.method({
+selector: 'parameters',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@parameters']._ifNil_((function(){return self['@parameters']=smalltalk.Array._new();}));
+return self;},
+source: unescape('parameters%0A%09%5Eparameters%20ifNil%3A%20%5Bparameters%20%3A%3D%20Array%20new%5D%0A')}),
+smalltalk.BlockNode);
+
+smalltalk.addMethod(
+'_parameters_',
+smalltalk.method({
+selector: 'parameters:',
+category: 'accessing',
+fn: function (aCollection){
+var self=this;
+self['@parameters']=aCollection;
+return self;},
+source: unescape('parameters%3A%20aCollection%0A%09parameters%20%3A%3D%20aCollection%0A')}),
+smalltalk.BlockNode);
+
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitBlockNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockNode%3A%20self%0A')}),
+smalltalk.BlockNode);
+
+
+
+smalltalk.addClass('SequenceNode', smalltalk.Node, ['temps'], 'Compiler');
+smalltalk.addMethod(
+'_temps',
+smalltalk.method({
+selector: 'temps',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@temps']._ifNil_((function(){return [];}));
+return self;},
+source: unescape('temps%0A%09%5Etemps%20ifNil%3A%20%5B%23%28%29%5D%0A')}),
+smalltalk.SequenceNode);
+
+smalltalk.addMethod(
+'_temps_',
+smalltalk.method({
+selector: 'temps:',
+category: 'accessing',
+fn: function (aCollection){
+var self=this;
+self['@temps']=aCollection;
+return self;},
+source: unescape('temps%3A%20aCollection%0A%09temps%20%3A%3D%20aCollection%0A')}),
+smalltalk.SequenceNode);
+
+smalltalk.addMethod(
+'_asBlockSequenceNode',
+smalltalk.method({
+selector: 'asBlockSequenceNode',
+category: 'testing',
+fn: function (){
+var self=this;
+return (function($rec){$rec._nodes_(self._nodes());$rec._temps_(self._temps());return $rec._yourself();})(smalltalk.BlockSequenceNode._new());
+return self;},
+source: unescape('asBlockSequenceNode%0A%09%5EBlockSequenceNode%20new%0A%09%20%20%20%20nodes%3A%20self%20nodes%3B%0A%09%20%20%20%20temps%3A%20self%20temps%3B%0A%09%20%20%20%20yourself%0A')}),
+smalltalk.SequenceNode);
+
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitSequenceNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitSequenceNode%3A%20self%0A')}),
+smalltalk.SequenceNode);
+
+
+
+smalltalk.addClass('BlockSequenceNode', smalltalk.SequenceNode, [], 'Compiler');
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitBlockSequenceNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockSequenceNode%3A%20self%0A')}),
+smalltalk.BlockSequenceNode);
+
+
+
+smalltalk.addClass('ReturnNode', smalltalk.Node, [], 'Compiler');
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitReturnNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitReturnNode%3A%20self%0A')}),
+smalltalk.ReturnNode);
+
+
+
+smalltalk.addClass('ValueNode', smalltalk.Node, ['value'], 'Compiler');
+smalltalk.addMethod(
+'_value',
+smalltalk.method({
+selector: 'value',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@value'];
+return self;},
+source: unescape('value%0A%09%5Evalue%0A')}),
+smalltalk.ValueNode);
+
+smalltalk.addMethod(
+'_value_',
+smalltalk.method({
+selector: 'value:',
+category: 'accessing',
+fn: function (anObject){
+var self=this;
+self['@value']=anObject;
+return self;},
+source: unescape('value%3A%20anObject%0A%09value%20%3A%3D%20anObject%0A')}),
+smalltalk.ValueNode);
+
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitValueNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitValueNode%3A%20self%0A')}),
+smalltalk.ValueNode);
+
+
+
+smalltalk.addClass('VariableNode', smalltalk.ValueNode, [], 'Compiler');
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitVariableNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitVariableNode%3A%20self%0A')}),
+smalltalk.VariableNode);
+
+
+
+smalltalk.addClass('ClassReferenceNode', smalltalk.VariableNode, [], 'Compiler');
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitClassReferenceNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitClassReferenceNode%3A%20self%0A')}),
+smalltalk.ClassReferenceNode);
+
+
+
+smalltalk.addClass('JSStatementNode', smalltalk.Node, ['source'], 'Compiler');
+smalltalk.addMethod(
+'_source',
+smalltalk.method({
+selector: 'source',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@source']._ifNil_((function(){return "";}));
+return self;},
+source: unescape('source%0A%09%5Esource%20ifNil%3A%20%5B%27%27%5D%0A')}),
+smalltalk.JSStatementNode);
+
+smalltalk.addMethod(
+'_source_',
+smalltalk.method({
+selector: 'source:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+self['@source']=aString;
+return self;},
+source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString%0A')}),
+smalltalk.JSStatementNode);
+
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+aVisitor._visitJSStatementNode_(self);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitJSStatementNode%3A%20self%0A')}),
+smalltalk.JSStatementNode);
+
+
+
+smalltalk.addClass('NodeVisitor', smalltalk.Object, [], 'Compiler');
+smalltalk.addMethod(
+'_visit_',
+smalltalk.method({
+selector: 'visit:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+aNode._accept_(self);
+return self;},
+source: unescape('visit%3A%20aNode%0A%09aNode%20accept%3A%20self%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitNode_',
+smalltalk.method({
+selector: 'visitNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+
+return self;},
+source: unescape('visitNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitMethodNode_',
+smalltalk.method({
+selector: 'visitMethodNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visitNode_(aNode);
+return self;},
+source: unescape('visitMethodNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitSequenceNode_',
+smalltalk.method({
+selector: 'visitSequenceNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visitNode_(aNode);
+return self;},
+source: unescape('visitSequenceNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitBlockSequenceNode_',
+smalltalk.method({
+selector: 'visitBlockSequenceNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visitSequenceNode_(aNode);
+return self;},
+source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09self%20visitSequenceNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitBlockNode_',
+smalltalk.method({
+selector: 'visitBlockNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visitNode_(aNode);
+return self;},
+source: unescape('visitBlockNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitReturnNode_',
+smalltalk.method({
+selector: 'visitReturnNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visitNode_(aNode);
+return self;},
+source: unescape('visitReturnNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitSendNode_',
+smalltalk.method({
+selector: 'visitSendNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visitNode_(aNode);
+return self;},
+source: unescape('visitSendNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitCascadeNode_',
+smalltalk.method({
+selector: 'visitCascadeNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visitNode_(aNode);
+return self;},
+source: unescape('visitCascadeNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitValueNode_',
+smalltalk.method({
+selector: 'visitValueNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visitNode_(aNode);
+return self;},
+source: unescape('visitValueNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitVariableNode_',
+smalltalk.method({
+selector: 'visitVariableNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+
+return self;},
+source: unescape('visitVariableNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitAssignmentNode_',
+smalltalk.method({
+selector: 'visitAssignmentNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visitNode_(aNode);
+return self;},
+source: unescape('visitAssignmentNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitClassReferenceNode_',
+smalltalk.method({
+selector: 'visitClassReferenceNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+(function($rec){$rec._nextPutAll_("smalltalk.");return $rec._nextPutAll_(aNode._value());})(self);
+return self;},
+source: unescape('visitClassReferenceNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20value%0A')}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitJSStatementNode_',
+smalltalk.method({
+selector: 'visitJSStatementNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+(function($rec){$rec._nextPutAll_(unescape("function%28%29%7B"));$rec._nextPutAll_(aNode._source());return $rec._nextPutAll_(unescape("%7D%29%28%29"));})(self);
+return self;},
+source: unescape('visitJSStatementNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27function%28%29%7B%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20source%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%7D%29%28%29%27%0A')}),
+smalltalk.NodeVisitor);
+
+
+
+smalltalk.addClass('Compiler', smalltalk.NodeVisitor, ['stream', 'nestedBlocks', 'earlyReturn', 'currentClass', 'currentSelector'], 'Compiler');
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
+self['@stream']=""._writeStream();
+return self;},
+source: unescape('initialize%0A%09super%20initialize.%0A%09stream%20%3A%3D%20%27%27%20writeStream%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_parser',
+smalltalk.method({
+selector: 'parser',
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.SmalltalkParser._new();
+return self;},
+source: unescape('parser%0A%09%5ESmalltalkParser%20new%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_currentClass',
+smalltalk.method({
+selector: 'currentClass',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@currentClass'];
+return self;},
+source: unescape('currentClass%0A%09%5EcurrentClass%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_currentClass_',
+smalltalk.method({
+selector: 'currentClass:',
+category: 'accessing',
+fn: function (aClass){
+var self=this;
+self['@currentClass']=aClass;
+return self;},
+source: unescape('currentClass%3A%20aClass%0A%09currentClass%20%3A%3D%20aClass%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_loadExpression_',
+smalltalk.method({
+selector: 'loadExpression:',
+category: 'compiling',
+fn: function (aString){
+var self=this;
+smalltalk.DoIt._addCompiledMethod_(self._eval_(self._compileExpression_(aString)));
+return smalltalk.DoIt._new()._doIt();
+return self;},
+source: unescape('loadExpression%3A%20aString%0A%09DoIt%20addCompiledMethod%3A%20%28self%20eval%3A%20%28self%20compileExpression%3A%20aString%29%29.%0A%09%5EDoIt%20new%20doIt%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_load_forClass_',
+smalltalk.method({
+selector: 'load:forClass:',
+category: 'compiling',
+fn: function (aString, aClass){
+var self=this;
+return self._eval_(self._compile_forClass_(aString,aClass));
+return self;},
+source: unescape('load%3A%20aString%20forClass%3A%20aClass%0A%09%5Eself%20eval%3A%20%28self%20compile%3A%20aString%20forClass%3A%20aClass%29%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_compile_forClass_',
+smalltalk.method({
+selector: 'compile:forClass:',
+category: 'compiling',
+fn: function (aString, aClass){
+var self=this;
+self._currentClass_(aClass);
+return self._compile_(aString);
+return self;},
+source: unescape('compile%3A%20aString%20forClass%3A%20aClass%0A%09self%20currentClass%3A%20aClass.%0A%09%5Eself%20compile%3A%20aString%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_compileExpression_',
+smalltalk.method({
+selector: 'compileExpression:',
+category: 'compiling',
+fn: function (aString){
+var self=this;
+self._currentClass_(smalltalk.DoIt);
+return self._compile_(unescape("doIt%20%5E%5B").__comma(aString).__comma(unescape("%5D%20value")));
+return self;},
+source: unescape('compileExpression%3A%20aString%0A%09self%20currentClass%3A%20DoIt.%0A%09%5Eself%20compile%3A%20%27doIt%20%5E%5B%27%2C%20aString%2C%20%27%5D%20value%27%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_eval_',
+smalltalk.method({
+selector: 'eval:',
+category: 'compiling',
+fn: function (aString){
+var self=this;
+return (function(){return eval(aString);})();
+return self;},
+source: unescape('eval%3A%20aString%0A%09%5E%7B%27return%20eval%28aString%29%3B%27%7D%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_compile_',
+smalltalk.method({
+selector: 'compile:',
+category: 'compiling',
+fn: function (aString){
+var self=this;
+return self._compileNode_(self._parser()._parse_(aString._readStream()));
+return self;},
+source: unescape('compile%3A%20aString%0A%09%5Eself%20compileNode%3A%20%28self%20parser%20parse%3A%20aString%20readStream%29%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_compileNode_',
+smalltalk.method({
+selector: 'compileNode:',
+category: 'compiling',
+fn: function (aNode){
+var self=this;
+self['@stream']=""._writeStream();
+self._visit_(aNode);
+return self['@stream']._contents();
+return self;},
+source: unescape('compileNode%3A%20aNode%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09self%20visit%3A%20aNode.%0A%09%5Estream%20contents%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visit_',
+smalltalk.method({
+selector: 'visit:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+aNode._accept_(self);
+return self;},
+source: unescape('visit%3A%20aNode%0A%09aNode%20accept%3A%20self%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitMethodNode_',
+smalltalk.method({
+selector: 'visitMethodNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+var str=nil;
+var currentSelector=nil;
+self['@currentSelector']=aNode._selector()._asSelector();
+self['@nestedBlocks']=(0);
+self['@earlyReturn']=false;
+(function($rec){$rec._nextPutAll_(unescape("smalltalk.method%28%7B").__comma(smalltalk.String._cr()));$rec._nextPutAll_(unescape("selector%3A%20%22").__comma(aNode._selector()).__comma(unescape("%22%2C")).__comma(smalltalk.String._cr()));$rec._nextPutAll_(unescape("source%3A%20unescape%28%22").__comma(aNode._source()._escaped()).__comma(unescape("%22%29%2C")).__comma(smalltalk.String._cr()));return $rec._nextPutAll_(unescape("fn%3A%20function%28"));})(self['@stream']);
+aNode._arguments()._do_separatedBy_((function(each){return self['@stream']._nextPutAll_(each);}),(function(){return self['@stream']._nextPutAll_(unescape("%2C%20"));}));
+(function($rec){$rec._nextPutAll_(unescape("%29%7B").__comma(smalltalk.String._cr()));return $rec._nextPutAll_(unescape("var%20self%3Dthis%3B").__comma(smalltalk.String._cr()));})(self['@stream']);
+str=self['@stream'];
+self['@stream']=""._writeStream();
+aNode._nodes()._do_((function(each){return self._visit_(each);}));
+self['@earlyReturn']._ifTrue_((function(){return str._nextPutAll_(unescape("try%7B"));}));
+str._nextPutAll_(self['@stream']._contents());
+self['@stream']=str;
+(function($rec){$rec._nextPutAll_(smalltalk.String._cr());return $rec._nextPutAll_(unescape("return%20self%3B"));})(self['@stream']);
+self['@earlyReturn']._ifTrue_((function(){return self['@stream']._nextPutAll_(smalltalk.String._cr().__comma(unescape("%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27stReturn%27%20%26%26%20e.selector%20%3D%3D%3D%20")).__comma(self['@currentSelector']._printString()).__comma(unescape("%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D")));}));
+(function($rec){$rec._nextPutAll_(unescape("%7D").__comma(smalltalk.String._cr()));return $rec._nextPutAll_(unescape("%7D%29"));})(self['@stream']);
+return self;},
+source: unescape('visitMethodNode%3A%20aNode%0A%09%7C%20str%20currentSelector%20%7C%0A%09currentSelector%20%3A%3D%20aNode%20selector%20asSelector.%0A%09nestedBlocks%20%3A%3D%200.%0A%09earlyReturn%20%3A%3D%20false.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.method%28%7B%27%2C%20String%20cr%3B%0A%09%20%20%20%20nextPutAll%3A%20%27selector%3A%20%22%27%2C%20aNode%20selector%2C%20%27%22%2C%27%2C%20String%20cr%3B%0A%09%20%20%20%20nextPutAll%3A%20%27source%3A%20unescape%28%22%27%2C%20aNode%20source%20escaped%2C%20%27%22%29%2C%27%2C%20String%20cr%3B%0A%09%20%20%20%20nextPutAll%3A%20%27fn%3A%20function%28%27.%0A%09aNode%20arguments%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20%27%29%7B%27%2C%20String%20cr%3B%0A%09%20%20%20%20nextPutAll%3A%20%27var%20self%3Dthis%3B%27%2C%20String%20cr.%0A%09str%20%3A%3D%20stream.%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each%5D.%0A%09earlyReturn%20ifTrue%3A%20%5B%0A%09%20%20%20%20str%20nextPutAll%3A%20%27try%7B%27%5D.%0A%09str%20nextPutAll%3A%20stream%20contents.%0A%09stream%20%3A%3D%20str.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20String%20cr%3B%20%0A%09%20%20%20%20nextPutAll%3A%20%27return%20self%3B%27.%0A%09earlyReturn%20ifTrue%3A%20%5B%0A%09%20%20%20%20stream%20nextPutAll%3A%20String%20cr%2C%20%27%7D%20catch%28e%29%20%7Bif%28e.name%20%3D%3D%3D%20%27%27stReturn%27%27%20%26%26%20e.selector%20%3D%3D%3D%20%27%2C%20currentSelector%20printString%2C%20%27%29%7Breturn%20e.fn%28%29%7D%20throw%28e%29%7D%27%5D.%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20%27%7D%27%2C%20String%20cr%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%7D%29%27%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitBlockNode_',
+smalltalk.method({
+selector: 'visitBlockNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self['@stream']._nextPutAll_(unescape("%28function%28"));
+aNode._parameters()._do_separatedBy_((function(each){return self['@stream']._nextPutAll_(each);}),(function(){return self['@stream']._nextPutAll_(unescape("%2C%20"));}));
+self['@stream']._nextPutAll_(unescape("%29%7B"));
+aNode._nodes()._do_((function(each){return self._visit_(each);}));
+self['@stream']._nextPutAll_(unescape("%7D%29"));
+return self;},
+source: unescape('visitBlockNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%28function%28%27.%0A%09aNode%20parameters%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%0A%09%09stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09stream%20nextPutAll%3A%20%27%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%27%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitSequenceNode_',
+smalltalk.method({
+selector: 'visitSequenceNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+aNode._temps()._do_((function(each){self['@stream']._nextPutAll_("var ".__comma(each).__comma(unescape("%3Dnil%3B")));return self['@stream']._nextPutAll_(smalltalk.String._cr());}));
+aNode._nodes()._do_separatedBy_((function(each){self._visit_(each);return self['@stream']._nextPutAll_(unescape("%3B"));}),(function(){return self['@stream']._nextPutAll_(smalltalk.String._cr());}));
+return self;},
+source: unescape('visitSequenceNode%3A%20aNode%0A%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20each%2C%20%27%3Dnil%3B%27.%0A%09%20%20%20%20stream%20nextPutAll%3A%20String%20cr%5D.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20String%20cr%5D%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitBlockSequenceNode_',
+smalltalk.method({
+selector: 'visitBlockSequenceNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+var index=nil;
+self['@nestedBlocks']=self['@nestedBlocks'].__plus((1));
+aNode._nodes()._isEmpty()._ifTrue_ifFalse_((function(){return self['@stream']._nextPutAll_(unescape("return%20nil%3B"));}),(function(){aNode._temps()._do_((function(each){self['@stream']._nextPutAll_("var ".__comma(each).__comma(unescape("%3Dnil%3B")));return self['@stream']._nextPutAll_(smalltalk.String._cr());}));index=(0);return aNode._nodes()._do_((function(each){index=index.__plus((1));index.__eq(aNode._nodes()._size())._ifTrue_((function(){return self['@stream']._nextPutAll_("return ");}));self._visit_(each);return self['@stream']._nextPutAll_(unescape("%3B"));}));}));
+self['@nestedBlocks']=self['@nestedBlocks'].__minus((1));
+return self;},
+source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20+%201.%0A%09aNode%20nodes%20isEmpty%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20nil%3B%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20each%2C%20%27%3Dnil%3B%27.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20String%20cr%5D.%0A%09%09index%20%3A%3D%200.%0A%09%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%09%20%20%20%20self%20visit%3A%20each.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%5D.%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20-%201%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitReturnNode_',
+smalltalk.method({
+selector: 'visitReturnNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self['@nestedBlocks'].__gt((0))._ifTrue_((function(){return self['@earlyReturn']=true;}));
+self['@earlyReturn']._ifTrue_ifFalse_((function(){return (function($rec){$rec._nextPutAll_(unescape("%28function%28%29%7Bthrow%28"));$rec._nextPutAll_(unescape("%7Bname%3A%20%27stReturn%27%2C%20selector%3A%20"));$rec._nextPutAll_(self['@currentSelector']._printString());return $rec._nextPutAll_(unescape("%2C%20fn%3A%20function%28%29%7Breturn%20"));})(self['@stream']);}),(function(){return self['@stream']._nextPutAll_("return ");}));
+aNode._nodes()._do_((function(each){return self._visit_(each);}));
+self['@earlyReturn']._ifTrue_((function(){return self['@stream']._nextPutAll_(unescape("%7D%7D%29%7D%29%28%29"));}));
+return self;},
+source: unescape('visitReturnNode%3A%20aNode%0A%09nestedBlocks%20%3E%200%20ifTrue%3A%20%5B%0A%09%20%20%20%20earlyReturn%20%3A%3D%20true%5D.%0A%09earlyReturn%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09stream%0A%09%09%20%20%20%20nextPutAll%3A%20%27%28function%28%29%7Bthrow%28%27%3B%0A%09%09%20%20%20%20nextPutAll%3A%20%27%7Bname%3A%20%27%27stReturn%27%27%2C%20selector%3A%20%27%3B%0A%09%09%20%20%20%20nextPutAll%3A%20currentSelector%20printString%3B%0A%09%09%20%20%20%20nextPutAll%3A%20%27%2C%20fn%3A%20function%28%29%7Breturn%20%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5Bstream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each%5D.%0A%09earlyReturn%20ifTrue%3A%20%5B%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%7D%7D%29%7D%29%28%29%27%5D%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitSendNode_',
+smalltalk.method({
+selector: 'visitSendNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+var str=nil;
+str=self['@stream'];
+self['@stream']=""._writeStream();
+self._visit_(aNode._receiver());
+self['@stream']._contents().__eq("super")._ifTrue_ifFalse_((function(){self['@stream']=str;(function($rec){$rec._nextPutAll_(unescape("self.klass.superclass.fn.prototype%5B%27"));$rec._nextPutAll_(aNode._selector()._asSelector());return $rec._nextPutAll_(unescape("%27%5D.apply%28self%2C%20%5B"));})(self['@stream']);aNode._arguments()._do_separatedBy_((function(each){return self._visit_(each);}),(function(){return self['@stream']._nextPutAll_(unescape("%2C"));}));return self['@stream']._nextPutAll_(unescape("%5D%29"));}),(function(){str._nextPutAll_(self['@stream']._contents());self['@stream']=str;self['@stream']._nextPutAll_(".".__comma(aNode._selector()._asSelector()).__comma(unescape("%28")));aNode._arguments()._do_separatedBy_((function(each){return self._visit_(each);}),(function(){return self['@stream']._nextPutAll_(unescape("%2C"));}));return self['@stream']._nextPutAll_(unescape("%29"));}));
+return self;},
+source: unescape('visitSendNode%3A%20aNode%0A%09%7C%20str%20%7C%0A%09str%20%3A%3D%20stream.%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09self%20visit%3A%20aNode%20receiver.%0A%09stream%20contents%20%3D%20%27super%27%20%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09stream%20%3A%3D%20str.%0A%09%09stream%20%0A%09%09%20%20%20%20nextPutAll%3A%20%27self.klass.superclass.fn.prototype%5B%27%27%27%3B%0A%09%09%20%20%20%20nextPutAll%3A%20aNode%20selector%20asSelector%3B%0A%09%09%20%20%20%20nextPutAll%3A%20%27%27%27%5D.apply%28self%2C%20%5B%27.%0A%09%09aNode%20arguments%20%0A%09%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09%09stream%20nextPutAll%3A%20%27%5D%29%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09str%20nextPutAll%3A%20stream%20contents.%0A%09%09stream%20%3A%3D%20str.%0A%09%09stream%20nextPutAll%3A%20%27.%27%2C%20aNode%20selector%20asSelector%2C%20%27%28%27.%0A%09%09aNode%20arguments%20%0A%09%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09%09stream%20nextPutAll%3A%20%27%29%27%5D%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitCascadeNode_',
+smalltalk.method({
+selector: 'visitCascadeNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+var index=nil;
+index=(0);
+self['@stream']._nextPutAll_(unescape("%28function%28%24rec%29%7B"));
+aNode._nodes()._do_((function(each){index=index.__plus((1));index.__eq(aNode._nodes()._size())._ifTrue_((function(){return self['@stream']._nextPutAll_("return ");}));each._receiver_(smalltalk.VariableNode._new()._value_("$rec"));self._visit_(each);return self['@stream']._nextPutAll_(unescape("%3B"));}));
+self['@stream']._nextPutAll_(unescape("%7D%29%28"));
+self._visit_(aNode._receiver());
+self['@stream']._nextPutAll_(unescape("%29"));
+return self;},
+source: unescape('visitCascadeNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09index%20%3A%3D%200.%0A%09stream%20nextPutAll%3A%20%27%28function%28%24rec%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%20%20%20%20each%20receiver%3A%20%28VariableNode%20new%20value%3A%20%27%24rec%27%29.%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%28%27.%0A%09self%20visit%3A%20aNode%20receiver.%0A%09stream%20nextPutAll%3A%20%27%29%27%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitValueNode_',
+smalltalk.method({
+selector: 'visitValueNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self['@stream']._nextPutAll_(aNode._value()._asJavascript());
+return self;},
+source: unescape('visitValueNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20aNode%20value%20asJavascript%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitAssignmentNode_',
+smalltalk.method({
+selector: 'visitAssignmentNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._visit_(aNode._left());
+self['@stream']._nextPutAll_(unescape("%3D"));
+self._visit_(aNode._right());
+return self;},
+source: unescape('visitAssignmentNode%3A%20aNode%0A%09self%20visit%3A%20aNode%20left.%0A%09stream%20nextPutAll%3A%20%27%3D%27.%0A%09self%20visit%3A%20aNode%20right%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitClassReferenceNode_',
+smalltalk.method({
+selector: 'visitClassReferenceNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+(function($rec){$rec._nextPutAll_("smalltalk.");return $rec._nextPutAll_(aNode._value());})(self['@stream']);
+return self;},
+source: unescape('visitClassReferenceNode%3A%20aNode%0A%09stream%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20value%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitVariableNode_',
+smalltalk.method({
+selector: 'visitVariableNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self._currentClass()._instVarNames()._includes_(aNode._value())._ifTrue_ifFalse_((function(){return self['@stream']._nextPutAll_(unescape("self%5B%27@").__comma(aNode._value()).__comma(unescape("%27%5D")));}),(function(){return self['@stream']._nextPutAll_(aNode._value());}));
+return self;},
+source: unescape('visitVariableNode%3A%20aNode%0A%09%28self%20currentClass%20instVarNames%20includes%3A%20aNode%20value%29%20%0A%09%20%20%20%20ifTrue%3A%20%5Bstream%20nextPutAll%3A%20%27self%5B%27%27@%27%2C%20aNode%20value%2C%20%27%27%27%5D%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5Bstream%20nextPutAll%3A%20aNode%20value%5D%0A')}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitJSStatementNode_',
+smalltalk.method({
+selector: 'visitJSStatementNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+self['@stream']._nextPutAll_(unescape("%28function%28%29%7B"));
+self['@stream']._nextPutAll_(aNode._source()._value()._replace_with_(unescape("%27%27"),unescape("%27")));
+self['@stream']._nextPutAll_(unescape("%7D%29%28%29"));
+return self;},
+source: unescape('visitJSStatementNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%28function%28%29%7B%27.%0A%09stream%20nextPutAll%3A%20%28aNode%20source%20value%20replace%3A%20%27%27%27%27%27%27%20with%3A%20%27%27%27%27%29.%0A%09stream%20nextPutAll%3A%20%27%7D%29%28%29%27%0A')}),
+smalltalk.Compiler);
+
+
+
+smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler');
+smalltalk.addMethod(
+'_doIt',
+smalltalk.method({
+selector: 'doIt',
+category: '',
+fn: function (){
+var self=this;
+return (function(){return smalltalk.Object._subclass_instanceVariableNames_category_("DoIt","","Compiler");})._value();
+return self;},
+source: unescape('doIt%20%5E%5BObject%20subclass%3A%20%23DoIt%0A%09instanceVariableNames%3A%20%27%27%0A%09category%3A%20%27Compiler%27%5D%20value')}),
+smalltalk.DoIt);
+
+
+
+

+ 1281 - 0
js/ide.js

@@ -0,0 +1,1281 @@
+smalltalk.addClass('TabManager', smalltalk.Widget, ['selectedTab', 'tabs', 'opened'], 'IDE');
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
+self['@opened']=true;
+(function($rec){$rec._append_(self);$rec._append_((function(html){return html._div()._id_("jtalk");}));return $rec._addClass_("jtalkBody");})("body"._asJQuery());
+(function($rec){$rec._addTab_(smalltalk.Transcript._current());return $rec._addTab_(smalltalk.Workspace._new());})(self);
+self._selectTab_(self._tabs()._last());
+(function($rec){$rec._onResize_((function(){return self._updateBodyMargin();}));return $rec._updatePositionOnWindowResize();})(self);
+return self;},
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20opened%20%3A%3D%20true.%0A%20%20%20%20%27body%27%20asJQuery%20%0A%09append%3A%20self%3B%0A%09append%3A%20%5B%3Ahtml%20%7C%20html%20div%20id%3A%20%27jtalk%27%5D%3B%0A%09addClass%3A%20%27jtalkBody%27.%0A%20%20%20%20self%20%0A%09addTab%3A%20Transcript%20current%3B%0A%09addTab%3A%20Workspace%20new.%0A%20%20%20%20self%20selectTab%3A%20self%20tabs%20last.%0A%20%20%20%20self%20%0A%09onResize%3A%20%5Bself%20updateBodyMargin%5D%3B%0A%09updatePositionOnWindowResize%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_tabs',
+smalltalk.method({
+selector: 'tabs',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@tabs']._ifNil_((function(){return self['@tabs']=smalltalk.Array._new();}));
+return self;},
+source: unescape('tabs%0A%20%20%20%20%5Etabs%20ifNil%3A%20%5Btabs%20%3A%3D%20Array%20new%5D%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_addTab_',
+smalltalk.method({
+selector: 'addTab:',
+category: 'adding/Removing',
+fn: function (aWidget){
+var self=this;
+self._tabs()._add_(aWidget);
+unescape("%23jtalk")._asJQuery()._append_(aWidget);
+aWidget._root()._asJQuery()._hide();
+return self;},
+source: unescape('addTab%3A%20aWidget%0A%20%20%20%20self%20tabs%20add%3A%20aWidget.%0A%20%20%20%20%27%23jtalk%27%20asJQuery%20append%3A%20aWidget.%0A%20%20%20%20aWidget%20root%20asJQuery%20hide%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_removeTab_',
+smalltalk.method({
+selector: 'removeTab:',
+category: 'adding/Removing',
+fn: function (aWidget){
+var self=this;
+self._tabs()._remove_(aWidget);
+self._update();
+return self;},
+source: unescape('removeTab%3A%20aWidget%0A%20%20%20%20self%20tabs%20remove%3A%20aWidget.%0A%20%20%20%20self%20update%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_updateBodyMargin',
+smalltalk.method({
+selector: 'updateBodyMargin',
+category: 'actions',
+fn: function (){
+var self=this;
+self._setBodyMargin_(unescape("%23jtalk")._asJQuery()._height().__plus((27)));
+return self;},
+source: unescape('updateBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%20%27%23jtalk%27%20asJQuery%20height%20+%2027%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_removeBodyMargin',
+smalltalk.method({
+selector: 'removeBodyMargin',
+category: 'actions',
+fn: function (){
+var self=this;
+self._setBodyMargin_((0));
+return self;},
+source: unescape('removeBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%200%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_setBodyMargin_',
+smalltalk.method({
+selector: 'setBodyMargin:',
+category: 'actions',
+fn: function (anInteger){
+var self=this;
+".jtalkBody"._asJQuery()._cssAt_put_(unescape("margin-bottom"),anInteger._asString().__comma("px"));
+return self;},
+source: unescape('setBodyMargin%3A%20anInteger%0A%20%20%20%20%27.jtalkBody%27%20asJQuery%20cssAt%3A%20%27margin-bottom%27%20put%3A%20anInteger%20asString%2C%20%27px%27%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_onResize_',
+smalltalk.method({
+selector: 'onResize:',
+category: 'actions',
+fn: function (aBlock){
+var self=this;
+(function(){jQuery('#jtalk').resizable({handles: 'n', stop: aBlock, minHeight: 230});})();
+return self;},
+source: unescape('onResize%3A%20aBlock%0A%20%20%20%20%7B%27jQuery%28%27%27%23jtalk%27%27%29.resizable%28%7Bhandles%3A%20%27%27n%27%27%2C%20stop%3A%20aBlock%2C%20minHeight%3A%20230%7D%29%3B%27%7D%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_updatePositionOnWindowResize',
+smalltalk.method({
+selector: 'updatePositionOnWindowResize',
+category: 'actions',
+fn: function (){
+var self=this;
+(function(){jQuery(window).resize(function(e){jQuery('#jtalk').css('top', '').css('bottom', '27px')});})();
+return self;},
+source: unescape('updatePositionOnWindowResize%0A%20%20%20%20%7B%27jQuery%28window%29.resize%28function%28e%29%7BjQuery%28%27%27%23jtalk%27%27%29.css%28%27%27top%27%27%2C%20%27%27%27%27%27%27%29.css%28%27%27bottom%27%27%2C%20%27%2727px%27%27%29%7D%29%3B%27%7D%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_open',
+smalltalk.method({
+selector: 'open',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@opened']._ifFalse_((function(){self._root()._asJQuery()._show();"body"._asJQuery()._addClass_("jtalkBody");unescape("%23jtalk")._asJQuery()._show();self._updateBodyMargin();self['@selectedTab']._root()._asJQuery()._show();return self['@opened']=true;}));
+return self;},
+source: unescape('open%0A%20%20%20%20opened%20ifFalse%3A%20%5B%0A%09self%20root%20asJQuery%20show.%0A%09%27body%27%20asJQuery%20addClass%3A%20%27jtalkBody%27.%0A%09%27%23jtalk%27%20asJQuery%20show.%0A%09self%20updateBodyMargin.%0A%09selectedTab%20root%20asJQuery%20show.%0A%09opened%20%3A%3D%20true%5D%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_close',
+smalltalk.method({
+selector: 'close',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@opened']._ifTrue_((function(){self._root()._asJQuery()._hide();unescape("%23jtalk")._asJQuery()._hide();self._removeBodyMargin();"body"._asJQuery()._removeClass_("jtalkBody");return self['@opened']=false;}));
+return self;},
+source: unescape('close%0A%20%20%20%20opened%20ifTrue%3A%20%5B%0A%09self%20root%20asJQuery%20hide.%0A%09%27%23jtalk%27%20asJQuery%20hide.%0A%09self%20removeBodyMargin.%0A%09%27body%27%20asJQuery%20removeClass%3A%20%27jtalkBody%27.%0A%09opened%20%3A%3D%20false%5D%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_newBrowserTab',
+smalltalk.method({
+selector: 'newBrowserTab',
+category: 'actions',
+fn: function (){
+var self=this;
+smalltalk.Browser._open();
+return self;},
+source: unescape('newBrowserTab%0A%20%20%20%20Browser%20open%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_selectTab_',
+smalltalk.method({
+selector: 'selectTab:',
+category: 'actions',
+fn: function (aWidget){
+var self=this;
+self._open();
+self['@selectedTab']=aWidget;
+self._tabs()._do_((function(each){return each._root()._asJQuery()._hide();}));
+aWidget._root()._asJQuery()._show();
+self._update();
+return self;},
+source: unescape('selectTab%3A%20aWidget%0A%20%20%20%20self%20open.%0A%20%20%20%20selectedTab%20%3A%3D%20aWidget.%0A%20%20%20%20self%20tabs%20do%3A%20%5B%3Aeach%20%7C%0A%09each%20root%20asJQuery%20hide%5D.%0A%20%20%20%20aWidget%20root%20asJQuery%20show.%0A%20%20%20%20self%20update%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_closeTab_',
+smalltalk.method({
+selector: 'closeTab:',
+category: 'actions',
+fn: function (aWidget){
+var self=this;
+self._removeTab_(aWidget);
+self._selectTab_(self._tabs()._last());
+aWidget._root()._asJQuery()._remove();
+self._update();
+return self;},
+source: unescape('closeTab%3A%20aWidget%0A%20%20%20%20self%20removeTab%3A%20aWidget.%0A%20%20%20%20self%20selectTab%3A%20self%20tabs%20last.%0A%20%20%20%20aWidget%20root%20asJQuery%20remove.%0A%20%20%20%20self%20update%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_renderOn_',
+smalltalk.method({
+selector: 'renderOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){$rec._id_("jtalkTabs");return $rec._with_((function(){(function($rec){$rec._class_("closeAll");$rec._with_("x");return $rec._onClick_((function(){return self._close();}));})(html._li());self._tabs()._do_((function(each){return self._renderTabFor_on_(each,html);}));return (function($rec){$rec._class_("newtab");$rec._with_(unescape("%20+%20"));return $rec._onClick_((function(){return self._newBrowserTab();}));})(html._li());}));})(html._ul());
+return self;},
+source: unescape('renderOn%3A%20html%0A%20%20%20%20html%20ul%0A%09id%3A%20%27jtalkTabs%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20html%20li%20%0A%09%09class%3A%20%27closeAll%27%3B%0A%09%09with%3A%20%27x%27%3B%0A%09%09onClick%3A%20%5Bself%20close%5D.%0A%09%20%20%20%20self%20tabs%20do%3A%20%5B%3Aeach%20%7C%0A%09%09self%20renderTabFor%3A%20each%20on%3A%20html%5D.%0A%09%20%20%20%20html%20li%0A%09%09class%3A%20%27newtab%27%3B%0A%09%09with%3A%20%27%20+%20%27%3B%0A%09%09onClick%3A%20%5Bself%20newBrowserTab%5D%5D%0A')}),
+smalltalk.TabManager);
+
+smalltalk.addMethod(
+'_renderTabFor_on_',
+smalltalk.method({
+selector: 'renderTabFor:on:',
+category: 'rendering',
+fn: function (aWidget, html){
+var self=this;
+var li=nil;
+li=html._li();
+self['@selectedTab'].__eq(aWidget)._ifTrue_((function(){return li._class_("selected");}));
+li._with_((function(){(function($rec){$rec._with_(aWidget._label());return $rec._onClick_((function(){return self._selectTab_(aWidget);}));})(html._span());return aWidget._canBeClosed()._ifTrue_((function(){return (function($rec){$rec._class_("close");$rec._with_("x");return $rec._onClick_((function(){return self._closeTab_(aWidget);}));})(html._span());}));}));
+return self;},
+source: unescape('renderTabFor%3A%20aWidget%20on%3A%20html%0A%20%20%20%20%7C%20li%20%7C%0A%20%20%20%20li%20%3A%3D%20html%20li.%0A%20%20%20%20selectedTab%20%3D%20aWidget%20ifTrue%3A%20%5B%0A%09li%20class%3A%20%27selected%27%5D.%0A%20%20%20%20li%20with%3A%20%5B%0A%09html%20span%0A%09%20%20%20%20with%3A%20aWidget%20label%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20aWidget%5D.%0A%09aWidget%20canBeClosed%20ifTrue%3A%20%5B%0A%09%20%20%20%20html%20span%20%0A%09%09class%3A%20%27close%27%3B%0A%09%09with%3A%20%27x%27%3B%0A%09%09onClick%3A%20%5Bself%20closeTab%3A%20aWidget%5D%5D%5D%0A')}),
+smalltalk.TabManager);
+
+
+smalltalk.TabManager.klass.iVarNames = ['current'];
+smalltalk.addMethod(
+'_current',
+smalltalk.method({
+selector: 'current',
+category: 'instance creation',
+fn: function (){
+var self=this;
+return self['@current']._ifNil_((function(){return self['@current']=self.klass.superclass.fn.prototype['_new'].apply(self, []);}));
+return self;},
+source: unescape('current%0A%20%20%20%20%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D%0A')}),
+smalltalk.TabManager.klass);
+
+smalltalk.addMethod(
+'_new',
+smalltalk.method({
+selector: 'new',
+category: 'instance creation',
+fn: function (){
+var self=this;
+self._shouldNotImplement();
+return self;},
+source: unescape('new%0A%20%20%20%20self%20shouldNotImplement%0A')}),
+smalltalk.TabManager.klass);
+
+
+smalltalk.addClass('TabWidget', smalltalk.Widget, [], 'IDE');
+smalltalk.addMethod(
+'_label',
+smalltalk.method({
+selector: 'label',
+category: 'accessing',
+fn: function (){
+var self=this;
+self._subclassResponsibility();
+return self;},
+source: unescape('label%0A%20%20%20%20self%20subclassResponsibility%0A')}),
+smalltalk.TabWidget);
+
+smalltalk.addMethod(
+'_open',
+smalltalk.method({
+selector: 'open',
+category: 'actions',
+fn: function (){
+var self=this;
+(function($rec){$rec._addTab_(self);return $rec._selectTab_(self);})(smalltalk.TabManager._current());
+return self;},
+source: unescape('open%0A%20%20%20%20TabManager%20current%0A%09addTab%3A%20self%3B%0A%09selectTab%3A%20self%0A')}),
+smalltalk.TabWidget);
+
+smalltalk.addMethod(
+'_canBeClosed',
+smalltalk.method({
+selector: 'canBeClosed',
+category: 'testing',
+fn: function (){
+var self=this;
+return false;
+return self;},
+source: unescape('canBeClosed%0A%20%20%20%20%5Efalse%0A')}),
+smalltalk.TabWidget);
+
+smalltalk.addMethod(
+'_renderOn_',
+smalltalk.method({
+selector: 'renderOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){$rec._class_("jtalkTool");return $rec._with_((function(){(function($rec){$rec._class_("jt_box");return $rec._with_((function(){return self._renderBoxOn_(html);}));})(html._div());return (function($rec){$rec._class_("jt_buttons");return $rec._with_((function(){return self._renderButtonsOn_(html);}));})(html._div());}));})(html._root());
+return self;},
+source: unescape('renderOn%3A%20html%0A%20%20%20%20html%20root%0A%09class%3A%20%27jtalkTool%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20html%20div%0A%09%09class%3A%20%27jt_box%27%3B%0A%09%09with%3A%20%5Bself%20renderBoxOn%3A%20html%5D.%0A%09%20%20%20%20html%20div%0A%09%09class%3A%20%27jt_buttons%27%3B%0A%09%09with%3A%20%5Bself%20renderButtonsOn%3A%20html%5D%5D%0A')}),
+smalltalk.TabWidget);
+
+smalltalk.addMethod(
+'_renderBoxOn_',
+smalltalk.method({
+selector: 'renderBoxOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+
+return self;},
+source: unescape('renderBoxOn%3A%20html%0A')}),
+smalltalk.TabWidget);
+
+smalltalk.addMethod(
+'_renderButtonsOn_',
+smalltalk.method({
+selector: 'renderButtonsOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+
+return self;},
+source: unescape('renderButtonsOn%3A%20html%0A')}),
+smalltalk.TabWidget);
+
+
+smalltalk.addMethod(
+'_open',
+smalltalk.method({
+selector: 'open',
+category: 'instance creation',
+fn: function (){
+var self=this;
+return self._new()._open();
+return self;},
+source: unescape('open%0A%20%20%20%20%5Eself%20new%20open%0A')}),
+smalltalk.TabWidget.klass);
+
+
+smalltalk.addClass('Workspace', smalltalk.TabWidget, ['textarea'], 'IDE');
+smalltalk.addMethod(
+'_label',
+smalltalk.method({
+selector: 'label',
+category: 'accessing',
+fn: function (){
+var self=this;
+return unescape("%5BWorkspace%5D");
+return self;},
+source: unescape('label%0A%20%20%20%20%5E%27%5BWorkspace%5D%27%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_selection',
+smalltalk.method({
+selector: 'selection',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return document.selection})();
+return self;},
+source: unescape('selection%0A%20%20%20%20%5E%7B%27return%20document.selection%27%7D%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_selectionStart',
+smalltalk.method({
+selector: 'selectionStart',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return jQuery('.workspace')[0].selectionStart})();
+return self;},
+source: unescape('selectionStart%0A%20%20%20%20%5E%7B%27return%20jQuery%28%27%27.workspace%27%27%29%5B0%5D.selectionStart%27%7D%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_selectionEnd',
+smalltalk.method({
+selector: 'selectionEnd',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return jQuery('.workspace')[0].selectionEnd})();
+return self;},
+source: unescape('selectionEnd%0A%20%20%20%20%5E%7B%27return%20jQuery%28%27%27.workspace%27%27%29%5B0%5D.selectionEnd%27%7D%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_selectionStart_',
+smalltalk.method({
+selector: 'selectionStart:',
+category: 'accessing',
+fn: function (anInteger){
+var self=this;
+(function(){jQuery('.workspace')[0].selectionStart = anInteger})();
+return self;},
+source: unescape('selectionStart%3A%20anInteger%0A%20%20%20%20%7B%27jQuery%28%27%27.workspace%27%27%29%5B0%5D.selectionStart%20%3D%20anInteger%27%7D%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_selectionEnd_',
+smalltalk.method({
+selector: 'selectionEnd:',
+category: 'accessing',
+fn: function (anInteger){
+var self=this;
+(function(){jQuery('.workspace')[0].selectionEnd = anInteger})();
+return self;},
+source: unescape('selectionEnd%3A%20anInteger%0A%20%20%20%20%7B%27jQuery%28%27%27.workspace%27%27%29%5B0%5D.selectionEnd%20%3D%20anInteger%27%7D%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_currentLine',
+smalltalk.method({
+selector: 'currentLine',
+category: 'accessing',
+fn: function (){
+var self=this;
+try{var lines=nil;
+var startLine=nil;
+var endLine=nil;
+lines=self['@textarea']._asJQuery()._val()._tokenize_(smalltalk.String._cr());
+startLine=endLine=(0);
+lines._do_((function(each){endLine=startLine.__plus(each._size());startLine=endLine.__plus((1));return endLine.__gt_eq(self._selectionStart())._ifTrue_((function(){self._selectionEnd_(endLine);return (function(){throw({name: 'stReturn', selector: '_currentLine', fn: function(){return each}})})();}));}));
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_currentLine'){return e.fn()} throw(e)}},
+source: unescape('currentLine%0A%20%20%20%20%7C%20lines%20startLine%20endLine%7C%0A%20%20%20%20lines%20%3A%3D%20textarea%20asJQuery%20val%20tokenize%3A%20String%20cr.%0A%20%20%20%20startLine%20%3A%3D%20endLine%20%3A%3D%200.%0A%20%20%20%20lines%20do%3A%20%5B%3Aeach%20%7C%0A%09endLine%20%3A%3D%20startLine%20+%20each%20size.%0A%09startLine%20%3A%3D%20endLine%20+%201.%0A%09endLine%20%3E%3D%20self%20selectionStart%20ifTrue%3A%20%5B%0A%09%20%20%20%20self%20selectionEnd%3A%20endLine.%0A%09%20%20%20%20%5Eeach%5D%5D%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_handleKeyDown_',
+smalltalk.method({
+selector: 'handleKeyDown:',
+category: 'actions',
+fn: function (anEvent){
+var self=this;
+return (function(){if(anEvent.ctrlKey) {
+		if(anEvent.keyCode === 68) { //ctrl+p
+			self._printIt();
+			return false;
+		}
+		if(anEvent.keyCode === 80) { //ctrl+d
+			self._doIt();
+			return false;
+		}
+	}})();
+return self;},
+source: unescape('handleKeyDown%3A%20anEvent%0A%20%20%20%20%5E%7B%27if%28anEvent.ctrlKey%29%20%7B%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2068%29%20%7B%20//ctrl+p%0A%09%09%09self._printIt%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2080%29%20%7B%20//ctrl+d%0A%09%09%09self._doIt%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%7D%27%7D%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_clearWorkspace',
+smalltalk.method({
+selector: 'clearWorkspace',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@textarea']._asJQuery()._val_("");
+return self;},
+source: unescape('clearWorkspace%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%27%27%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_doIt',
+smalltalk.method({
+selector: 'doIt',
+category: 'actions',
+fn: function (){
+var self=this;
+self._printIt();
+return self;},
+source: unescape('doIt%0A%20%20%20%20self%20printIt%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_printIt',
+smalltalk.method({
+selector: 'printIt',
+category: 'actions',
+fn: function (){
+var self=this;
+var selection=nil;
+self['@textarea']._asJQuery()._focus();
+self._selectionStart().__eq(self._selectionEnd())._ifTrue_ifFalse_((function(){return selection=self._currentLine();}),(function(){return selection=self['@textarea']._asJQuery()._val()._copyFrom_to_(self._selectionStart().__plus((1)),self._selectionEnd().__plus((1)));}));
+self._print_(self._eval_(selection)._printString());
+return self;},
+source: unescape('printIt%0A%20%20%20%20%7C%20selection%20%7C%0A%20%20%20%20textarea%20asJQuery%20focus.%0A%20%20%20%20self%20selectionStart%20%3D%20self%20selectionEnd%0A%09ifTrue%3A%20%5Bselection%20%3A%3D%20self%20currentLine%5D%0A%09ifFalse%3A%20%5B%0A%09%20%20%20%20selection%20%3A%3D%20textarea%20asJQuery%20val%20copyFrom%3A%20self%20selectionStart%20+%201%20to%3A%20self%20selectionEnd%20+%201%5D.%0A%20%20%20%20self%20print%3A%20%28self%20eval%3A%20selection%29%20printString%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_print_',
+smalltalk.method({
+selector: 'print:',
+category: 'actions',
+fn: function (aString){
+var self=this;
+var start=nil;
+start=self._selectionEnd();
+self['@textarea']._asJQuery()._val_(self['@textarea']._asJQuery()._val()._copyFrom_to_((1),start).__comma(" ").__comma(aString).__comma(" ").__comma(self['@textarea']._asJQuery()._val()._copyFrom_to_(start.__plus((1)),self['@textarea']._asJQuery()._val()._size())));
+self._selectionStart_(start);
+self._selectionEnd_(start.__plus(aString._size()).__plus((2)));
+return self;},
+source: unescape('print%3A%20aString%0A%20%20%20%20%7C%20start%20%7C%0A%20%20%20%20start%20%3A%3D%20self%20selectionEnd.%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%28%0A%09%28textarea%20asJQuery%20val%20copyFrom%3A%201%20to%3A%20start%29%2C%0A%09%27%20%27%2C%20aString%2C%20%27%20%27%2C%0A%09%28textarea%20asJQuery%20val%20copyFrom%3A%20start%20+%201%20to%3A%20textarea%20asJQuery%20val%20size%29%29.%0A%20%20%20%20self%20selectionStart%3A%20start.%0A%20%20%20%20self%20selectionEnd%3A%20start%20+%20aString%20size%20+%202%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_eval_',
+smalltalk.method({
+selector: 'eval:',
+category: 'actions',
+fn: function (aString){
+var self=this;
+return smalltalk.Compiler._new()._loadExpression_(aString);
+return self;},
+source: unescape('eval%3A%20aString%0A%20%20%20%20%5ECompiler%20new%20loadExpression%3A%20aString%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_renderBoxOn_',
+smalltalk.method({
+selector: 'renderBoxOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+self['@textarea']=html._textarea();
+self['@textarea']._asJQuery()._call_("tabby");
+self['@textarea']._onKeyDown_((function(e){return self._handleKeyDown_(e);}));
+(function($rec){$rec._class_("jt_workspace");return $rec._at_put_("spellcheck","false");})(self['@textarea']);
+return self;},
+source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20textarea%20%3A%3D%20html%20textarea.%0A%20%20%20%20textarea%20asJQuery%20call%3A%20%27tabby%27.%0A%20%20%20%20textarea%20onKeyDown%3A%20%5B%3Ae%20%7C%20self%20handleKeyDown%3A%20e%5D.%0A%20%20%20%20textarea%20%0A%09class%3A%20%27jt_workspace%27%3B%0A%09at%3A%20%27spellcheck%27%20put%3A%20%27false%27%0A')}),
+smalltalk.Workspace);
+
+smalltalk.addMethod(
+'_renderButtonsOn_',
+smalltalk.method({
+selector: 'renderButtonsOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){$rec._with_("DoIt");$rec._title_(unescape("ctrl+d"));return $rec._onClick_((function(){return self._doIt();}));})(html._button());
+(function($rec){$rec._with_("PrintIt");$rec._title_(unescape("ctrl+p"));return $rec._onClick_((function(){return self._printIt();}));})(html._button());
+(function($rec){$rec._with_("Clear workspace");return $rec._onClick_((function(){return self._clearWorkspace();}));})(html._button());
+return self;},
+source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27DoIt%27%3B%0A%09title%3A%20%27ctrl+d%27%3B%0A%09onClick%3A%20%5Bself%20doIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27PrintIt%27%3B%0A%09title%3A%20%27ctrl+p%27%3B%0A%09onClick%3A%20%5Bself%20printIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27Clear%20workspace%27%3B%0A%09onClick%3A%20%5Bself%20clearWorkspace%5D%0A')}),
+smalltalk.Workspace);
+
+
+
+smalltalk.addClass('Transcript', smalltalk.TabWidget, ['textarea'], 'IDE');
+smalltalk.addMethod(
+'_label',
+smalltalk.method({
+selector: 'label',
+category: 'accessing',
+fn: function (){
+var self=this;
+return unescape("%5BTranscript%5D");
+return self;},
+source: unescape('label%0A%20%20%20%20%5E%27%5BTranscript%5D%27%0A')}),
+smalltalk.Transcript);
+
+smalltalk.addMethod(
+'_show_',
+smalltalk.method({
+selector: 'show:',
+category: 'actions',
+fn: function (anObject){
+var self=this;
+self['@textarea']._asJQuery()._val_(self['@textarea']._asJQuery()._val().__comma(anObject._asString()));
+return self;},
+source: unescape('show%3A%20anObject%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20anObject%20asString.%0A%0A')}),
+smalltalk.Transcript);
+
+smalltalk.addMethod(
+'_cr',
+smalltalk.method({
+selector: 'cr',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@textarea']._asJQuery()._val_(self['@textarea']._asJQuery()._val().__comma(smalltalk.String._cr()));
+return self;},
+source: unescape('cr%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20String%20cr.%0A')}),
+smalltalk.Transcript);
+
+smalltalk.addMethod(
+'_clear',
+smalltalk.method({
+selector: 'clear',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@textarea']._asJQuery()._val_("");
+return self;},
+source: unescape('clear%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%27%27%0A')}),
+smalltalk.Transcript);
+
+smalltalk.addMethod(
+'_renderBoxOn_',
+smalltalk.method({
+selector: 'renderBoxOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+self['@textarea']=html._textarea();
+self['@textarea']._asJQuery()._call_("tabby");
+(function($rec){$rec._class_("jt_transcript");return $rec._at_put_("spellcheck","false");})(self['@textarea']);
+return self;},
+source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20textarea%20%3A%3D%20html%20textarea.%0A%20%20%20%20textarea%20asJQuery%20call%3A%20%27tabby%27.%0A%20%20%20%20textarea%20%0A%09class%3A%20%27jt_transcript%27%3B%0A%09at%3A%20%27spellcheck%27%20put%3A%20%27false%27%0A')}),
+smalltalk.Transcript);
+
+smalltalk.addMethod(
+'_renderButtonsOn_',
+smalltalk.method({
+selector: 'renderButtonsOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){$rec._with_("Clear transcript");return $rec._onClick_((function(){return self._clear();}));})(html._button());
+return self;},
+source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27Clear%20transcript%27%3B%0A%09onClick%3A%20%5Bself%20clear%5D%0A')}),
+smalltalk.Transcript);
+
+
+smalltalk.Transcript.klass.iVarNames = ['current'];
+smalltalk.addMethod(
+'_open',
+smalltalk.method({
+selector: 'open',
+category: 'instance creation',
+fn: function (){
+var self=this;
+self._current()._open();
+return self;},
+source: unescape('open%0A%20%20%20%20self%20current%20open%0A')}),
+smalltalk.Transcript.klass);
+
+smalltalk.addMethod(
+'_new',
+smalltalk.method({
+selector: 'new',
+category: 'instance creation',
+fn: function (){
+var self=this;
+self._shouldNotImplement();
+return self;},
+source: unescape('new%0A%20%20%20%20self%20shouldNotImplement%0A')}),
+smalltalk.Transcript.klass);
+
+smalltalk.addMethod(
+'_current',
+smalltalk.method({
+selector: 'current',
+category: 'instance creation',
+fn: function (){
+var self=this;
+return self['@current']._ifNil_((function(){return self['@current']=self.klass.superclass.fn.prototype['_new'].apply(self, []);}));
+return self;},
+source: unescape('current%0A%20%20%20%20%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D%0A')}),
+smalltalk.Transcript.klass);
+
+smalltalk.addMethod(
+'_show_',
+smalltalk.method({
+selector: 'show:',
+category: 'printing',
+fn: function (anObject){
+var self=this;
+self._current()._show_(anObject);
+return self;},
+source: unescape('show%3A%20anObject%0A%20%20%20%20self%20current%20show%3A%20anObject%0A')}),
+smalltalk.Transcript.klass);
+
+smalltalk.addMethod(
+'_cr',
+smalltalk.method({
+selector: 'cr',
+category: 'printing',
+fn: function (){
+var self=this;
+self._current()._show_(smalltalk.String._cr());
+return self;},
+source: unescape('cr%0A%20%20%20%20self%20current%20show%3A%20String%20cr%0A')}),
+smalltalk.Transcript.klass);
+
+smalltalk.addMethod(
+'_clear',
+smalltalk.method({
+selector: 'clear',
+category: 'printing',
+fn: function (){
+var self=this;
+self._current()._clear();
+return self;},
+source: unescape('clear%0A%20%20%20%20self%20current%20clear%0A')}),
+smalltalk.Transcript.klass);
+
+
+smalltalk.addClass('Browser', smalltalk.TabWidget, ['selectedCategory', 'selectedClass', 'selectedProtocol', 'selectedMethod', 'categoriesList', 'classesList', 'protocolsList', 'methodsList', 'sourceTextarea', 'tabsList', 'selectedTab', 'saveButton', 'classButtons', 'methodButtons'], 'IDE');
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
+self['@selectedTab']="instance";
+return self;},
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20selectedTab%20%3A%3D%20%23instance%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_label',
+smalltalk.method({
+selector: 'label',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@selectedClass']._ifNil_ifNotNil_((function(){return unescape("Browser%20%28nil%29");}),(function(){return self['@selectedClass']._name();}));
+return self;},
+source: unescape('label%0A%20%20%20%20%5EselectedClass%20%0A%09ifNil%3A%20%5B%27Browser%20%28nil%29%27%5D%0A%09ifNotNil%3A%20%5BselectedClass%20name%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_categories',
+smalltalk.method({
+selector: 'categories',
+category: 'accessing',
+fn: function (){
+var self=this;
+var categories=nil;
+categories=smalltalk.Array._new();
+smalltalk.Smalltalk._current()._classes()._do_((function(each){return categories._includes_(each._category())._ifFalse_((function(){return categories._add_(each._category());}));}));
+return categories._sort();
+return self;},
+source: unescape('categories%0A%20%20%20%20%7C%20categories%20%7C%0A%20%20%20%20categories%20%3A%3D%20Array%20new.%0A%20%20%20%20Smalltalk%20current%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%28categories%20includes%3A%20each%20category%29%20ifFalse%3A%20%5B%0A%09%20%20%20%20categories%20add%3A%20each%20category%5D%5D.%0A%20%20%20%20%5Ecategories%20sort%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_classes',
+smalltalk.method({
+selector: 'classes',
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.Smalltalk._current()._classes()._select_((function(each){return each._category().__eq(self['@selectedCategory']);}))._sort_((function(a, b){return a._name().__gt(b._name());}));
+return self;},
+source: unescape('classes%0A%20%20%20%20%5E%28Smalltalk%20current%20classes%20%0A%09select%3A%20%5B%3Aeach%20%7C%20each%20category%20%3D%20selectedCategory%5D%29%0A%09sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20name%20%3E%20b%20name%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_protocols',
+smalltalk.method({
+selector: 'protocols',
+category: 'accessing',
+fn: function (){
+var self=this;
+try{var class=nil;
+var protocols=nil;
+protocols=smalltalk.Array._new();
+self['@selectedClass']._ifNotNil_((function(){self['@selectedTab'].__eq("comment")._ifTrue_((function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();}));class=self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_((function(){return self['@selectedClass'];}),(function(){return self['@selectedClass']._class();}));class._methodDictionary()._isEmpty()._ifTrue_((function(){return protocols._add_("not yet classified");}));return class._methodDictionary()._do_((function(each){return protocols._includes_(each._category())._ifFalse_((function(){return protocols._add_(each._category());}));}));}));
+(function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return protocols._sort()}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_protocols'){return e.fn()} throw(e)}},
+source: unescape('protocols%0A%20%20%20%20%7C%20class%20protocols%20%7C%0A%20%20%20%20protocols%20%3A%3D%20Array%20new.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%5E%23%28%29%5D.%0A%09class%20%3A%3D%20selectedTab%20%3D%20%23instance%0A%09%20%20%20%20ifTrue%3A%20%5BselectedClass%5D%0A%09%20%20%20%20ifFalse%3A%20%5BselectedClass%20class%5D.%0A%09class%20methodDictionary%20isEmpty%20ifTrue%3A%20%5B%0A%09%20%20%20%20protocols%20add%3A%20%27not%20yet%20classified%27%5D.%0A%09class%20methodDictionary%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20%28protocols%20includes%3A%20each%20category%29%20ifFalse%3A%20%5B%0A%09%09protocols%20add%3A%20each%20category%5D%5D%5D.%0A%20%20%20%20%5Eprotocols%20sort%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_methods',
+smalltalk.method({
+selector: 'methods',
+category: 'accessing',
+fn: function (){
+var self=this;
+try{var class=nil;
+self['@selectedTab'].__eq("comment")._ifTrue_((function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();}));
+self['@selectedClass']._ifNotNil_((function(){return class=self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_((function(){return self['@selectedClass'];}),(function(){return self['@selectedClass']._class();}));}));
+(function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return self['@selectedProtocol']._ifNil_ifNotNil_((function(){return class._ifNil_ifNotNil_((function(){return [];}),(function(){return class._methodDictionary()._values();}));}),(function(){return class._methodDictionary()._values()._select_((function(each){return each._category().__eq(self['@selectedProtocol']);}));}))._sort_((function(a, b){return a._selector().__gt(b._selector());}))}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_methods'){return e.fn()} throw(e)}},
+source: unescape('methods%0A%20%20%20%20%7C%20class%20%7C%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%5E%23%28%29%5D.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09class%20%3A%3D%20selectedTab%20%3D%20%23instance%0A%09%20%20%20%20ifTrue%3A%20%5BselectedClass%5D%0A%09%20%20%20%20ifFalse%3A%20%5BselectedClass%20class%5D%5D.%0A%20%20%20%20%5E%28selectedProtocol%20%0A%09ifNil%3A%20%5B%0A%09%20%20%20%20class%20%0A%09%09ifNil%3A%20%5B%23%28%29%5D%20%0A%09%09ifNotNil%3A%20%5Bclass%20methodDictionary%20values%5D%5D%0A%09ifNotNil%3A%20%5B%0A%09%20%20%20%20class%20methodDictionary%20values%20select%3A%20%5B%3Aeach%20%7C%0A%09%09each%20category%20%3D%20selectedProtocol%5D%5D%29%20sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20selector%20%3E%20b%20selector%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_source',
+smalltalk.method({
+selector: 'source',
+category: 'accessing',
+fn: function (){
+var self=this;
+try{self['@selectedTab'].__eq("comment")._ifFalse_((function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return self['@selectedProtocol']._notNil()._or_((function(){return self['@selectedMethod']._notNil();}))._ifFalse_ifTrue_((function(){return self._declarationSource();}),(function(){return self._methodSource();}))}})})();}));
+(function(){throw({name: 'stReturn', selector: '_source', fn: function(){return self['@selectedClass']._ifNil_ifNotNil_((function(){return "";}),(function(){return self._classCommentSource();}))}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '_source'){return e.fn()} throw(e)}},
+source: unescape('source%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifFalse%3A%20%5B%0A%09%5E%28selectedProtocol%20notNil%20or%3A%20%5BselectedMethod%20notNil%5D%29%0A%09%20%20%20%20ifFalse%3A%20%5Bself%20declarationSource%5D%0A%09%20%20%20%20ifTrue%3A%20%5Bself%20methodSource%5D%5D.%0A%20%20%20%20%5EselectedClass%0A%09ifNil%3A%20%5B%27%27%5D%0A%09ifNotNil%3A%20%5Bself%20classCommentSource%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_methodSource',
+smalltalk.method({
+selector: 'methodSource',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@selectedMethod']._ifNil_ifNotNil_((function(){return self._dummyMethodSource();}),(function(){return self['@selectedMethod']._source();}));
+return self;},
+source: unescape('methodSource%0A%20%20%20%20%5EselectedMethod%0A%09ifNil%3A%20%5Bself%20dummyMethodSource%5D%0A%09ifNotNil%3A%20%5BselectedMethod%20source%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_dummyMethodSource',
+smalltalk.method({
+selector: 'dummyMethodSource',
+category: 'accessing',
+fn: function (){
+var self=this;
+return unescape("messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements");
+return self;},
+source: unescape('dummyMethodSource%0A%20%20%20%20%5E%27messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements%27%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_declarationSource',
+smalltalk.method({
+selector: 'declarationSource',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_((function(){return self._classDeclarationSource();}),(function(){return self._metaclassDeclarationSource();}));
+return self;},
+source: unescape('declarationSource%0A%20%20%20%20%5EselectedTab%20%3D%20%23instance%0A%09ifTrue%3A%20%5Bself%20classDeclarationSource%5D%0A%09ifFalse%3A%20%5Bself%20metaclassDeclarationSource%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_classDeclarationSource',
+smalltalk.method({
+selector: 'classDeclarationSource',
+category: 'accessing',
+fn: function (){
+var self=this;
+var stream=nil;
+stream=""._writeStream();
+self['@selectedClass']._ifNotNil_((function(){(function($rec){$rec._nextPutAll_(self['@selectedClass']._superclass()._asString());$rec._nextPutAll_(unescape("%20subclass%3A%20%23"));$rec._nextPutAll_(self['@selectedClass']._name());$rec._nextPutAll_(smalltalk.String._cr().__comma(smalltalk.String._tab()));return $rec._nextPutAll_(unescape("instanceVariableNames%3A%20%27"));})(stream);self['@selectedClass']._instanceVariableNames()._do_separatedBy_((function(each){return stream._nextPutAll_(each);}),(function(){return stream._nextPutAll_(" ");}));return (function($rec){$rec._nextPutAll_(unescape("%27").__comma(smalltalk.String._cr()).__comma(smalltalk.String._tab()));$rec._nextPutAll_(unescape("category%3A%20%27"));$rec._nextPutAll_(self['@selectedClass']._category());return $rec._nextPutAll_(unescape("%27"));})(stream);}));
+return stream._contents();
+return self;},
+source: unescape('classDeclarationSource%0A%20%20%20%20%7C%20stream%20%7C%0A%20%20%20%20stream%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20superclass%20asString%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%20subclass%3A%20%23%27%3B%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20name%3B%0A%09%20%20%20%20nextPutAll%3A%20String%20cr%2C%20String%20tab%3B%0A%09%20%20%20%20nextPutAll%3A%20%27instanceVariableNames%3A%20%27%27%27.%0A%09selectedClass%20instanceVariableNames%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%5D%20%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%20%27%5D.%0A%09stream%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20String%20cr%2C%20String%20tab%3B%0A%09%20%20%20%20nextPutAll%3A%20%27category%3A%20%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20category%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%5D.%0A%20%20%20%20%5Estream%20contents%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_metaclassDeclarationSource',
+smalltalk.method({
+selector: 'metaclassDeclarationSource',
+category: 'accessing',
+fn: function (){
+var self=this;
+var stream=nil;
+stream=""._writeStream();
+self['@selectedClass']._ifNotNil_((function(){(function($rec){$rec._nextPutAll_(self['@selectedClass']._asString());$rec._nextPutAll_(" class ");return $rec._nextPutAll_(unescape("instanceVariableNames%3A%20%27"));})(stream);self['@selectedClass']._class()._instanceVariableNames()._do_separatedBy_((function(each){return stream._nextPutAll_(each);}),(function(){return stream._nextPutAll_(" ");}));return stream._nextPutAll_(unescape("%27"));}));
+return stream._contents();
+return self;},
+source: unescape('metaclassDeclarationSource%0A%20%20%20%20%7C%20stream%20%7C%0A%20%20%20%20stream%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20asString%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%20class%20%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27instanceVariableNames%3A%20%27%27%27.%0A%09selectedClass%20class%20instanceVariableNames%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%20%27%5D.%0A%09stream%20nextPutAll%3A%20%27%27%27%27%5D.%0A%20%20%20%20%5Estream%20contents%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_classCommentSource',
+smalltalk.method({
+selector: 'classCommentSource',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@selectedClass']._comment();
+return self;},
+source: unescape('classCommentSource%0A%20%20%20%20%5EselectedClass%20comment%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_enableSaveButton',
+smalltalk.method({
+selector: 'enableSaveButton',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@saveButton']._removeAt_("disabled");
+return self;},
+source: unescape('enableSaveButton%0A%20%20%20%20saveButton%20removeAt%3A%20%27disabled%27%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_disableSaveButton',
+smalltalk.method({
+selector: 'disableSaveButton',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@saveButton']._ifNotNil_((function(){return self['@saveButton']._at_put_("disabled",true);}));
+return self;},
+source: unescape('disableSaveButton%0A%20%20%20%20saveButton%20ifNotNil%3A%20%5B%0A%09saveButton%20at%3A%20%27disabled%27%20put%3A%20true%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_hideClassButtons',
+smalltalk.method({
+selector: 'hideClassButtons',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@classButtons']._asJQuery()._hide();
+return self;},
+source: unescape('hideClassButtons%0A%20%20%20%20classButtons%20asJQuery%20hide%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_showClassButtons',
+smalltalk.method({
+selector: 'showClassButtons',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@classButtons']._asJQuery()._show();
+return self;},
+source: unescape('showClassButtons%0A%20%20%20%20classButtons%20asJQuery%20show%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_hideMethodButtons',
+smalltalk.method({
+selector: 'hideMethodButtons',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@methodButtons']._asJQuery()._hide();
+return self;},
+source: unescape('hideMethodButtons%0A%20%20%20%20methodButtons%20asJQuery%20hide%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_showMethodButtons',
+smalltalk.method({
+selector: 'showMethodButtons',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@methodButtons']._asJQuery()._show();
+return self;},
+source: unescape('showMethodButtons%0A%20%20%20%20methodButtons%20asJQuery%20show%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_compile',
+smalltalk.method({
+selector: 'compile',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@selectedTab'].__eq("comment")._ifTrue_((function(){return self['@selectedClass']._ifNotNil_((function(){return self._compileClassComment();}));}));
+self['@selectedProtocol']._notNil()._or_((function(){return self['@selectedMethod']._notNil();}))._ifFalse_ifTrue_((function(){return self._compileDefinition();}),(function(){return self._compileMethodDefinition();}));
+self._disableSaveButton();
+return self;},
+source: unescape('compile%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%0A%09selectedClass%20ifNotNil%3A%20%5B%0A%09%20%20%20%20self%20compileClassComment%5D%5D.%0A%20%20%20%20%28selectedProtocol%20notNil%20or%3A%20%5BselectedMethod%20notNil%5D%29%0A%09ifFalse%3A%20%5Bself%20compileDefinition%5D%0A%09ifTrue%3A%20%5Bself%20compileMethodDefinition%5D.%0A%20%20%20%20self%20disableSaveButton%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_compileClassComment',
+smalltalk.method({
+selector: 'compileClassComment',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@selectedClass']._comment_(self['@sourceTextarea']._asJQuery()._val());
+return self;},
+source: unescape('compileClassComment%0A%20%20%20%20selectedClass%20comment%3A%20sourceTextarea%20asJQuery%20val%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_compileMethodDefinition',
+smalltalk.method({
+selector: 'compileMethodDefinition',
+category: 'actions',
+fn: function (){
+var self=this;
+self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_((function(){return self._compileMethodDefinitionFor_(self['@selectedClass']);}),(function(){return self._compileMethodDefinitionFor_(self['@selectedClass']._class());}));
+return self;},
+source: unescape('compileMethodDefinition%0A%20%20%20%20selectedTab%20%3D%20%23instance%0A%09ifTrue%3A%20%5Bself%20compileMethodDefinitionFor%3A%20selectedClass%5D%0A%09ifFalse%3A%20%5Bself%20compileMethodDefinitionFor%3A%20selectedClass%20class%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_compileMethodDefinitionFor_',
+smalltalk.method({
+selector: 'compileMethodDefinitionFor:',
+category: 'actions',
+fn: function (aClass){
+var self=this;
+var method=nil;
+method=smalltalk.Compiler._new()._load_forClass_(self['@sourceTextarea']._asJQuery()._val(),self['@selectedClass']);
+method._category_(self['@selectedProtocol']);
+aClass._addCompiledMethod_(method);
+self._updateMethodsList();
+self._selectMethod_(method);
+return self;},
+source: unescape('compileMethodDefinitionFor%3A%20aClass%0A%20%20%20%20%7C%20method%20%7C%0A%20%20%20%20method%20%3A%3D%20Compiler%20new%20load%3A%20sourceTextarea%20asJQuery%20val%20forClass%3A%20selectedClass.%0A%20%20%20%20method%20category%3A%20selectedProtocol.%0A%20%20%20%20aClass%20addCompiledMethod%3A%20method.%0A%20%20%20%20self%20updateMethodsList.%0A%20%20%20%20self%20selectMethod%3A%20method%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_compileDefinition',
+smalltalk.method({
+selector: 'compileDefinition',
+category: 'actions',
+fn: function (){
+var self=this;
+var newClass=nil;
+newClass=smalltalk.Compiler._new()._loadExpression_(self['@sourceTextarea']._asJQuery()._val());
+(function($rec){$rec._updateCategoriesList();return $rec._updateClassesList();})(self);
+return self;},
+source: unescape('compileDefinition%0A%20%20%20%20%7C%20newClass%20%7C%0A%20%20%20%20newClass%20%3A%3D%20Compiler%20new%20loadExpression%3A%20sourceTextarea%20asJQuery%20val.%0A%20%20%20%20self%20%0A%09updateCategoriesList%3B%0A%09updateClassesList%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_removeClass',
+smalltalk.method({
+selector: 'removeClass',
+category: 'actions',
+fn: function (){
+var self=this;
+self._confirm_("Do you really want to remove ".__comma(self['@selectedClass']._name()).__comma(unescape("%3F")))._ifTrue_((function(){smalltalk.Smalltalk._current()._basicDelete_(self['@selectedClass']._name());return self._selectClass_(nil);}));
+return self;},
+source: unescape('removeClass%0A%20%20%20%20%28self%20confirm%3A%20%27Do%20you%20really%20want%20to%20remove%20%27%2C%20selectedClass%20name%2C%20%27%3F%27%29%0A%09ifTrue%3A%20%5B%0A%09%20%20%20%20Smalltalk%20current%20basicDelete%3A%20selectedClass%20name.%0A%09%20%20%20%20self%20selectClass%3A%20nil%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_removeMethod',
+smalltalk.method({
+selector: 'removeMethod',
+category: 'actions',
+fn: function (){
+var self=this;
+self._confirm_(unescape("Do%20you%20really%20want%20to%20remove%20%23").__comma(self['@selectedMethod']._selector()).__comma(unescape("%3F")))._ifTrue_((function(){self['@selectedClass']._removeCompiledMethod_(self['@selectedMethod']);return self._selectMethod_(nil);}));
+return self;},
+source: unescape('removeMethod%0A%20%20%20%20%28self%20confirm%3A%20%27Do%20you%20really%20want%20to%20remove%20%23%27%2C%20selectedMethod%20selector%2C%20%27%3F%27%29%0A%09ifTrue%3A%20%5B%0A%09%20%20%20%20selectedClass%20removeCompiledMethod%3A%20selectedMethod.%0A%09%20%20%20%20self%20selectMethod%3A%20nil%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_selectCategory_',
+smalltalk.method({
+selector: 'selectCategory:',
+category: 'actions',
+fn: function (aCategory){
+var self=this;
+self['@selectedCategory']=aCategory;
+self['@selectedClass']=self['@selectedProtocol']=self['@selectedMethod']=nil;
+(function($rec){$rec._updateCategoriesList();$rec._updateClassesList();$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();})(self);
+return self;},
+source: unescape('selectCategory%3A%20aCategory%0A%20%20%20%20selectedCategory%20%3A%3D%20aCategory.%0A%20%20%20%20selectedClass%20%3A%3D%20selectedProtocol%20%3A%3D%20selectedMethod%20%3A%3D%20%20nil.%0A%20%20%20%20self%20%0A%09updateCategoriesList%3B%0A%09updateClassesList%3B%0A%09updateProtocolsList%3B%0A%09updateMethodsList%3B%0A%09updateSourceAndButtons%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_selectClass_',
+smalltalk.method({
+selector: 'selectClass:',
+category: 'actions',
+fn: function (aClass){
+var self=this;
+self['@selectedClass']=aClass;
+self['@selectedProtocol']=self['@selectedMethod']=nil;
+(function($rec){$rec._updateClassesList();$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();})(self);
+return self;},
+source: unescape('selectClass%3A%20aClass%0A%20%20%20%20selectedClass%20%3A%3D%20aClass.%0A%20%20%20%20selectedProtocol%20%3A%3D%20selectedMethod%20%3A%3D%20nil.%0A%20%20%20%20self%20%0A%09updateClassesList%3B%0A%09updateProtocolsList%3B%0A%09updateMethodsList%3B%0A%09updateSourceAndButtons%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_selectProtocol_',
+smalltalk.method({
+selector: 'selectProtocol:',
+category: 'actions',
+fn: function (aString){
+var self=this;
+self['@selectedProtocol']=aString;
+self['@selectedMethod']=nil;
+(function($rec){$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();})(self);
+return self;},
+source: unescape('selectProtocol%3A%20aString%0A%20%20%20%20selectedProtocol%20%3A%3D%20aString.%0A%20%20%20%20selectedMethod%20%3A%3D%20nil.%0A%20%20%20%20self%20%0A%09updateProtocolsList%3B%0A%09updateMethodsList%3B%0A%09updateSourceAndButtons%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_selectMethod_',
+smalltalk.method({
+selector: 'selectMethod:',
+category: 'actions',
+fn: function (aMethod){
+var self=this;
+self['@selectedMethod']=aMethod;
+(function($rec){$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();})(self);
+return self;},
+source: unescape('selectMethod%3A%20aMethod%0A%20%20%20%20selectedMethod%20%3A%3D%20aMethod.%0A%20%20%20%20self%20%0A%09updateProtocolsList%3B%0A%09updateMethodsList%3B%0A%09updateSourceAndButtons%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_selectTab_',
+smalltalk.method({
+selector: 'selectTab:',
+category: 'actions',
+fn: function (aString){
+var self=this;
+self['@selectedTab']=aString;
+self._selectProtocol_(nil);
+self._updateTabsList();
+return self;},
+source: unescape('selectTab%3A%20aString%0A%20%20%20%20selectedTab%20%3A%3D%20aString.%0A%20%20%20%20self%20selectProtocol%3A%20nil.%0A%20%20%20%20self%20updateTabsList.%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_renderBoxOn_',
+smalltalk.method({
+selector: 'renderBoxOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){$rec._renderTopPanelOn_(html);$rec._renderTabsOn_(html);return $rec._renderBottomPanelOn_(html);})(self);
+return self;},
+source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20self%20%0A%09renderTopPanelOn%3A%20html%3B%0A%09renderTabsOn%3A%20html%3B%0A%09renderBottomPanelOn%3A%20html%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_renderTopPanelOn_',
+smalltalk.method({
+selector: 'renderTopPanelOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){$rec._class_("top");return $rec._with_((function(){self['@categoriesList']=html._ul()._class_("jt_column categories");self['@classesList']=html._ul()._class_("jt_column classes");self['@protocolsList']=html._ul()._class_("jt_column protocols");self['@methodsList']=html._ul()._class_("jt_column methods");(function($rec){$rec._updateCategoriesList();$rec._updateClassesList();$rec._updateProtocolsList();return $rec._updateMethodsList();})(self);return html._div()._class_("jt_clear");}));})(html._div());
+return self;},
+source: unescape('renderTopPanelOn%3A%20html%0A%20%20%20%20html%20div%20%0A%09class%3A%20%27top%27%3B%20%0A%09with%3A%20%5B%0A%09%20%20%20%20categoriesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20categories%27.%0A%09%20%20%20%20classesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20classes%27.%0A%09%20%20%20%20protocolsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20protocols%27.%0A%09%20%20%20%20methodsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20methods%27.%0A%09%20%20%20%20self%0A%09%09updateCategoriesList%3B%0A%09%09updateClassesList%3B%0A%09%09updateProtocolsList%3B%0A%09%09updateMethodsList.%0A%09%20%20%20%20html%20div%20class%3A%20%27jt_clear%27%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_renderTabsOn_',
+smalltalk.method({
+selector: 'renderTabsOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+self['@tabsList']=html._ul()._class_("jt_tabs");
+self._updateTabsList();
+return self;},
+source: unescape('renderTabsOn%3A%20html%0A%20%20%20%20tabsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_tabs%27.%0A%20%20%20%20self%20updateTabsList.%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_renderBottomPanelOn_',
+smalltalk.method({
+selector: 'renderBottomPanelOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){$rec._class_("jt_sourceCode");return $rec._with_((function(){self['@sourceTextarea']=(function($rec){$rec._onKeyPress_((function(){return self._enableSaveButton();}));$rec._class_("source");return $rec._at_put_("spellcheck","false");})(html._textarea());return self['@sourceTextarea']._asJQuery()._call_("tabby");}));})(html._div());
+return self;},
+source: unescape('renderBottomPanelOn%3A%20html%0A%20%20%20%20html%20div%0A%09class%3A%20%27jt_sourceCode%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20sourceTextarea%20%3A%3D%20html%20textarea%20%0A%09%09onKeyPress%3A%20%5Bself%20enableSaveButton%5D%3B%0A%09%09class%3A%20%27source%27%3B%0A%09%09at%3A%20%27spellcheck%27%20put%3A%20%27false%27.%0A%09%20%20%20%20sourceTextarea%20asJQuery%20call%3A%20%27tabby%27%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_renderButtonsOn_',
+smalltalk.method({
+selector: 'renderButtonsOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+self['@saveButton']=html._button();
+(function($rec){$rec._with_("Save");return $rec._onClick_((function(){return self._compile();}));})(self['@saveButton']);
+self['@methodButtons']=html._span()._with_((function(){return (function($rec){$rec._with_("Remove method");return $rec._onClick_((function(){return self._removeMethod();}));})(html._button());}));
+self['@classButtons']=html._span()._with_((function(){return (function($rec){$rec._with_("Remove class");return $rec._onClick_((function(){return self._removeClass();}));})(html._button());}));
+self._updateSourceAndButtons();
+return self;},
+source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20saveButton%20%3A%3D%20html%20button.%0A%20%20%20%20saveButton%20%0A%09with%3A%20%27Save%27%3B%0A%09onClick%3A%20%5Bself%20compile%5D.%0A%20%20%20%20methodButtons%20%3A%3D%20html%20span%20with%3A%20%5B%0A%09html%20button%0A%09%20%20%20%20with%3A%20%27Remove%20method%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20removeMethod%5D%5D.%0A%20%20%20%20classButtons%20%3A%3D%20html%20span%20with%3A%20%5B%0A%09html%20button%0A%09%20%20%20%20with%3A%20%27Remove%20class%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20removeClass%5D%5D.%0A%20%20%20%20self%20updateSourceAndButtons%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_updateCategoriesList',
+smalltalk.method({
+selector: 'updateCategoriesList',
+category: 'updating',
+fn: function (){
+var self=this;
+self['@categoriesList']._contents_((function(html){return self._categories()._do_((function(each){var li=nil;
+li=html._li();self['@selectedCategory'].__eq(each)._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_(each);return $rec._onClick_((function(){return self._selectCategory_(each);}));})(li);}));}));
+return self;},
+source: unescape('updateCategoriesList%0A%20%20%20%20categoriesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20categories%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedCategory%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%0A%09%09with%3A%20each%3B%0A%09%09onClick%3A%20%5Bself%20selectCategory%3A%20each%5D%5D%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_updateClassesList',
+smalltalk.method({
+selector: 'updateClassesList',
+category: 'updating',
+fn: function (){
+var self=this;
+smalltalk.TabManager._current()._update();
+self['@classesList']._contents_((function(html){return self._classes()._do_((function(each){var li=nil;
+li=html._li();self['@selectedClass'].__eq(each)._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_(each._name());return $rec._onClick_((function(){return self._selectClass_(each);}));})(li);}));}));
+return self;},
+source: unescape('updateClassesList%0A%20%20%20%20TabManager%20current%20update.%0A%20%20%20%20classesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20classes%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedClass%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%0A%09%09with%3A%20each%20name%3B%0A%09%09onClick%3A%20%5Bself%20selectClass%3A%20each%5D%5D%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_updateProtocolsList',
+smalltalk.method({
+selector: 'updateProtocolsList',
+category: 'updating',
+fn: function (){
+var self=this;
+self['@protocolsList']._contents_((function(html){return self._protocols()._do_((function(each){var li=nil;
+li=html._li();self['@selectedProtocol'].__eq(each)._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_(each);return $rec._onClick_((function(){return self._selectProtocol_(each);}));})(li);}));}));
+return self;},
+source: unescape('updateProtocolsList%0A%20%20%20%20protocolsList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20protocols%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedProtocol%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%20%0A%09%09with%3A%20each%3B%0A%09%09onClick%3A%20%5Bself%20selectProtocol%3A%20each%5D%5D%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_updateMethodsList',
+smalltalk.method({
+selector: 'updateMethodsList',
+category: 'updating',
+fn: function (){
+var self=this;
+self['@methodsList']._contents_((function(html){return self._methods()._do_((function(each){var li=nil;
+li=html._li();self['@selectedMethod'].__eq(each)._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_(each._selector());return $rec._onClick_((function(){return self._selectMethod_(each);}));})(li);}));}));
+return self;},
+source: unescape('updateMethodsList%0A%20%20%20%20methodsList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20methods%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedMethod%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%0A%09%09with%3A%20each%20selector%3B%0A%09%09onClick%3A%20%5Bself%20selectMethod%3A%20each%5D%5D%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_updateTabsList',
+smalltalk.method({
+selector: 'updateTabsList',
+category: 'updating',
+fn: function (){
+var self=this;
+self['@tabsList']._contents_((function(html){var li=nil;
+li=html._li();self['@selectedTab'].__eq("instance")._ifTrue_((function(){return li._class_("selected");}));(function($rec){$rec._with_("Instance");return $rec._onClick_((function(){return self._selectTab_("instance");}));})(li);li=html._li();self['@selectedTab'].__eq("class")._ifTrue_((function(){return li._class_("selected");}));(function($rec){$rec._with_("Class");return $rec._onClick_((function(){return self._selectTab_("class");}));})(li);li=html._li();self['@selectedTab'].__eq("comment")._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_("Comment");return $rec._onClick_((function(){return self._selectTab_("comment");}));})(li);}));
+return self;},
+source: unescape('updateTabsList%0A%20%20%20%20tabsList%20contents%3A%20%5B%3Ahtml%20%7C%7C%20li%20%7C%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23instance%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%27Instance%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23instance%5D.%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23class%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%27Class%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23class%5D.%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%27Comment%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23comment%5D%5D%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_updateSourceAndButtons',
+smalltalk.method({
+selector: 'updateSourceAndButtons',
+category: 'updating',
+fn: function (){
+var self=this;
+self._disableSaveButton();
+self['@selectedMethod']._ifNil_ifNotNil_((function(){self._hideMethodButtons();return self['@selectedClass']._ifNil_ifNotNil_((function(){return self._hideClassButtons();}),(function(){return self._showClassButtons();}));}),(function(){self._hideClassButtons();return self._showMethodButtons();}));
+self['@sourceTextarea']._asJQuery()._val_(self._source());
+return self;},
+source: unescape('updateSourceAndButtons%0A%20%20%20%20self%20disableSaveButton.%0A%20%20%20%20selectedMethod%20%0A%09ifNil%3A%20%5B%0A%09%20%20%20%20self%20hideMethodButtons.%0A%09%20%20%20%20selectedClass%20%0A%09%09ifNil%3A%20%5Bself%20hideClassButtons%5D%0A%09%20%20%20%20ifNotNil%3A%20%5Bself%20showClassButtons%5D%5D%0A%09ifNotNil%3A%20%5B%0A%09%20%20%20%20self%20hideClassButtons.%0A%09%20%20%20%20self%20showMethodButtons%5D.%0A%20%20%20%20sourceTextarea%20asJQuery%20val%3A%20self%20source%0A')}),
+smalltalk.Browser);
+
+smalltalk.addMethod(
+'_canBeClosed',
+smalltalk.method({
+selector: 'canBeClosed',
+category: 'testing',
+fn: function (){
+var self=this;
+return true;
+return self;},
+source: unescape('canBeClosed%0A%20%20%20%20%5Etrue%0A')}),
+smalltalk.Browser);
+
+
+smalltalk.addMethod(
+'_openOn_',
+smalltalk.method({
+selector: 'openOn:',
+category: 'convenience',
+fn: function (aClass){
+var self=this;
+(function($rec){$rec._open();$rec._selectCategory_(aClass._category());return $rec._selectClass_(aClass);})(self._new());
+return self;},
+source: unescape('openOn%3A%20aClass%0A%20%20%20%20self%20new%0A%09open%3B%0A%09selectCategory%3A%20aClass%20category%3B%0A%09selectClass%3A%20aClass%0A')}),
+smalltalk.Browser.klass);
+
+smalltalk.addMethod(
+'_open',
+smalltalk.method({
+selector: 'open',
+category: 'convenience',
+fn: function (){
+var self=this;
+self._new()._open();
+return self;},
+source: unescape('open%0A%20%20%20%20self%20new%20open%0A')}),
+smalltalk.Browser.klass);
+
+
+

+ 1 - 0
js/init.js

@@ -0,0 +1 @@
+smalltalk.init(smalltalk.Object);

+ 511 - 0
js/jQuery.js

@@ -0,0 +1,511 @@
+smalltalk.addClass('JQuery', smalltalk.Object, ['jquery'], 'JQuery');
+smalltalk.addMethod(
+'_removeAttribute_',
+smalltalk.method({
+selector: 'removeAttribute:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+return self._call_withArgument_("removeAttribute",aString);
+return self;},
+source: unescape('removeAttribute%3A%20aString%0A%20%20%20%20%22Remove%20an%20attribute%20from%20each%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27removeAttribute%27%20withArgument%3A%20aString%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_attr_',
+smalltalk.method({
+selector: 'attr:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+return self._call_withArgument_("attr",aString);
+return self;},
+source: unescape('attr%3A%20aString%0A%20%20%20%20%22Get%20the%20value%20of%20an%20attribute%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27attr%27%20withArgument%3A%20aString%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_val',
+smalltalk.method({
+selector: 'val',
+category: 'attributes',
+fn: function (){
+var self=this;
+return self._call_("val");
+return self;},
+source: unescape('val%0A%20%20%20%20%22Get%20the%20current%20value%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27val%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_val_',
+smalltalk.method({
+selector: 'val:',
+category: 'attributes',
+fn: function (aString){
+var self=this;
+self._call_withArgument_("val",aString);
+return self;},
+source: unescape('val%3A%20aString%0A%20%20%20%20self%20call%3A%20%27val%27%20withArgument%3A%20aString%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_cssAt_',
+smalltalk.method({
+selector: 'cssAt:',
+category: 'css',
+fn: function (aString){
+var self=this;
+return (function(){return self['@jquery'].css(aString)})();
+return self;},
+source: unescape('cssAt%3A%20aString%0A%20%20%20%20%5E%7B%27return%20self%5B%27%27@jquery%27%27%5D.css%28aString%29%27%7D%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_cssAt_put_',
+smalltalk.method({
+selector: 'cssAt:put:',
+category: 'css',
+fn: function (aString, anotherString){
+var self=this;
+(function(){self['@jquery'].css(aString, anotherString)})();
+return self;},
+source: unescape('cssAt%3A%20aString%20put%3A%20anotherString%0A%20%20%20%20%7B%27self%5B%27%27@jquery%27%27%5D.css%28aString%2C%20anotherString%29%27%7D%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_addClass_',
+smalltalk.method({
+selector: 'addClass:',
+category: 'css',
+fn: function (aString){
+var self=this;
+self._call_withArgument_("addClass",aString);
+return self;},
+source: unescape('addClass%3A%20aString%0A%20%20%20%20%22Adds%20the%20specified%20class%28es%29%20to%20each%20of%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20self%20call%3A%20%27addClass%27%20withArgument%3A%20aString%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_removeClass_',
+smalltalk.method({
+selector: 'removeClass:',
+category: 'css',
+fn: function (aString){
+var self=this;
+self._call_withArgument_("removeClass",aString);
+return self;},
+source: unescape('removeClass%3A%20aString%0A%20%20%20%20%22Remove%20a%20single%20class%2C%20multiple%20classes%2C%20or%20all%20classes%20from%20each%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20self%20call%3A%20%27removeClass%27%20withArgument%3A%20aString%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_toggleClass_',
+smalltalk.method({
+selector: 'toggleClass:',
+category: 'css',
+fn: function (aString){
+var self=this;
+self._call_withArgument_("toggleClass",aString);
+return self;},
+source: unescape('toggleClass%3A%20aString%0A%20%20%20%20%22Add%20or%20remove%20one%20or%20more%20classes%20from%20each%20element%20in%20the%20set%20of%20matched%20elements%2C%20depending%20on%20either%20the%20class%27s%20presence%20or%20the%20value%20of%20the%20switch%20argument.%22%0A%20%20%20%20self%20call%3A%20%27toggleClass%27%20withArgument%3A%20aString%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_height',
+smalltalk.method({
+selector: 'height',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("height");
+return self;},
+source: unescape('height%20%0A%20%20%20%20%22Get%20the%20current%20computed%20height%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27height%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_height_',
+smalltalk.method({
+selector: 'height:',
+category: 'css',
+fn: function (anInteger){
+var self=this;
+self._call_withArgument_("height",anInteger);
+return self;},
+source: unescape('height%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27height%27%20withArgument%3A%20anInteger%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_width_',
+smalltalk.method({
+selector: 'width:',
+category: 'css',
+fn: function (anInteger){
+var self=this;
+self._call_withArgument_("width",anInteger);
+return self;},
+source: unescape('width%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27width%27%20withArgument%3A%20anInteger%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_width',
+smalltalk.method({
+selector: 'width',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("width");
+return self;},
+source: unescape('width%0A%20%20%20%20%22Get%20the%20current%20computed%20width%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27width%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_innerHeight',
+smalltalk.method({
+selector: 'innerHeight',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("innerHeight");
+return self;},
+source: unescape('innerHeight%0A%20%20%20%20%22Get%20the%20current%20computed%20height%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%20but%20not%20border.%22%0A%20%20%20%20%5Eself%20call%3A%20%27innerHeight%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_innerWidth',
+smalltalk.method({
+selector: 'innerWidth',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("innerWidth");
+return self;},
+source: unescape('innerWidth%0A%20%20%20%20%22Get%20the%20current%20computed%20width%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%20but%20not%20border.%22%0A%20%20%20%20%5Eself%20call%3A%20%27innerWidth%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_outerHeight',
+smalltalk.method({
+selector: 'outerHeight',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("outerHeight");
+return self;},
+source: unescape('outerHeight%0A%20%20%20%20%22Get%20the%20current%20computed%20height%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%2C%20border%2C%20and%20optionally%20margin.%22%0A%20%20%20%20%5Eself%20call%3A%20%27outerHeight%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_outerWidth',
+smalltalk.method({
+selector: 'outerWidth',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("outerWidth");
+return self;},
+source: unescape('outerWidth%0A%20%20%20%20%22Get%20the%20current%20computed%20width%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%20and%20border.%22%0A%20%20%20%20%5Eself%20call%3A%20%27outerWidth%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_top',
+smalltalk.method({
+selector: 'top',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("position")._basicAt_("top");
+return self;},
+source: unescape('top%0A%20%20%20%20%22Get%20the%20current%20y%20coordinate%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20offset%20parent.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27position%27%29%20basicAt%3A%20%27top%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_left',
+smalltalk.method({
+selector: 'left',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("position")._basicAt_("left");
+return self;},
+source: unescape('left%0A%20%20%20%20%22Get%20the%20current%20x%20coordinate%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20offset%20parent.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27position%27%29%20basicAt%3A%20%27left%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_offsetLeft',
+smalltalk.method({
+selector: 'offsetLeft',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("offset")._basicAt_("left");
+return self;},
+source: unescape('offsetLeft%0A%20%20%20%20%22Get%20the%20current%20coordinates%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20document.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27offset%27%29%20basicAt%3A%20%27left%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_offsetTop',
+smalltalk.method({
+selector: 'offsetTop',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("offset")._basicAt_("top");
+return self;},
+source: unescape('offsetTop%0A%20%20%20%20%22Get%20the%20current%20coordinates%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20document.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27offset%27%29%20basicAt%3A%20%27top%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_scrollLeft',
+smalltalk.method({
+selector: 'scrollLeft',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("scrollLeft");
+return self;},
+source: unescape('scrollLeft%0A%20%20%20%20%22Get%20the%20current%20horizontal%20position%20of%20the%20scroll%20bar%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27scrollLeft%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_scrollTop',
+smalltalk.method({
+selector: 'scrollTop',
+category: 'css',
+fn: function (){
+var self=this;
+return self._call_("scrollTop");
+return self;},
+source: unescape('scrollTop%0A%20%20%20%20%22Get%20the%20current%20vertical%20position%20of%20the%20scroll%20bar%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27scrollTop%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_scrollLeft_',
+smalltalk.method({
+selector: 'scrollLeft:',
+category: 'css',
+fn: function (anInteger){
+var self=this;
+self._call_withArgument_("scrollLeft",anInteger);
+return self;},
+source: unescape('scrollLeft%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27scrollLeft%27%20withArgument%3A%20anInteger%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_scrollTop_',
+smalltalk.method({
+selector: 'scrollTop:',
+category: 'css',
+fn: function (anInteger){
+var self=this;
+self._call_withArgument_("scrollTop",anInteger);
+return self;},
+source: unescape('scrollTop%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27scrollTop%27%20withArgument%3A%20anInteger%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_focus',
+smalltalk.method({
+selector: 'focus',
+category: 'events',
+fn: function (){
+var self=this;
+self._call_("focus");
+return self;},
+source: unescape('focus%0A%20%20%20%20self%20call%3A%20%27focus%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_show',
+smalltalk.method({
+selector: 'show',
+category: 'events',
+fn: function (){
+var self=this;
+self._call_("show");
+return self;},
+source: unescape('show%0A%20%20%20%20self%20call%3A%20%27show%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_hide',
+smalltalk.method({
+selector: 'hide',
+category: 'events',
+fn: function (){
+var self=this;
+self._call_("hide");
+return self;},
+source: unescape('hide%0A%20%20%20%20self%20call%3A%20%27hide%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_remove',
+smalltalk.method({
+selector: 'remove',
+category: 'events',
+fn: function (){
+var self=this;
+self._call_("remove");
+return self;},
+source: unescape('remove%0A%20%20%20%20self%20call%3A%20%27remove%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_on_do_',
+smalltalk.method({
+selector: 'on:do:',
+category: 'events',
+fn: function (anEventString, aBlock){
+var self=this;
+(function(){self['@jquery'].bind(anEventString, aBlock)})();
+return self;},
+source: unescape('on%3A%20anEventString%20do%3A%20aBlock%0A%20%20%20%20%22Attach%20aBlock%20for%20anEventString%20on%20the%20element%22%0A%20%20%20%20%7B%27self%5B%27%27@jquery%27%27%5D.bind%28anEventString%2C%20aBlock%29%27%7D%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_removeEvents_',
+smalltalk.method({
+selector: 'removeEvents:',
+category: 'events',
+fn: function (aString){
+var self=this;
+self._call_withArgument_("unbind",aString);
+return self;},
+source: unescape('removeEvents%3A%20aString%0A%20%20%20%20%22Unbind%20all%20handlers%20attached%20to%20the%20event%20aString%22%0A%20%20%20%20self%20call%3A%20%27unbind%27%20withArgument%3A%20aString%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_append_',
+smalltalk.method({
+selector: 'append:',
+category: 'DOM insertion',
+fn: function (anObject){
+var self=this;
+anObject._appendToJQuery_(self);
+return self;},
+source: unescape('append%3A%20anObject%0A%20%20%20%20%22Append%20anObject%20at%20the%20end%20of%20the%20element.%22%0A%20%20%20%20anObject%20appendToJQuery%3A%20self%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_appendElement_',
+smalltalk.method({
+selector: 'appendElement:',
+category: 'DOM insertion',
+fn: function (anElement){
+var self=this;
+self._call_withArgument_("append",anElement);
+return self;},
+source: unescape('appendElement%3A%20anElement%0A%20%20%20%20%22Append%20anElement%20at%20the%20end%20of%20the%20element.%0A%20%20%20%20%20Dont%27t%20call%20this%20method%20directly%2C%20use%20%23append%3A%20instead%22%0A%20%20%20%20self%20call%3A%20%27append%27%20withArgument%3A%20anElement%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_appendToJQuery_',
+smalltalk.method({
+selector: 'appendToJQuery:',
+category: 'DOM insertion',
+fn: function (aJQuery){
+var self=this;
+aJQuery._appendElement_(self['@jquery']);
+return self;},
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20appendElement%3A%20jquery%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_contents_',
+smalltalk.method({
+selector: 'contents:',
+category: 'DOM insertion',
+fn: function (anObject){
+var self=this;
+self._empty();
+self._append_(anObject);
+return self;},
+source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20empty.%0A%20%20%20%20self%20append%3A%20anObject%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_empty',
+smalltalk.method({
+selector: 'empty',
+category: 'DOM insertion',
+fn: function (){
+var self=this;
+self._call_("empty");
+return self;},
+source: unescape('empty%0A%20%20%20%20self%20call%3A%20%27empty%27%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_initializeWithJQueryObject_',
+smalltalk.method({
+selector: 'initializeWithJQueryObject:',
+category: 'initialization',
+fn: function (anObject){
+var self=this;
+self['@jquery']=anObject;
+return self;},
+source: unescape('initializeWithJQueryObject%3A%20anObject%0A%20%20%20%20jquery%20%3A%3D%20anObject%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_call_',
+smalltalk.method({
+selector: 'call:',
+category: 'private',
+fn: function (aString){
+var self=this;
+return (function(){return self['@jquery'][aString]()})();
+return self;},
+source: unescape('call%3A%20aString%0A%20%20%20%20%5E%7B%27return%20self%5B%27%27@jquery%27%27%5D%5BaString%5D%28%29%27%7D%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_call_withArgument_',
+smalltalk.method({
+selector: 'call:withArgument:',
+category: 'private',
+fn: function (aString, anObject){
+var self=this;
+return (function(){return self['@jquery'][aString](anObject)})();
+return self;},
+source: unescape('call%3A%20aString%20withArgument%3A%20anObject%0A%20%20%20%20%5E%7B%27return%20self%5B%27%27@jquery%27%27%5D%5BaString%5D%28anObject%29%27%7D%0A')}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_hasClass_',
+smalltalk.method({
+selector: 'hasClass:',
+category: 'testing',
+fn: function (aString){
+var self=this;
+return self._call_withArgument_("hasClass",aString);
+return self;},
+source: unescape('hasClass%3A%20aString%0A%20%20%20%20%22Determine%20whether%20any%20of%20the%20matched%20elements%20are%20assigned%20the%20given%20class.%22%0A%20%20%20%20%5Eself%20call%3A%20%27hasClass%27%20withArgument%3A%20aString%0A')}),
+smalltalk.JQuery);
+
+
+smalltalk.addMethod(
+'_fromString_',
+smalltalk.method({
+selector: 'fromString:',
+category: 'instance creation',
+fn: function (aString){
+var self=this;
+var newJQuery=nil;
+(function(){newJQuery = jQuery(String(aString))})();
+return self._from_(newJQuery);
+return self;},
+source: unescape('fromString%3A%20aString%0A%20%20%20%20%7C%20newJQuery%20%7C%0A%20%20%20%20%7B%27newJQuery%20%3D%20jQuery%28String%28aString%29%29%27%7D.%0A%20%20%20%20%5Eself%20from%3A%20newJQuery%0A')}),
+smalltalk.JQuery.klass);
+
+smalltalk.addMethod(
+'_from_',
+smalltalk.method({
+selector: 'from:',
+category: 'instance creation',
+fn: function (anObject){
+var self=this;
+return (function($rec){$rec._initializeWithJQueryObject_(anObject);return $rec._yourself();})(self._new());
+return self;},
+source: unescape('from%3A%20anObject%0A%20%20%20%20%5Eself%20new%0A%09initializeWithJQueryObject%3A%20anObject%3B%0A%09yourself%0A')}),
+smalltalk.JQuery.klass);
+
+
+

+ 167 - 0
js/jquery-1.4.4.min.js

@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);

+ 781 - 0
js/jquery-ui-1.8.9.custom.min.js

@@ -0,0 +1,781 @@
+/*!
+ * jQuery UI 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.9",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
+NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
+if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
+"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
+d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
+c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
+b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
+a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
+e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*!
+ * jQuery UI Mouse 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(true===c.data(b.target,a.widgetName+".preventClickEvent")){c.removeData(b.target,a.widgetName+".preventClickEvent");b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=
+a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
+this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);
+return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&c.data(a.target,this.widgetName+".preventClickEvent",
+true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+;/*
+ * jQuery UI Position 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
+left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
+k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
+m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
+d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
+a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
+g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
+;/*
+ * jQuery UI Draggable 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
+"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
+this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-
+this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();
+d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||
+this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&
+this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
+a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||
+0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
+this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-
+(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment==
+"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?
+0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),
+10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==
+Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():
+f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;
+if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/
+b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-
+this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=
+this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.9"});
+d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=
+0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=
+c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,
+true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=
+0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=
+a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a=d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},
+stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=
+document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-
+c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-
+(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable",
+"snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=
+c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&&o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",
+{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t=p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,
+left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&&(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,
+a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,
+b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
+;/*
+ * jQuery UI Droppable 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
+a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.9"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
+switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
+i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
+"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
+a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=
+d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery);
+;/*
+ * jQuery UI Resizable 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
+d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
+b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
+f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",
+b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=
+a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,
+k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),
+c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=
+this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+
+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,
+arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,
+{version:"1.8.9"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,
+function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=
+(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=
+false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-
+a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",
+b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top",
+"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,
+f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=
+a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+
+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&
+e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",
+height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=
+d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
+;/*
+ * jQuery UI Selectable 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
+c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
+this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
+a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
+!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
+e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.9"})})(jQuery);
+;/*
+ * jQuery UI Sortable 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,
+arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=
+c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,
+{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();
+if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",
+a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");
+if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+
+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+
+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+
+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,
+c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==
+document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-
+1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});
+this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&
+a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?
+"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?
+c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;
+return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=
+d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});
+return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=
+d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent=
+this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=
+e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];
+if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);
+c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===
+1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=
+this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):
+b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==
+""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=
+this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),
+10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions=
+{width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||
+document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,
+b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=
+document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
+e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-
+this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<
+this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&
+this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=
+this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();
+this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],
+this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",
+g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||
+this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,
+originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.9"})})(jQuery);
+;/*
+ * jQuery UI Accordion 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
+a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",
+function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+
+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
+b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
+a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
+if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
+if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(),
+e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight||
+e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",
+tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.9",animations:{slide:function(a,b){a=
+c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);f[i]={value:j[1],
+unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide",
+paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
+;/*
+ * jQuery UI Autocomplete 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function(d){d.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){f=false;var e=d.ui.keyCode;
+switch(c.keyCode){case e.PAGE_UP:a._move("previousPage",c);break;case e.PAGE_DOWN:a._move("nextPage",c);break;case e.UP:a._move("previous",c);c.preventDefault();break;case e.DOWN:a._move("next",c);c.preventDefault();break;case e.ENTER:case e.NUMPAD_ENTER:if(a.menu.active){f=true;c.preventDefault()}case e.TAB:if(!a.menu.active)return;a.menu.select(c);break;case e.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=
+null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(f){f=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||
+"body",b)[0]).mousedown(function(c){var e=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(g){g.target!==a.element[0]&&g.target!==e&&!d.ui.contains(e,g.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,e){e=e.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:e})&&/^key/.test(c.originalEvent.type)&&a.element.val(e.value)},selected:function(c,e){var g=e.item.data("item.autocomplete"),
+h=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=h;setTimeout(function(){a.previous=h;a.selectedItem=g},1)}false!==a._trigger("select",c,{item:g})&&a.element.val(g.value);a.term=a.element.val();a.close(c);a.selectedItem=g},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");
+this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,f;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,e){e(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source===
+"string"){f=this.options.source;this.source=function(c,e){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:f,data:c,dataType:"json",success:function(g,h,i){i===a.xhr&&e(g);a.xhr=null},error:function(g){g===a.xhr&&e([]);a.xhr=null}})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.pending++;
+this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==
+this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position))},
+_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var f=this;d.each(b,function(c,e){f._renderItem(a,e)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);
+else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var f=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return f.test(c.label||c.value||c)})}})})(jQuery);
+(function(d){d.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(d(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(b){a.activate(b,d(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var f=b.offset().top-this.element.offset().top,c=this.element.attr("scrollTop"),e=this.element.height();if(f<0)this.element.attr("scrollTop",c+f);else f>=e&&this.element.attr("scrollTop",c+f-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})},
+deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,f){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);
+a.length?this.activate(f,a):this.activate(f,this.element.children(b))}else this.activate(f,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(".ui-menu-item:first"));else{var b=this.active.offset().top,f=this.element.height(),c=this.element.children(".ui-menu-item").filter(function(){var e=d(this).offset().top-b-f+d(this).height();return e<10&&e>-10});c.length||(c=this.element.children(".ui-menu-item:last"));this.activate(a,
+c)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(".ui-menu-item:last"));else{var b=this.active.offset().top,f=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-b+f-d(this).height();return c<10&&c>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
+this.activate(a,result)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery);
+;/*
+ * jQuery UI Button 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
+i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
+function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
+b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
+g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
+c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("label[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=
+this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||
+this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");
+this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},
+destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
+;/*
+ * jQuery UI Dialog 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function(c,j){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&
+c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",
+-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role",
+"button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=
+b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&
+a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0]){e=c(this).css("z-index");
+isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);
+d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.shiftKey){g.focus(1);return false}}});
+c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(f,
+h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('<button type="button"></button>').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=
+d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,
+position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,
+h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===
+1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in
+l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");
+break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e=
+this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&&
+this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.9",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===
+0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
+height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
+b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,
+function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+;/*
+ * jQuery UI Slider 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var b=this,a=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");a.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
+this.range=d([]);if(a.range){if(a.range===true){this.range=d("<div></div>");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
+if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length<a.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur();
+else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e=
+false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h===
+b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");
+this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b,
+g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true},
+_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a;
+if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=
+this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c<e))c=e;if(c!==this.values(a)){e=this.values();e[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:e});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a],
+value:c});b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value=
+this._trimAlignValue(b);this._refreshValue();this._change(null,0)}return this._value()},values:function(b,a){var c,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):this.value();
+else return this._values()},_setOption:function(b,a){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b];
+return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
+_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);
+if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,
+1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.9"})})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.9"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+;/*
+ * jQuery UI Datepicker 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function(d,G){function K(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function E(a,b){d.extend(a,b);for(var c in b)if(b[c]==
+null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.9"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();
+f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
+_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
+b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
+""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,
+c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),
+true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});
+b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);
+this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",
+this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,
+function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:
+f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},
+e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);
+this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]?
+d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||
+a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,
+e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,
+"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==G?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},
+_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=
+d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,
+c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&
+d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",
+function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=
+-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,
+"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},
+_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-
+g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?
+b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
+_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):
+0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=
+false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=
+d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);
+else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=
+a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,
+g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){var v=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&v?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,v,H){p=o(p)?H:v;for(v=0;v<p.length;v++)if(b.substr(s,p[v].length).toLowerCase()==p[v].toLowerCase()){s+=p[v].length;return v+1}throw"Unknown name at position "+
+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(k)if(a.charAt(z)=="'"&&!o("'"))k=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var w=new Date(m("@"));c=w.getFullYear();j=w.getMonth()+1;l=w.getDate();break;case "!":w=new Date((m("!")-this._ticksTo1970)/1E4);c=w.getFullYear();j=w.getMonth()+
+1;l=w.getDate();break;case "'":if(o("'"))r();else k=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",
+RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&
+a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",
+b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+=
+"0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==G?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=
+f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=
+(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,
+l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=
+a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),
+b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=
+this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,
+"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=
+this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",C=0;C<i[0];C++){for(var M="",D=0;D<i[1];D++){var N=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-
+1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,C>0||D>0,z,w)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=
+(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<A;O++){x+="<tr>";var P=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=
+p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,J=B&&!H||!F[0]||k&&q<k||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==N.getTime()&&g==a.selectedMonth&&a._keyEvent||L.getTime()==q.getTime()&&L.getTime()==N.getTime()?" "+this._dayOverClass:"")+(J?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!v?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":
+""))+'"'+((!B||v)&&F[2]?' title="'+F[2]+'"':"")+(J?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!v?"&#xa0;":J?'<span class="ui-state-default">'+q.getDate()+"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=
+P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',
+o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&
+l)?"&#xa0;":""));a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+
+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";if(d.browser.mozilla)k+='<select class="ui-datepicker-year"><option value="'+c+'" selected="selected">'+c+"</option></select>";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?"&#xa0;":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=
+a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
+"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
+c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
+"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
+function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));
+return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.9";window["DP_jQuery_"+y]=d})(jQuery);
+;/*
+ * jQuery UI Progressbar 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
+this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.9"})})(jQuery);
+;/*
+ * jQuery UI Effects 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
+0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
+211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
+d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0];
+h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,
+a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.9",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,
+a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",
+border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);
+return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments);
+else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),
+b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,
+a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,
+a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==
+e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=
+g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/
+h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,
+a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
+;/*
+ * jQuery UI Effects Blind 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
+g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Bounce 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
+3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
+b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Clip 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
+c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Drop 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
+"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Explode 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
+0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
+e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
+;/*
+ * jQuery UI Effects Fade 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Fold 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
+10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Highlight 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Pulsate 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
+a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Scale 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
+b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
+1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};
+if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);
+a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);
+child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
+n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Shake 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
+(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Slide 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
+var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Transfer 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
+b.dequeue()})})}})(jQuery);
+;

+ 267 - 0
js/jquery.textarea.js

@@ -0,0 +1,267 @@
+/*
+ *	Tabby jQuery plugin version 0.12
+ *
+ *	Ted Devito - http://teddevito.com/demos/textarea.html
+ *
+ *	Copyright (c) 2009 Ted Devito
+ *	 
+ *	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following 
+ *	conditions are met:
+ *	
+ *		1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ *		2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer  
+ *			in the documentation and/or other materials provided with the distribution.
+ *		3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written 
+ *			permission. 
+ *	 
+ *	THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+ *	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE 
+ *	LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
+ *	PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
+ *	THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
+ *	OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+ 
+// create closure
+
+(function($) {
+ 
+	// plugin definition
+
+	$.fn.tabby = function(options) {
+		//debug(this);
+		// build main options before element iteration
+		var opts = $.extend({}, $.fn.tabby.defaults, options);
+		var pressed = $.fn.tabby.pressed; 
+		
+		// iterate and reformat each matched element
+		return this.each(function() {
+			$this = $(this);
+			
+			// build element specific options
+			var options = $.meta ? $.extend({}, opts, $this.data()) : opts;
+			
+			$this.bind('keydown',function (e) {
+				var kc = $.fn.tabby.catch_kc(e);
+				if (16 == kc) pressed.shft = true;
+				/*
+				because both CTRL+TAB and ALT+TAB default to an event (changing tab/window) that 
+				will prevent js from capturing the keyup event, we'll set a timer on releasing them.
+				*/
+				if (17 == kc) {pressed.ctrl = true;	setTimeout("$.fn.tabby.pressed.ctrl = false;",1000);}
+				if (18 == kc) {pressed.alt = true; 	setTimeout("$.fn.tabby.pressed.alt = false;",1000);}
+					
+				if (9 == kc && !pressed.ctrl && !pressed.alt) {
+					e.preventDefault; // does not work in O9.63 ??
+					pressed.last = kc;	setTimeout("$.fn.tabby.pressed.last = null;",0);
+					process_keypress ($(e.target).get(0), pressed.shft, options);
+					return false;
+				}
+				
+			}).bind('keyup',function (e) {
+				if (16 == $.fn.tabby.catch_kc(e)) pressed.shft = false;
+			}).bind('blur',function (e) { // workaround for Opera -- http://www.webdeveloper.com/forum/showthread.php?p=806588
+				if (9 == pressed.last) $(e.target).one('focus',function (e) {pressed.last = null;}).get(0).focus();
+			});
+		
+		});
+	};
+	
+	// define and expose any extra methods
+	$.fn.tabby.catch_kc = function(e) { return e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which; };
+	$.fn.tabby.pressed = {shft : false, ctrl : false, alt : false, last: null};
+	
+	// private function for debugging
+	function debug($obj) {
+		if (window.console && window.console.log)
+		window.console.log('textarea count: ' + $obj.size());
+	};
+
+	function process_keypress (o,shft,options) {
+		var scrollTo = o.scrollTop;
+		//var tabString = String.fromCharCode(9);
+		
+		// gecko; o.setSelectionRange is only available when the text box has focus
+		if (o.setSelectionRange) gecko_tab (o, shft, options);
+		
+		// ie; document.selection is always available
+		else if (document.selection) ie_tab (o, shft, options);
+		
+		o.scrollTop = scrollTo;
+	}
+	
+	// plugin defaults
+	$.fn.tabby.defaults = {tabString : String.fromCharCode(9)};
+	
+	function gecko_tab (o, shft, options) {
+		var ss = o.selectionStart;
+		var es = o.selectionEnd;	
+				
+		// when there's no selection and we're just working with the caret, we'll add/remove the tabs at the caret, providing more control
+		if(ss == es) {
+			// SHIFT+TAB
+			if (shft) {
+				// check to the left of the caret first
+				if ("\t" == o.value.substring(ss-options.tabString.length, ss)) {
+					o.value = o.value.substring(0, ss-options.tabString.length) + o.value.substring(ss); // put it back together omitting one character to the left
+					o.focus();
+					o.setSelectionRange(ss - options.tabString.length, ss - options.tabString.length);
+				} 
+				// then check to the right of the caret
+				else if ("\t" == o.value.substring(ss, ss + options.tabString.length)) {
+					o.value = o.value.substring(0, ss) + o.value.substring(ss + options.tabString.length); // put it back together omitting one character to the right
+					o.focus();
+					o.setSelectionRange(ss,ss);
+				}
+			}
+			// TAB
+			else {			
+				o.value = o.value.substring(0, ss) + options.tabString + o.value.substring(ss);
+				o.focus();
+	    		o.setSelectionRange(ss + options.tabString.length, ss + options.tabString.length);
+			}
+		} 
+		// selections will always add/remove tabs from the start of the line
+		else {
+			// split the textarea up into lines and figure out which lines are included in the selection
+			var lines = o.value.split("\n");
+			var indices = new Array();
+			var sl = 0; // start of the line
+			var el = 0; // end of the line
+			var sel = false;
+			for (var i in lines) {
+				el = sl + lines[i].length;
+				indices.push({start: sl, end: el, selected: (sl <= ss && el > ss) || (el >= es && sl < es) || (sl > ss && el < es)});
+				sl = el + 1;// for "\n"
+			}
+			
+			// walk through the array of lines (indices) and add tabs where appropriate						
+			var modifier = 0;
+			for (var i in indices) {
+				if (indices[i].selected) {
+					var pos = indices[i].start + modifier; // adjust for tabs already inserted/removed
+					// SHIFT+TAB
+					if (shft && options.tabString == o.value.substring(pos,pos+options.tabString.length)) { // only SHIFT+TAB if there's a tab at the start of the line
+						o.value = o.value.substring(0,pos) + o.value.substring(pos + options.tabString.length); // omit the tabstring to the right
+						modifier -= options.tabString.length;
+					}
+					// TAB
+					else if (!shft) {
+						o.value = o.value.substring(0,pos) + options.tabString + o.value.substring(pos); // insert the tabstring
+						modifier += options.tabString.length;
+					}
+				}
+			}
+			o.focus();
+			var ns = ss + ((modifier > 0) ? options.tabString.length : (modifier < 0) ? -options.tabString.length : 0);
+			var ne = es + modifier;
+			o.setSelectionRange(ns,ne);
+		}
+	}
+	
+	function ie_tab (o, shft, options) {
+		var range = document.selection.createRange();
+		
+		if (o == range.parentElement()) {
+			// when there's no selection and we're just working with the caret, we'll add/remove the tabs at the caret, providing more control
+			if ('' == range.text) {
+				// SHIFT+TAB
+				if (shft) {
+					var bookmark = range.getBookmark();
+					//first try to the left by moving opening up our empty range to the left
+				    range.moveStart('character', -options.tabString.length);
+				    if (options.tabString == range.text) {
+				    	range.text = '';
+				    } else {
+				    	// if that didn't work then reset the range and try opening it to the right
+				    	range.moveToBookmark(bookmark);
+				    	range.moveEnd('character', options.tabString.length);
+				    	if (options.tabString == range.text) 
+				    		range.text = '';
+				    }
+				    // move the pointer to the start of them empty range and select it
+				    range.collapse(true);
+					range.select();
+				}
+				
+				else {
+					// very simple here. just insert the tab into the range and put the pointer at the end
+					range.text = options.tabString; 
+					range.collapse(false);
+					range.select();
+				}
+			}
+			// selections will always add/remove tabs from the start of the line
+			else {
+			
+				var selection_text = range.text;
+				var selection_len = selection_text.length;
+				var selection_arr = selection_text.split("\r\n");
+				
+				var before_range = document.body.createTextRange();
+				before_range.moveToElementText(o);
+				before_range.setEndPoint("EndToStart", range);
+				var before_text = before_range.text;
+				var before_arr = before_text.split("\r\n");
+				var before_len = before_text.length; // - before_arr.length + 1;
+				
+				var after_range = document.body.createTextRange();
+				after_range.moveToElementText(o);
+				after_range.setEndPoint("StartToEnd", range);
+				var after_text = after_range.text; // we can accurately calculate distance to the end because we're not worried about MSIE trimming a \r\n
+				
+				var end_range = document.body.createTextRange();
+				end_range.moveToElementText(o);
+				end_range.setEndPoint("StartToEnd", before_range);
+				var end_text = end_range.text; // we can accurately calculate distance to the end because we're not worried about MSIE trimming a \r\n
+								
+				var check_html = $(o).html();
+				$("#r3").text(before_len + " + " + selection_len + " + " + after_text.length + " = " + check_html.length);				
+				if((before_len + end_text.length) < check_html.length) {
+					before_arr.push("");
+					before_len += 2; // for the \r\n that was trimmed	
+					if (shft && options.tabString == selection_arr[0].substring(0,options.tabString.length))
+						selection_arr[0] = selection_arr[0].substring(options.tabString.length);
+					else if (!shft) selection_arr[0] = options.tabString + selection_arr[0];	
+				} else {
+					if (shft && options.tabString == before_arr[before_arr.length-1].substring(0,options.tabString.length)) 
+						before_arr[before_arr.length-1] = before_arr[before_arr.length-1].substring(options.tabString.length);
+					else if (!shft) before_arr[before_arr.length-1] = options.tabString + before_arr[before_arr.length-1];
+				}
+				
+				for (var i = 1; i < selection_arr.length; i++) {
+					if (shft && options.tabString == selection_arr[i].substring(0,options.tabString.length))
+						selection_arr[i] = selection_arr[i].substring(options.tabString.length);
+					else if (!shft) selection_arr[i] = options.tabString + selection_arr[i];
+				}
+				
+				if (1 == before_arr.length && 0 == before_len) {
+					if (shft && options.tabString == selection_arr[0].substring(0,options.tabString.length))
+						selection_arr[0] = selection_arr[0].substring(options.tabString.length);
+					else if (!shft) selection_arr[0] = options.tabString + selection_arr[0];
+				}
+
+				if ((before_len + selection_len + after_text.length) < check_html.length) {
+					selection_arr.push("");
+					selection_len += 2; // for the \r\n that was trimmed
+				}
+				
+				before_range.text = before_arr.join("\r\n");
+				range.text = selection_arr.join("\r\n");
+				
+				var new_range = document.body.createTextRange();
+				new_range.moveToElementText(o);
+				
+				if (0 < before_len)	new_range.setEndPoint("StartToEnd", before_range);
+				else new_range.setEndPoint("StartToStart", before_range);
+				new_range.setEndPoint("EndToEnd", range);
+				
+				new_range.select();
+				
+			} 
+		}
+	}
+
+// end of closure
+})(jQuery);

+ 247 - 0
js/jtalk.less

@@ -0,0 +1,247 @@
+/* colors */
+
+@grey: #ccc;
+@dark: #222;
+@blue: #08c;
+@red: #e72a2a;
+
+/* Functions */
+
+.box-shadow (@x: 0, @y: 0, @blur: 1px, @alpha) {
+  @val: @x @y @blur rgba(0, 0, 0, @alpha);
+
+  box-shadow:         @val;
+  -webkit-box-shadow: @val;
+  -moz-box-shadow:    @val;
+}
+
+body.jtalkBody {
+	   margin-bottom: 380px;
+}
+
+#jtalkTabs {
+    position: fixed;
+    font-family: helvetica,arial,sans;
+    font-size: 12px;
+    background: white;
+    z-index: 1;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    margin: 0;
+    padding: 0 0 3px 0;
+    height: 19px;
+    background: white;
+
+    	li {
+            list-style-type: none;
+    	    display: inline;
+	    background: darken(@grey, 1%);
+	    font-weight: bold;
+	    color: lighten(@dark, 20%);
+	    padding: 4px;
+	    border: 1px solid darken(@grey, 20%);
+	    cursor: pointer;
+	    line-height: 14px;
+
+	    &.selected {
+	        background: lighten(@grey, 10%);
+		border-top: 0 none;
+		padding: 5px 4px;
+	        color: @dark;
+            }
+
+	    span.close {
+	        margin-left: 10px;
+            }
+
+	    &.closeAll {
+	        -moz-border-radius: 10px;
+		-webkit-border-radius: 10px;
+		border-radius: 10px;
+		background: lighten(@red, 10%);
+		color: lighten(@grey, 15%);
+		font-weight: bold;
+		border: 1px solid darken(@red, 15%);
+		margin: 4px;
+		padding: 2px 6px;
+		font-size: 10px;
+		
+		&:hover {
+		    background: @red;
+		}
+	    }
+	}
+}
+
+#jtalk {
+       position: fixed;
+       bottom: 27px;
+       left: 0;
+       right: 0;
+       height: 300px;
+
+     .ui-resizable-handle {
+     	     background-color: darken(@grey, 20%);
+	     top: 0;
+	     cursor: row-resize;
+	     height: 4px;
+	     left: 0;
+	     position: absolute;
+	     right: 0;
+	     width: auto !important;
+     }
+}
+
+.jtalkTool {
+    width: 98%;
+    background: lighten(@grey, 10%);
+    border-style: solid;
+    border-width: 2px 0 1px 0;
+    border-color: darken(@grey, 20%);
+    color: @dark;
+    font-family: Arial, Helvetica, sans;
+    font-size: 12px;
+    line-height: 1.5em;
+    padding: 15px 1%;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    top: 4px;
+    
+     .box {
+     	     width: 98%;
+	     margin: 0;
+	     position: absolute;
+	     top: 15px;
+	     bottom: 45px;
+     }
+
+     .buttons {
+     	  position: absolute;
+	  bottom: 15px;    
+	  
+	  button {
+	  	  font-size: 12px;
+	  }
+     }
+
+
+    textarea {
+  	border: 1px solid;
+	border-color: darken(@grey, 20%);
+	font-family: Arial, Helvetica, sans;
+	line-height: 1.2em;
+	font-size: 13px;
+	position: relative;
+	padding: 3px;
+    }
+
+    .clear {	 
+    	   clear: both;
+    }
+
+    .transcript,.workspace {
+    	width: 100%;
+	height: 100%;
+    }
+
+    ul.column {
+    	   width: 24%;
+	   padding: 0;
+	   margin: 0;
+	   float: left;
+	   border: 1px solid;
+	   border-color: darken(@grey, 20%);
+	   height: 130px;
+	   overflow-y: scroll;
+	   background: white;
+	   position: absolute;
+	   top: 0;
+
+	   &.categories {
+	   	left: 0%
+	   }
+
+	   &.classes {
+	   	height: 105px;
+	   	left: 25.2%
+	   }
+
+	   &.protocols {
+	   	left: 50.4%
+	   }
+
+	   &.methods {
+	   	left: 75.6%
+	   }
+
+	   li {
+		list-style-type: none;
+		padding-left: 5px;
+		cursor: pointer;
+		&.selected {
+		     background: lighten(@grey, 10%);
+		     color: @dark;
+		}
+	   	&:hover {
+	   	     background: @blue;
+		     color: white;
+	   	}
+	   }
+     }
+
+     .tabs {
+     	   top: 106px;
+	   position: absolute;
+	   left: 25.2%;
+	   padding: 0;
+	   margin: 0;
+
+	   li {
+	      color: darken(@grey, 30%);
+	      list-style-type: none;
+	      float: left;
+	      padding: 2px 4px;
+	      margin-right: 2px;
+	      background: @grey;
+	      border: 1px solid darken(@grey, 20%);
+	      -moz-border-radius-bottomleft: 8px;
+	      -moz-border-radius-bottomright: 8px;
+	      -webkit-border-bottom-left-radius: 8px;
+	      -webkit-border-bottom-right-radius: 8px;
+	      border-bottom-left-radius: 8px;
+	      border-bottom-right-radius: 8px;
+	      height: 20px;
+	      line-height: 18px;
+
+	      &:hover {
+	        cursor: pointer;
+		background: @blue;
+		color: white;
+		border-color: @blue;
+	      }
+
+	      &.selected, &.selected:hover {
+	      	background: white;
+		border: 1px solid darken(@grey, 10%);
+		border-top: 1px solid white;
+		color: darken(@grey, 50px);
+	      }
+	  }
+     }
+
+     .sourceCode {
+
+     	     position: absolute;
+	     top: 145px;
+	     bottom: 0;
+	     left: 0;
+	     right: 0;
+
+	     textarea.source {
+		 width: 100%;
+		 height: 100%;
+	     }
+     }
+}

+ 3917 - 0
js/kernel.js

@@ -0,0 +1,3917 @@
+smalltalk.addClass('Object', smalltalk.nil, [], 'Kernel');
+smalltalk.addMethod(
+'__eq',
+smalltalk.method({
+selector: '=',
+category: 'comparing',
+fn: function (anObject){
+var self=this;
+return (function(){return self == anObject})();
+return self;},
+source: unescape('%3D%20anObject%0A%09%5E%7B%27return%20self%20%3D%3D%20anObject%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_~_eq',
+smalltalk.method({
+selector: '~=',
+category: 'comparing',
+fn: function (anObject){
+var self=this;
+return self.__eq(anObject).__eq_eq(false);
+return self;},
+source: unescape('%7E%3D%20anObject%0A%09%5E%28self%20%3D%20anObject%29%20%3D%3D%20false%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+
+return self;},
+source: unescape('initialize%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_yourself',
+smalltalk.method({
+selector: 'yourself',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self;
+return self;},
+source: unescape('yourself%0A%09%5Eself%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_class',
+smalltalk.method({
+selector: 'class',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.klass})();
+return self;},
+source: unescape('class%0A%09%5E%7B%27return%20self.klass%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_size',
+smalltalk.method({
+selector: 'size',
+category: 'accessing',
+fn: function (){
+var self=this;
+self._error_("Object not indexable");
+return self;},
+source: unescape('size%0A%09self%20error%3A%20%27Object%20not%20indexable%27%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_copy',
+smalltalk.method({
+selector: 'copy',
+category: 'copying',
+fn: function (){
+var self=this;
+return self._shallowCopy()._postCopy();
+return self;},
+source: unescape('copy%0A%09%5Eself%20shallowCopy%20postCopy%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_shallowCopy',
+smalltalk.method({
+selector: 'shallowCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+return (function(){
+	    var copy = self.klass._new();
+	    for(var i in self) {
+		if(/^@.+/.test(i)) {
+		    copy[i] = self[i];
+		}
+	    }
+	    return copy;
+	})();
+return self;},
+source: unescape('shallowCopy%0A%09%5E%7B%27%0A%09%20%20%20%20var%20copy%20%3D%20self.klass._new%28%29%3B%0A%09%20%20%20%20for%28var%20i%20in%20self%29%20%7B%0A%09%09if%28/%5E@.+/.test%28i%29%29%20%7B%0A%09%09%20%20%20%20copy%5Bi%5D%20%3D%20self%5Bi%5D%3B%0A%09%09%7D%0A%09%20%20%20%20%7D%0A%09%20%20%20%20return%20copy%3B%0A%09%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_deepCopy',
+smalltalk.method({
+selector: 'deepCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+(function(){	    
+	    var copy = self.klass._new();
+	    for(var i in self) {
+		if(/^@.+/.test(i)) {
+		    copy[i] = self[i]._deepCopy();
+		}
+	    }
+	    return copy;
+	})();
+return self;},
+source: unescape('deepCopy%0A%09%7B%27%09%20%20%20%20%0A%09%20%20%20%20var%20copy%20%3D%20self.klass._new%28%29%3B%0A%09%20%20%20%20for%28var%20i%20in%20self%29%20%7B%0A%09%09if%28/%5E@.+/.test%28i%29%29%20%7B%0A%09%09%20%20%20%20copy%5Bi%5D%20%3D%20self%5Bi%5D._deepCopy%28%29%3B%0A%09%09%7D%0A%09%20%20%20%20%7D%0A%09%20%20%20%20return%20copy%3B%0A%09%27%7D.%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_postCopy',
+smalltalk.method({
+selector: 'postCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+
+return self;},
+source: unescape('postCopy%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'__minus_gt',
+smalltalk.method({
+selector: '->',
+category: 'converting',
+fn: function (anObject){
+var self=this;
+return smalltalk.Association._key_value_(self,anObject);
+return self;},
+source: unescape('-%3E%20anObject%0A%09%5EAssociation%20key%3A%20self%20value%3A%20anObject%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_asString',
+smalltalk.method({
+selector: 'asString',
+category: 'converting',
+fn: function (){
+var self=this;
+return self._printString();
+return self;},
+source: unescape('asString%0A%09%5Eself%20printString%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_asJavascript',
+smalltalk.method({
+selector: 'asJavascript',
+category: 'converting',
+fn: function (){
+var self=this;
+return self._asString();
+return self;},
+source: unescape('asJavascript%0A%09%5Eself%20asString%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_perform_',
+smalltalk.method({
+selector: 'perform:',
+category: 'message handling',
+fn: function (aSymbol){
+var self=this;
+return self._perform_withArguments_(aSymbol,[]);
+return self;},
+source: unescape('perform%3A%20aSymbol%0A%09%5Eself%20perform%3A%20aSymbol%20withArguments%3A%20%23%28%29%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_perform_withArguments_',
+smalltalk.method({
+selector: 'perform:withArguments:',
+category: 'error handling',
+fn: function (aSymbol, aCollection){
+var self=this;
+return self._basicPerform_withArguments_(aSymbol._asSelector(),aCollection);
+return self;},
+source: unescape('perform%3A%20aSymbol%20withArguments%3A%20aCollection%0A%09%5Eself%20basicPerform%3A%20aSymbol%20asSelector%20withArguments%3A%20aCollection%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_instVarAt_',
+smalltalk.method({
+selector: 'instVarAt:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return (function(){
+	    var value = self['@'+aString];
+	    if(typeof(value) == 'undefined') {
+		return nil;
+	    } else {
+		return value;
+	    }
+	})();
+return self;},
+source: unescape('instVarAt%3A%20aString%0A%09%5E%7B%27%0A%09%20%20%20%20var%20value%20%3D%20self%5B%27%27@%27%27+aString%5D%3B%0A%09%20%20%20%20if%28typeof%28value%29%20%3D%3D%20%27%27undefined%27%27%29%20%7B%0A%09%09return%20nil%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20value%3B%0A%09%20%20%20%20%7D%0A%09%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_instVarAt_put_',
+smalltalk.method({
+selector: 'instVarAt:put:',
+category: 'accessing',
+fn: function (aString, anObject){
+var self=this;
+return (function(){self['@' + aString] = anObject})();
+return self;},
+source: unescape('instVarAt%3A%20aString%20put%3A%20anObject%0A%09%5E%7B%27self%5B%27%27@%27%27%20+%20aString%5D%20%3D%20anObject%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_basicAt_',
+smalltalk.method({
+selector: 'basicAt:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return (function(){
+	    var value = self[aString];
+	    if(typeof(value) == 'undefined') {
+		return nil;
+	    } else {
+		return value;
+	    }
+	})();
+return self;},
+source: unescape('basicAt%3A%20aString%0A%09%5E%7B%27%0A%09%20%20%20%20var%20value%20%3D%20self%5BaString%5D%3B%0A%09%20%20%20%20if%28typeof%28value%29%20%3D%3D%20%27%27undefined%27%27%29%20%7B%0A%09%09return%20nil%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20value%3B%0A%09%20%20%20%20%7D%0A%09%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_basicAt_put_',
+smalltalk.method({
+selector: 'basicAt:put:',
+category: 'accessing',
+fn: function (aString, anObject){
+var self=this;
+return (function(){return self[aString] = anObject})();
+return self;},
+source: unescape('basicAt%3A%20aString%20put%3A%20anObject%0A%09%5E%7B%27return%20self%5BaString%5D%20%3D%20anObject%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_error_',
+smalltalk.method({
+selector: 'error:',
+category: 'error handling',
+fn: function (aString){
+var self=this;
+smalltalk.Error._signal_(aString);
+return self;},
+source: unescape('error%3A%20aString%0A%09Error%20signal%3A%20aString%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_subclassResponsibility',
+smalltalk.method({
+selector: 'subclassResponsibility',
+category: 'error handling',
+fn: function (){
+var self=this;
+self._error_("This method is a responsibility of a subclass");
+return self;},
+source: unescape('subclassResponsibility%0A%09self%20error%3A%20%27This%20method%20is%20a%20responsibility%20of%20a%20subclass%27%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_shouldNotImplement',
+smalltalk.method({
+selector: 'shouldNotImplement',
+category: 'error handling',
+fn: function (){
+var self=this;
+self._error_("This method should not be implemented in ".__comma(self._class()._name()));
+return self;},
+source: unescape('shouldNotImplement%0A%09self%20error%3A%20%27This%20method%20should%20not%20be%20implemented%20in%20%27%2C%20self%20class%20name%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_try_catch_',
+smalltalk.method({
+selector: 'try:catch:',
+category: 'error handling',
+fn: function (aBlock, anotherBlock){
+var self=this;
+(function(){try{aBlock()} catch(e) {anotherBlock(e)}})();
+return self;},
+source: unescape('try%3A%20aBlock%20catch%3A%20anotherBlock%0A%09%7B%27try%7BaBlock%28%29%7D%20catch%28e%29%20%7BanotherBlock%28e%29%7D%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_printString',
+smalltalk.method({
+selector: 'printString',
+category: 'printing',
+fn: function (){
+var self=this;
+return "a ".__comma(self._class()._name());
+return self;},
+source: unescape('printString%0A%09%5E%27a%20%27%2C%20self%20class%20name%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_printNl',
+smalltalk.method({
+selector: 'printNl',
+category: 'printing',
+fn: function (){
+var self=this;
+(function(){console.log(self)})();
+return self;},
+source: unescape('printNl%0A%09%7B%27console.log%28self%29%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_isKindOf_',
+smalltalk.method({
+selector: 'isKindOf:',
+category: 'testing',
+fn: function (aClass){
+var self=this;
+return self._isMemberOf_(aClass)._ifTrue_ifFalse_((function(){return true;}),(function(){return self._class()._inheritsFrom_(aClass);}));
+return self;},
+source: unescape('isKindOf%3A%20aClass%0A%09%5E%28self%20isMemberOf%3A%20aClass%29%0A%09%20%20%20%20ifTrue%3A%20%5Btrue%5D%0A%09%20%20%20%20ifFalse%3A%20%5Bself%20class%20inheritsFrom%3A%20aClass%5D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_isMemberOf_',
+smalltalk.method({
+selector: 'isMemberOf:',
+category: 'testing',
+fn: function (aClass){
+var self=this;
+return self._class().__eq(aClass);
+return self;},
+source: unescape('isMemberOf%3A%20aClass%0A%09%5Eself%20class%20%3D%20aClass%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_ifNil_',
+smalltalk.method({
+selector: 'ifNil:',
+category: 'testing',
+fn: function (aBlock){
+var self=this;
+return self;
+return self;},
+source: unescape('ifNil%3A%20aBlock%0A%09%5Eself%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_ifNil_ifNotNil_',
+smalltalk.method({
+selector: 'ifNil:ifNotNil:',
+category: 'testing',
+fn: function (aBlock, anotherBlock){
+var self=this;
+return anotherBlock._value();
+return self;},
+source: unescape('ifNil%3A%20aBlock%20ifNotNil%3A%20anotherBlock%0A%09%5EanotherBlock%20value%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_ifNotNil_',
+smalltalk.method({
+selector: 'ifNotNil:',
+category: 'testing',
+fn: function (aBlock){
+var self=this;
+return aBlock._value();
+return self;},
+source: unescape('ifNotNil%3A%20aBlock%0A%09%5EaBlock%20value%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_ifNotNil_ifNil_',
+smalltalk.method({
+selector: 'ifNotNil:ifNil:',
+category: 'testing',
+fn: function (aBlock, anotherBlock){
+var self=this;
+return aBlock._value();
+return self;},
+source: unescape('ifNotNil%3A%20aBlock%20ifNil%3A%20anotherBlock%0A%09%5EaBlock%20value%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_isNil',
+smalltalk.method({
+selector: 'isNil',
+category: 'testing',
+fn: function (){
+var self=this;
+return false;
+return self;},
+source: unescape('isNil%0A%09%5Efalse%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_notNil',
+smalltalk.method({
+selector: 'notNil',
+category: 'testing',
+fn: function (){
+var self=this;
+return self._isNil()._not();
+return self;},
+source: unescape('notNil%0A%09%5Eself%20isNil%20not%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_isClass',
+smalltalk.method({
+selector: 'isClass',
+category: 'testing',
+fn: function (){
+var self=this;
+return false;
+return self;},
+source: unescape('isClass%0A%09%5Efalse%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_isMetaclass',
+smalltalk.method({
+selector: 'isMetaclass',
+category: 'testing',
+fn: function (){
+var self=this;
+return false;
+return self;},
+source: unescape('isMetaclass%0A%09%5Efalse%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_isNumber',
+smalltalk.method({
+selector: 'isNumber',
+category: 'testing',
+fn: function (){
+var self=this;
+return false;
+return self;},
+source: unescape('isNumber%0A%09%5Efalse%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_isString',
+smalltalk.method({
+selector: 'isString',
+category: 'testing',
+fn: function (){
+var self=this;
+return false;
+return self;},
+source: unescape('isString%0A%09%5Efalse%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_isParseFailure',
+smalltalk.method({
+selector: 'isParseFailure',
+category: 'testing',
+fn: function (){
+var self=this;
+return false;
+return self;},
+source: unescape('isParseFailure%0A%09%5Efalse%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_basicPerform_',
+smalltalk.method({
+selector: 'basicPerform:',
+category: 'error handling',
+fn: function (aSymbol){
+var self=this;
+return self._basicPerform_withArguments_(aSymbol,[]);
+return self;},
+source: unescape('basicPerform%3A%20aSymbol%20%0A%20%20%20%20%5Eself%20basicPerform%3A%20aSymbol%20withArguments%3A%20%23%28%29%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_basicPerform_withArguments_',
+smalltalk.method({
+selector: 'basicPerform:withArguments:',
+category: 'error handling',
+fn: function (aSymbol, aCollection){
+var self=this;
+return (function(){return self[aSymbol].apply(self, aCollection);})();
+return self;},
+source: unescape('basicPerform%3A%20aSymbol%20withArguments%3A%20aCollection%0A%09%5E%7B%27return%20self%5BaSymbol%5D.apply%28self%2C%20aCollection%29%3B%27%7D%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_appendToBrush_',
+smalltalk.method({
+selector: 'appendToBrush:',
+category: '*Canvas',
+fn: function (aTagBrush){
+var self=this;
+aTagBrush._append_(self._asString());
+return self;},
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20append%3A%20self%20asString%0A')}),
+smalltalk.Object);
+
+smalltalk.addMethod(
+'_basicDelete_',
+smalltalk.method({
+selector: 'basicDelete:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+(function(){delete self[aString]})();
+return self;},
+source: unescape('basicDelete%3A%20aString%0A%20%20%20%20%7B%27delete%20self%5BaString%5D%27%7D%0A')}),
+smalltalk.Object);
+
+
+
+smalltalk.addClass('Smalltalk', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_classes',
+smalltalk.method({
+selector: 'classes',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.classes()})();
+return self;},
+source: unescape('classes%0A%09%5E%7B%27return%20self.classes%28%29%27%7D%0A')}),
+smalltalk.Smalltalk);
+
+
+smalltalk.Smalltalk.klass.iVarNames = ['current'];
+smalltalk.addMethod(
+'_current',
+smalltalk.method({
+selector: 'current',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return smalltalk})();
+return self;},
+source: unescape('current%0A%09%20%20%20%20%5E%7B%27return%20smalltalk%27%7D%0A')}),
+smalltalk.Smalltalk.klass);
+
+
+smalltalk.addClass('Behavior', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_new',
+smalltalk.method({
+selector: 'new',
+category: 'instance creation',
+fn: function (){
+var self=this;
+return (function($rec){$rec._initialize();return $rec._yourself();})(self._basicNew());
+return self;},
+source: unescape('new%0A%09%5Eself%20basicNew%20%0A%09%20%20%20%20initialize%3B%0A%09%20%20%20%20yourself%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_basicNew',
+smalltalk.method({
+selector: 'basicNew',
+category: 'instance creation',
+fn: function (){
+var self=this;
+return (function(){return new self.fn();})();
+return self;},
+source: unescape('basicNew%0A%09%5E%7B%27return%20new%20self.fn%28%29%3B%27%7D%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_name',
+smalltalk.method({
+selector: 'name',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.className || nil})();
+return self;},
+source: unescape('name%0A%09%5E%7B%27return%20self.className%20%7C%7C%20nil%27%7D%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_superclass',
+smalltalk.method({
+selector: 'superclass',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.superclass || nil})();
+return self;},
+source: unescape('superclass%0A%09%5E%7B%27return%20self.superclass%20%7C%7C%20nil%27%7D%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_subclasses',
+smalltalk.method({
+selector: 'subclasses',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return smalltalk.subclasses(self)})();
+return self;},
+source: unescape('subclasses%0A%09%5E%7B%27return%20smalltalk.subclasses%28self%29%27%7D%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_allSubclasses',
+smalltalk.method({
+selector: 'allSubclasses',
+category: 'accessing',
+fn: function (){
+var self=this;
+var result=nil;
+result=self._subclasses();
+self._subclasses()._do_((function(each){return result._addAll_(each._allSubclasses());}));
+return result;
+return self;},
+source: unescape('allSubclasses%0A%09%7C%20result%20%7C%0A%09result%20%3A%3D%20self%20subclasses.%0A%09self%20subclasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20result%20addAll%3A%20each%20allSubclasses%5D.%0A%09%5Eresult%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_withAllSubclasses',
+smalltalk.method({
+selector: 'withAllSubclasses',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function($rec){$rec._addAll_(self._allSubclasses());return $rec._yourself();})(smalltalk.Array._with_(self));
+return self;},
+source: unescape('withAllSubclasses%0A%09%5E%28Array%20with%3A%20self%29%20addAll%3A%20self%20allSubclasses%3B%20yourself%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_prototype',
+smalltalk.method({
+selector: 'prototype',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.fn.prototype})();
+return self;},
+source: unescape('prototype%0A%09%5E%7B%27return%20self.fn.prototype%27%7D%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_methodDictionary',
+smalltalk.method({
+selector: 'methodDictionary',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){var dict = smalltalk.Dictionary._new();
+	var methods = self.fn.prototype.methods;
+	for(var i in methods) {
+		if(methods[i].selector) {
+			dict._at_put_(methods[i].selector, methods[i]);
+		}
+	};
+	return dict})();
+return self;},
+source: unescape('methodDictionary%0A%09%5E%7B%27var%20dict%20%3D%20smalltalk.Dictionary._new%28%29%3B%0A%09var%20methods%20%3D%20self.fn.prototype.methods%3B%0A%09for%28var%20i%20in%20methods%29%20%7B%0A%09%09if%28methods%5Bi%5D.selector%29%20%7B%0A%09%09%09dict._at_put_%28methods%5Bi%5D.selector%2C%20methods%5Bi%5D%29%3B%0A%09%09%7D%0A%09%7D%3B%0A%09return%20dict%27%7D%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_instVarNames',
+smalltalk.method({
+selector: 'instVarNames',
+category: '',
+fn: function () { var self = this; return function () {return self.iVarNames;}(); return self; },
+source: unescape('')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_methodsFor_',
+smalltalk.method({
+selector: 'methodsFor:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return (function($rec){$rec._class_category_(self,aString);return $rec._yourself();})(smalltalk.ClassCategoryReader._new());
+return self;},
+source: unescape('methodsFor%3A%20aString%0A%09%5EClassCategoryReader%20new%0A%09%20%20%20%20class%3A%20self%20category%3A%20aString%3B%0A%09%20%20%20%20yourself%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_addCompiledMethod_',
+smalltalk.method({
+selector: 'addCompiledMethod:',
+category: 'accessing',
+fn: function (aMethod){
+var self=this;
+(function(){self.fn.prototype[aMethod.selector._asSelector()] = aMethod.fn;
+	self.fn.prototype.methods[aMethod.selector] = aMethod})();
+return self;},
+source: unescape('addCompiledMethod%3A%20aMethod%0A%09%7B%27self.fn.prototype%5BaMethod.selector._asSelector%28%29%5D%20%3D%20aMethod.fn%3B%0A%09self.fn.prototype.methods%5BaMethod.selector%5D%20%3D%20aMethod%27%7D%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_instanceVariableNames',
+smalltalk.method({
+selector: 'instanceVariableNames',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.iVarNames})();
+return self;},
+source: unescape('instanceVariableNames%0A%09%5E%7B%27return%20self.iVarNames%27%7D%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_comment',
+smalltalk.method({
+selector: 'comment',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._basicAt_("comment")._ifNil_((function(){return "";}));
+return self;},
+source: unescape('comment%0A%20%20%20%20%5E%28self%20basicAt%3A%20%27comment%27%29%20ifNil%3A%20%5B%27%27%5D%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_comment_',
+smalltalk.method({
+selector: 'comment:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+self._basicAt_put_("comment",aString);
+return self;},
+source: unescape('comment%3A%20aString%0A%20%20%20%20self%20basicAt%3A%20%27comment%27%20put%3A%20aString%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_commentStamp',
+smalltalk.method({
+selector: 'commentStamp',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function($rec){$rec._class_(self);return $rec._yourself();})(smalltalk.ClassCommentReader._new());
+return self;},
+source: unescape('commentStamp%0A%20%20%20%20%5EClassCommentReader%20new%0A%09class%3A%20self%3B%0A%09yourself%0A')}),
+smalltalk.Behavior);
+
+smalltalk.addMethod(
+'_removeCompiledMethod_',
+smalltalk.method({
+selector: 'removeCompiledMethod:',
+category: 'accessing',
+fn: function (aMethod){
+var self=this;
+(function(){delete self.fn.prototype[aMethod.selector._asSelector()];
+	delete self.fn.prototype.methods[aMethod.selector]})();
+return self;},
+source: unescape('removeCompiledMethod%3A%20aMethod%0A%09%7B%27delete%20self.fn.prototype%5BaMethod.selector._asSelector%28%29%5D%3B%0A%09delete%20self.fn.prototype.methods%5BaMethod.selector%5D%27%7D%0A')}),
+smalltalk.Behavior);
+
+
+
+smalltalk.addClass('Class', smalltalk.Behavior, [], 'Kernel');
+smalltalk.addMethod(
+'_category',
+smalltalk.method({
+selector: 'category',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.category})();
+return self;},
+source: unescape('category%0A%09%5E%7B%27return%20self.category%27%7D%0A')}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_category_',
+smalltalk.method({
+selector: 'category:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+(function(){self.category = aString})();
+return self;},
+source: unescape('category%3A%20aString%0A%09%7B%27self.category%20%3D%20aString%27%7D%0A')}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_subclass_instanceVariableNames_',
+smalltalk.method({
+selector: 'subclass:instanceVariableNames:',
+category: 'class creation',
+fn: function (aString, anotherString){
+var self=this;
+return self._subclass_instanceVariableNames_category_(aString,anotherString,nil);
+return self;},
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20category%3A%20nil%0A')}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_subclass_instanceVariableNames_category_',
+smalltalk.method({
+selector: 'subclass:instanceVariableNames:category:',
+category: 'class creation',
+fn: function (aString, aString2, aString3){
+var self=this;
+return smalltalk.ClassBuilder._new()._superclass_subclass_instanceVariableNames_category_(self,aString,aString2,aString3);
+return self;},
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A')}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_isClass',
+smalltalk.method({
+selector: 'isClass',
+category: 'testing',
+fn: function (){
+var self=this;
+return true;
+return self;},
+source: unescape('isClass%0A%09%5Etrue%0A')}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_printString',
+smalltalk.method({
+selector: 'printString',
+category: 'printing',
+fn: function (){
+var self=this;
+return self._name();
+return self;},
+source: unescape('printString%0A%09%5Eself%20name%0A')}),
+smalltalk.Class);
+
+
+
+smalltalk.addClass('Metaclass', smalltalk.Behavior, [], 'Kernel');
+smalltalk.addMethod(
+'_instanceClass',
+smalltalk.method({
+selector: 'instanceClass',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.instanceClass})();
+return self;},
+source: unescape('instanceClass%0A%09%5E%7B%27return%20self.instanceClass%27%7D%0A')}),
+smalltalk.Metaclass);
+
+smalltalk.addMethod(
+'_instanceVariableNames_',
+smalltalk.method({
+selector: 'instanceVariableNames:',
+category: 'accessing',
+fn: function (aCollection){
+var self=this;
+smalltalk.ClassBuilder._new()._class_instanceVariableNames_(self,aCollection);
+return self;},
+source: unescape('instanceVariableNames%3A%20aCollection%0A%09ClassBuilder%20new%0A%09%20%20%20%20class%3A%20self%20instanceVariableNames%3A%20aCollection%0A')}),
+smalltalk.Metaclass);
+
+smalltalk.addMethod(
+'_isMetaclass',
+smalltalk.method({
+selector: 'isMetaclass',
+category: 'testing',
+fn: function (){
+var self=this;
+return true;
+return self;},
+source: unescape('isMetaclass%0A%09%5Etrue%0A')}),
+smalltalk.Metaclass);
+
+smalltalk.addMethod(
+'_printString',
+smalltalk.method({
+selector: 'printString',
+category: 'printing',
+fn: function (){
+var self=this;
+return self._instanceClass()._name().__comma(" class");
+return self;},
+source: unescape('printString%0A%09%5Eself%20instanceClass%20name%2C%20%27%20class%27%0A')}),
+smalltalk.Metaclass);
+
+
+
+smalltalk.addClass('CompiledMethod', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_source',
+smalltalk.method({
+selector: 'source',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._basicAt_("source")._ifNil_((function(){return "";}));
+return self;},
+source: unescape('source%0A%09%5E%28self%20basicAt%3A%20%27source%27%29%20ifNil%3A%20%5B%27%27%5D%0A')}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+'_source_',
+smalltalk.method({
+selector: 'source:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+self._basicAt_put_("source",aString);
+return self;},
+source: unescape('source%3A%20aString%0A%09self%20basicAt%3A%20%27source%27%20put%3A%20aString%0A')}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+'_category',
+smalltalk.method({
+selector: 'category',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._basicAt_("category")._ifNil_((function(){return "";}));
+return self;},
+source: unescape('category%0A%09%5E%28self%20basicAt%3A%20%27category%27%29%20ifNil%3A%20%5B%27%27%5D%0A')}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+'_category_',
+smalltalk.method({
+selector: 'category:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+self._basicAt_put_("category",aString);
+return self;},
+source: unescape('category%3A%20aString%0A%09self%20basicAt%3A%20%27category%27%20put%3A%20aString%0A')}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+'_selector',
+smalltalk.method({
+selector: 'selector',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._basicAt_("selector");
+return self;},
+source: unescape('selector%0A%09%5Eself%20basicAt%3A%20%27selector%27%0A')}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+'_selector_',
+smalltalk.method({
+selector: 'selector:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+self._basicAt_put_("selector",aString);
+return self;},
+source: unescape('selector%3A%20aString%0A%09self%20basicAt%3A%20%27selector%27%20put%3A%20aString%0A')}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+'_fn',
+smalltalk.method({
+selector: 'fn',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._basicAt_("fn");
+return self;},
+source: unescape('fn%0A%09%5Eself%20basicAt%3A%20%27fn%27%0A')}),
+smalltalk.CompiledMethod);
+
+smalltalk.addMethod(
+'_fn_',
+smalltalk.method({
+selector: 'fn:',
+category: 'accessing',
+fn: function (aBlock){
+var self=this;
+self._basicAt_put_("fn",aBlock);
+return self;},
+source: unescape('fn%3A%20aBlock%0A%09self%20basicAt%3A%20%27fn%27%20put%3A%20aBlock%0A')}),
+smalltalk.CompiledMethod);
+
+
+
+smalltalk.addClass('Number', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'__eq',
+smalltalk.method({
+selector: '=',
+category: 'comparing',
+fn: function (aNumber){
+var self=this;
+return (function(){return Number(self) == aNumber})();
+return self;},
+source: unescape('%3D%20aNumber%0A%09%5E%7B%27return%20Number%28self%29%20%3D%3D%20aNumber%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'__gt',
+smalltalk.method({
+selector: '>',
+category: 'comparing',
+fn: function (aNumber){
+var self=this;
+return (function(){return self > aNumber})();
+return self;},
+source: unescape('%3E%20aNumber%0A%09%5E%7B%27return%20self%20%3E%20aNumber%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'__lt',
+smalltalk.method({
+selector: '<',
+category: 'comparing',
+fn: function (aNumber){
+var self=this;
+return (function(){return self < aNumber})();
+return self;},
+source: unescape('%3C%20aNumber%0A%09%5E%7B%27return%20self%20%3C%20aNumber%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'__gt_eq',
+smalltalk.method({
+selector: '>=',
+category: 'comparing',
+fn: function (aNumber){
+var self=this;
+return (function(){return self >= aNumber})();
+return self;},
+source: unescape('%3E%3D%20aNumber%0A%09%5E%7B%27return%20self%20%3E%3D%20aNumber%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'__lt_eq',
+smalltalk.method({
+selector: '<=',
+category: 'comparing',
+fn: function (aNumber){
+var self=this;
+return (function(){return self <= aNumber})();
+return self;},
+source: unescape('%3C%3D%20aNumber%0A%09%5E%7B%27return%20self%20%3C%3D%20aNumber%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'__plus',
+smalltalk.method({
+selector: '+',
+category: 'arithmetic',
+fn: function (aNumber){
+var self=this;
+return (function(){return self + aNumber})();
+return self;},
+source: unescape('+%20aNumber%0A%09%5E%7B%27return%20self%20+%20aNumber%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'__minus',
+smalltalk.method({
+selector: '-',
+category: 'arithmetic',
+fn: function (aNumber){
+var self=this;
+return (function(){return self - aNumber})();
+return self;},
+source: unescape('-%20aNumber%0A%09%5E%7B%27return%20self%20-%20aNumber%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'__star',
+smalltalk.method({
+selector: '*',
+category: 'arithmetic',
+fn: function (aNumber){
+var self=this;
+return (function(){return self * aNumber})();
+return self;},
+source: unescape('*%20aNumber%0A%09%5E%7B%27return%20self%20*%20aNumber%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'__slash',
+smalltalk.method({
+selector: '/',
+category: 'arithmetic',
+fn: function (aNumber){
+var self=this;
+return (function(){return self / aNumber})();
+return self;},
+source: unescape('/%20aNumber%0A%09%5E%7B%27return%20self%20/%20aNumber%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_max_',
+smalltalk.method({
+selector: 'max:',
+category: 'arithmetic',
+fn: function (aNumber){
+var self=this;
+return (function(){return Math.max(self, aNumber);})();
+return self;},
+source: unescape('max%3A%20aNumber%0A%09%5E%7B%27return%20Math.max%28self%2C%20aNumber%29%3B%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_min_',
+smalltalk.method({
+selector: 'min:',
+category: 'arithmetic',
+fn: function (aNumber){
+var self=this;
+return (function(){return Math.min(self, aNumber);})();
+return self;},
+source: unescape('min%3A%20aNumber%0A%09%5E%7B%27return%20Math.min%28self%2C%20aNumber%29%3B%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_rounded',
+smalltalk.method({
+selector: 'rounded',
+category: 'converting',
+fn: function (){
+var self=this;
+return (function(){return Math.round(self);})();
+return self;},
+source: unescape('rounded%0A%09%5E%7B%27return%20Math.round%28self%29%3B%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_truncated',
+smalltalk.method({
+selector: 'truncated',
+category: 'converting',
+fn: function (){
+var self=this;
+return (function(){return Math.floor(self);})();
+return self;},
+source: unescape('truncated%0A%09%5E%7B%27return%20Math.floor%28self%29%3B%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_to_',
+smalltalk.method({
+selector: 'to:',
+category: 'converting',
+fn: function (aNumber){
+var self=this;
+var array=nil;
+var first=nil;
+var last=nil;
+var count=nil;
+first=self._truncated();
+last=aNumber._truncated().__plus((1));
+count=(1);
+first.__lt_eq(last)._ifFalse_((function(){return self._error_("Wrong interval");}));
+array=smalltalk.Array._new();
+last.__minus(first)._timesRepeat_((function(){array._at_put_(count,first);count=count.__plus((1));return first=first.__plus((1));}));
+return array;
+return self;},
+source: unescape('to%3A%20aNumber%0A%09%7C%20array%20first%20last%20count%20%7C%0A%09first%20%3A%3D%20self%20truncated.%0A%09last%20%3A%3D%20aNumber%20truncated%20+%201.%0A%09count%20%3A%3D%201.%0A%09%28first%20%3C%3D%20last%29%20ifFalse%3A%20%5Bself%20error%3A%20%27Wrong%20interval%27%5D.%0A%09array%20%3A%3D%20Array%20new.%0A%09%28last%20-%20first%29%20timesRepeat%3A%20%5B%0A%09%20%20%20%20array%20at%3A%20count%20put%3A%20first.%0A%09%20%20%20%20count%20%3A%3D%20count%20+%201.%0A%09%20%20%20%20first%20%3A%3D%20first%20+%201%5D.%0A%09%5Earray%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_timesRepeat_',
+smalltalk.method({
+selector: 'timesRepeat:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+var integer=nil;
+var count=nil;
+integer=self._truncated();
+count=(1);
+(function(){return count.__gt(self);})._whileFalse_((function(){aBlock._value();return count=count.__plus((1));}));
+return self;},
+source: unescape('timesRepeat%3A%20aBlock%0A%09%7C%20integer%20count%20%7C%0A%09integer%20%3A%3D%20self%20truncated.%0A%09count%20%3A%3D%201.%0A%09%5Bcount%20%3E%20self%5D%20whileFalse%3A%20%5B%0A%09%20%20%20%20aBlock%20value.%0A%09%20%20%20%20count%20%3A%3D%20count%20+%201%5D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_to_do_',
+smalltalk.method({
+selector: 'to:do:',
+category: 'enumerating',
+fn: function (aNumber, aBlock){
+var self=this;
+return self._to_(aNumber)._do_(aBlock);
+return self;},
+source: unescape('to%3A%20aNumber%20do%3A%20aBlock%0A%09%5E%28self%20to%3A%20aNumber%29%20do%3A%20aBlock%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_asString',
+smalltalk.method({
+selector: 'asString',
+category: 'converting',
+fn: function (){
+var self=this;
+return self._printString();
+return self;},
+source: unescape('asString%0A%09%5Eself%20printString%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_asJavascript',
+smalltalk.method({
+selector: 'asJavascript',
+category: 'converting',
+fn: function (){
+var self=this;
+return unescape("%28").__comma(self._printString()).__comma(unescape("%29"));
+return self;},
+source: unescape('asJavascript%0A%09%5E%27%28%27%2C%20self%20printString%2C%20%27%29%27%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_printString',
+smalltalk.method({
+selector: 'printString',
+category: 'printing',
+fn: function (){
+var self=this;
+return (function(){return String(self)})();
+return self;},
+source: unescape('printString%0A%09%5E%7B%27return%20String%28self%29%27%7D%0A')}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_isNumber',
+smalltalk.method({
+selector: 'isNumber',
+category: 'testing',
+fn: function (){
+var self=this;
+return true;
+return self;},
+source: unescape('isNumber%0A%09%5Etrue%0A')}),
+smalltalk.Number);
+
+
+
+smalltalk.addClass('BlockClosure', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_compiledSource',
+smalltalk.method({
+selector: 'compiledSource',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.toString()})();
+return self;},
+source: unescape('compiledSource%0A%09%5E%7B%27return%20self.toString%28%29%27%7D%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_whileTrue_',
+smalltalk.method({
+selector: 'whileTrue:',
+category: 'controlling',
+fn: function (aBlock){
+var self=this;
+(function(){while(self()) {aBlock()}})();
+return self;},
+source: unescape('whileTrue%3A%20aBlock%0A%09%7B%27while%28self%28%29%29%20%7BaBlock%28%29%7D%27%7D%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_whileFalse_',
+smalltalk.method({
+selector: 'whileFalse:',
+category: 'controlling',
+fn: function (aBlock){
+var self=this;
+(function(){while(!self()) {aBlock()}})();
+return self;},
+source: unescape('whileFalse%3A%20aBlock%0A%09%7B%27while%28%21self%28%29%29%20%7BaBlock%28%29%7D%27%7D%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_value',
+smalltalk.method({
+selector: 'value',
+category: 'evaluating',
+fn: function (){
+var self=this;
+return (function(){return self();})();
+return self;},
+source: unescape('value%0A%09%5E%7B%27return%20self%28%29%3B%27%7D%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_value_',
+smalltalk.method({
+selector: 'value:',
+category: 'evaluating',
+fn: function (anArg){
+var self=this;
+return (function(){return self(anArg);})();
+return self;},
+source: unescape('value%3A%20anArg%0A%09%5E%7B%27return%20self%28anArg%29%3B%27%7D%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_value_value_',
+smalltalk.method({
+selector: 'value:value:',
+category: 'evaluating',
+fn: function (firstArg, secondArg){
+var self=this;
+return (function(){return self(firstArg, secondArg);})();
+return self;},
+source: unescape('value%3A%20firstArg%20value%3A%20secondArg%0A%09%5E%7B%27return%20self%28firstArg%2C%20secondArg%29%3B%27%7D%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_value_value_value_',
+smalltalk.method({
+selector: 'value:value:value:',
+category: 'evaluating',
+fn: function (firstArg, secondArg, thirdArg){
+var self=this;
+return (function(){return self(firstArg, secondArg, thirdArg);})();
+return self;},
+source: unescape('value%3A%20firstArg%20value%3A%20secondArg%20value%3A%20thirdArg%0A%09%5E%7B%27return%20self%28firstArg%2C%20secondArg%2C%20thirdArg%29%3B%27%7D%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_valueWithPossibleArguments_',
+smalltalk.method({
+selector: 'valueWithPossibleArguments:',
+category: 'evaluating',
+fn: function (aCollection){
+var self=this;
+return (function(){return self.apply(null, aCollection);})();
+return self;},
+source: unescape('valueWithPossibleArguments%3A%20aCollection%0A%09%5E%7B%27return%20self.apply%28null%2C%20aCollection%29%3B%27%7D%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_on_do_',
+smalltalk.method({
+selector: 'on:do:',
+category: 'error handling',
+fn: function (anErrorClass, aBlock){
+var self=this;
+self._try_catch_(self,(function(error){return error._isKindOf_(anErrorClass)._ifTrue_ifFalse_((function(){return aBlock._value();}),(function(){return error._signal();}));}));
+return self;},
+source: unescape('on%3A%20anErrorClass%20do%3A%20aBlock%0A%09self%20try%3A%20self%20catch%3A%20%5B%3Aerror%20%7C%0A%09%20%20%20%20%28error%20isKindOf%3A%20anErrorClass%29%20%0A%09%20%20%20%20%20ifTrue%3A%20%5BaBlock%20value%5D%0A%09%20%20%20%20%20ifFalse%3A%20%5Berror%20signal%5D%5D%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_appendToJQuery_',
+smalltalk.method({
+selector: 'appendToJQuery:',
+category: '*JQuery',
+fn: function (aJQuery){
+var self=this;
+var canvas=nil;
+canvas=smalltalk.HTMLCanvas._new();
+self._value_(canvas);
+aJQuery._append_(canvas);
+return self;},
+source: unescape('appendToJQuery%3A%20aJQuery%0A%09%7C%20canvas%20%7C%0A%09canvas%20%3A%3D%20HTMLCanvas%20new.%0A%09self%20value%3A%20canvas.%0A%09aJQuery%20append%3A%20canvas%0A')}),
+smalltalk.BlockClosure);
+
+smalltalk.addMethod(
+'_appendToBrush_',
+smalltalk.method({
+selector: 'appendToBrush:',
+category: '*Canvas',
+fn: function (aTagBrush){
+var self=this;
+aTagBrush._appendBlock_(self);
+return self;},
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20appendBlock%3A%20self%0A')}),
+smalltalk.BlockClosure);
+
+
+
+smalltalk.addClass('Boolean', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'__eq',
+smalltalk.method({
+selector: '=',
+category: 'comparing',
+fn: function (aBoolean){
+var self=this;
+return (function(){return Boolean(self == true) == aBoolean})();
+return self;},
+source: unescape('%3D%20aBoolean%0A%20%20%20%20%09%5E%7B%27return%20Boolean%28self%20%3D%3D%20true%29%20%3D%3D%20aBoolean%27%7D%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_shallowCopy',
+smalltalk.method({
+selector: 'shallowCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+return self;
+return self;},
+source: unescape('shallowCopy%0A%09%5Eself%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_deepCopy',
+smalltalk.method({
+selector: 'deepCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+return self;
+return self;},
+source: unescape('deepCopy%0A%09%5Eself%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_ifTrue_',
+smalltalk.method({
+selector: 'ifTrue:',
+category: 'controlling',
+fn: function (aBlock){
+var self=this;
+return self._ifTrue_ifFalse_(aBlock,(function(){return nil;}));
+return self;},
+source: unescape('ifTrue%3A%20aBlock%0A%09%5Eself%20ifTrue%3A%20aBlock%20ifFalse%3A%20%5B%5D%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_ifFalse_',
+smalltalk.method({
+selector: 'ifFalse:',
+category: 'controlling',
+fn: function (aBlock){
+var self=this;
+return self._ifTrue_ifFalse_((function(){return nil;}),aBlock);
+return self;},
+source: unescape('ifFalse%3A%20aBlock%0A%09%5Eself%20ifTrue%3A%20%5B%5D%20ifFalse%3A%20aBlock%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_ifFalse_ifTrue_',
+smalltalk.method({
+selector: 'ifFalse:ifTrue:',
+category: 'controlling',
+fn: function (aBlock, anotherBlock){
+var self=this;
+return self._ifTrue_ifFalse_(anotherBlock,aBlock);
+return self;},
+source: unescape('ifFalse%3A%20aBlock%20ifTrue%3A%20anotherBlock%0A%09%5Eself%20ifTrue%3A%20anotherBlock%20ifFalse%3A%20aBlock%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_ifTrue_ifFalse_',
+smalltalk.method({
+selector: 'ifTrue:ifFalse:',
+category: 'controlling',
+fn: function (aBlock, anotherBlock){
+var self=this;
+return (function(){
+	    if(self == true) {
+		return aBlock();
+	    } else {
+		return anotherBlock();
+	    }
+	})();
+return self;},
+source: unescape('ifTrue%3A%20aBlock%20ifFalse%3A%20anotherBlock%0A%09%5E%7B%27%0A%09%20%20%20%20if%28self%20%3D%3D%20true%29%20%7B%0A%09%09return%20aBlock%28%29%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20anotherBlock%28%29%3B%0A%09%20%20%20%20%7D%0A%09%27%7D%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_and_',
+smalltalk.method({
+selector: 'and:',
+category: 'controlling',
+fn: function (aBlock){
+var self=this;
+return self.__eq(true)._ifTrue_ifFalse_(aBlock,(function(){return false;}));
+return self;},
+source: unescape('and%3A%20aBlock%0A%09%5Eself%20%3D%20true%0A%09%20%20%20%20ifTrue%3A%20aBlock%0A%09%20%20%20%20ifFalse%3A%20%5Bfalse%5D%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_or_',
+smalltalk.method({
+selector: 'or:',
+category: 'controlling',
+fn: function (aBlock){
+var self=this;
+return self.__eq(true)._ifTrue_ifFalse_((function(){return true;}),aBlock);
+return self;},
+source: unescape('or%3A%20aBlock%0A%09%5Eself%20%3D%20true%0A%09%20%20%20%20ifTrue%3A%20%5Btrue%5D%0A%09%20%20%20%20ifFalse%3A%20aBlock%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_not',
+smalltalk.method({
+selector: 'not',
+category: 'controlling',
+fn: function (){
+var self=this;
+return self.__eq(false);
+return self;},
+source: unescape('not%0A%09%5Eself%20%3D%20false%0A')}),
+smalltalk.Boolean);
+
+smalltalk.addMethod(
+'_printString',
+smalltalk.method({
+selector: 'printString',
+category: 'printing',
+fn: function (){
+var self=this;
+return (function(){return self.toString()})();
+return self;},
+source: unescape('printString%0A%09%5E%7B%27return%20self.toString%28%29%27%7D%0A')}),
+smalltalk.Boolean);
+
+
+
+smalltalk.addClass('UndefinedObject', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_subclass_instanceVariableNames_',
+smalltalk.method({
+selector: 'subclass:instanceVariableNames:',
+category: 'class creation',
+fn: function (aString, anotherString){
+var self=this;
+return self._subclass_instanceVariableNames_category_(aString,anotherString,nil);
+return self;},
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20category%3A%20nil%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_subclass_instanceVariableNames_category_',
+smalltalk.method({
+selector: 'subclass:instanceVariableNames:category:',
+category: 'class creation',
+fn: function (aString, aString2, aString3){
+var self=this;
+return smalltalk.ClassBuilder._new()._superclass_subclass_instanceVariableNames_category_(self,aString,aString2,aString3);
+return self;},
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_shallowCopy',
+smalltalk.method({
+selector: 'shallowCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+return self;
+return self;},
+source: unescape('shallowCopy%0A%09%5Eself%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_deepCopy',
+smalltalk.method({
+selector: 'deepCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+return self;
+return self;},
+source: unescape('deepCopy%0A%09%5Eself%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_ifNil_',
+smalltalk.method({
+selector: 'ifNil:',
+category: 'testing',
+fn: function (aBlock){
+var self=this;
+return self._ifNil_ifNotNil_(aBlock,(function(){return nil;}));
+return self;},
+source: unescape('ifNil%3A%20aBlock%0A%09%5Eself%20ifNil%3A%20aBlock%20ifNotNil%3A%20%5B%5D%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_ifNotNil_',
+smalltalk.method({
+selector: 'ifNotNil:',
+category: 'testing',
+fn: function (aBlock){
+var self=this;
+return self;
+return self;},
+source: unescape('ifNotNil%3A%20aBlock%0A%09%5Eself%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_ifNil_ifNotNil_',
+smalltalk.method({
+selector: 'ifNil:ifNotNil:',
+category: 'testing',
+fn: function (aBlock, anotherBlock){
+var self=this;
+return aBlock._value();
+return self;},
+source: unescape('ifNil%3A%20aBlock%20ifNotNil%3A%20anotherBlock%0A%09%5EaBlock%20value%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_ifNotNil_ifNil_',
+smalltalk.method({
+selector: 'ifNotNil:ifNil:',
+category: 'testing',
+fn: function (aBlock, anotherBlock){
+var self=this;
+return anotherBlock._value();
+return self;},
+source: unescape('ifNotNil%3A%20aBlock%20ifNil%3A%20anotherBlock%0A%09%5EanotherBlock%20value%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_isNil',
+smalltalk.method({
+selector: 'isNil',
+category: 'testing',
+fn: function (){
+var self=this;
+return true;
+return self;},
+source: unescape('isNil%0A%09%5Etrue%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_notNil',
+smalltalk.method({
+selector: 'notNil',
+category: 'testing',
+fn: function (){
+var self=this;
+return false;
+return self;},
+source: unescape('notNil%0A%09%5Efalse%0A')}),
+smalltalk.UndefinedObject);
+
+smalltalk.addMethod(
+'_printString',
+smalltalk.method({
+selector: 'printString',
+category: 'printing',
+fn: function (){
+var self=this;
+return "nil";
+return self;},
+source: unescape('printString%0A%20%20%20%20%5E%27nil%27%0A')}),
+smalltalk.UndefinedObject);
+
+
+smalltalk.addMethod(
+'_new',
+smalltalk.method({
+selector: 'new',
+category: 'instance creation',
+fn: function (){
+var self=this;
+self._error_("You cannot create new instances of UndefinedObject. Use nil");
+return self;},
+source: unescape('new%0A%09%20%20%20%20self%20error%3A%20%27You%20cannot%20create%20new%20instances%20of%20UndefinedObject.%20Use%20nil%27%0A')}),
+smalltalk.UndefinedObject.klass);
+
+
+smalltalk.addClass('Collection', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_size',
+smalltalk.method({
+selector: 'size',
+category: 'accessing',
+fn: function (){
+var self=this;
+self._subclassResponsibility();
+return self;},
+source: unescape('size%0A%09self%20subclassResponsibility%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_at_',
+smalltalk.method({
+selector: 'at:',
+category: 'accessing',
+fn: function (anIndex){
+var self=this;
+return self._at_ifAbsent_(anIndex,(function(){return self._errorNotFound();}));
+return self;},
+source: unescape('at%3A%20anIndex%0A%09%5Eself%20at%3A%20anIndex%20ifAbsent%3A%20%5B%0A%09%20%20%20%20self%20errorNotFound%5D%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_at_put_',
+smalltalk.method({
+selector: 'at:put:',
+category: 'accessing',
+fn: function (anIndex, anObject){
+var self=this;
+self._subclassResponsibility();
+return self;},
+source: unescape('at%3A%20anIndex%20put%3A%20anObject%0A%09self%20subclassResponsibility%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_at_ifAbsent_',
+smalltalk.method({
+selector: 'at:ifAbsent:',
+category: 'accessing',
+fn: function (anIndex, aBlock){
+var self=this;
+self._subclassResponsibility();
+return self;},
+source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09self%20subclassResponsibility%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_first',
+smalltalk.method({
+selector: 'first',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._at_((1));
+return self;},
+source: unescape('first%0A%09%5Eself%20at%3A%201%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_second',
+smalltalk.method({
+selector: 'second',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._at_((2));
+return self;},
+source: unescape('second%0A%09%5Eself%20at%3A%202%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_third',
+smalltalk.method({
+selector: 'third',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._at_((3));
+return self;},
+source: unescape('third%0A%09%5Eself%20at%3A%203%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_fourth',
+smalltalk.method({
+selector: 'fourth',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._at_((4));
+return self;},
+source: unescape('fourth%0A%09%5Eself%20at%3A%204%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_last',
+smalltalk.method({
+selector: 'last',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._at_(self._size());
+return self;},
+source: unescape('last%0A%09%5Eself%20at%3A%20self%20size%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_readStream',
+smalltalk.method({
+selector: 'readStream',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._stream();
+return self;},
+source: unescape('readStream%0A%09%5Eself%20stream%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_writeStream',
+smalltalk.method({
+selector: 'writeStream',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._stream();
+return self;},
+source: unescape('writeStream%0A%09%5Eself%20stream%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_stream',
+smalltalk.method({
+selector: 'stream',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._streamClass()._on_(self);
+return self;},
+source: unescape('stream%0A%09%5Eself%20streamClass%20on%3A%20self%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_streamClass',
+smalltalk.method({
+selector: 'streamClass',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._class()._streamClass();
+return self;},
+source: unescape('streamClass%0A%09%5Eself%20class%20streamClass%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_add_',
+smalltalk.method({
+selector: 'add:',
+category: 'adding/removing',
+fn: function (anObject){
+var self=this;
+self._subclassResponsibility();
+return self;},
+source: unescape('add%3A%20anObject%0A%09self%20subclassResponsibility%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_addAll_',
+smalltalk.method({
+selector: 'addAll:',
+category: 'adding/removing',
+fn: function (aCollection){
+var self=this;
+aCollection._do_((function(each){return self._add_(each);}));
+return aCollection;
+return self;},
+source: unescape('addAll%3A%20aCollection%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20add%3A%20each%5D.%0A%09%5EaCollection%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'__comma',
+smalltalk.method({
+selector: ',',
+category: 'copying',
+fn: function (aCollection){
+var self=this;
+return (function($rec){$rec._addAll_(aCollection);return $rec._yourself();})(self._copy());
+return self;},
+source: unescape('%2C%20aCollection%0A%09%5Eself%20copy%20%0A%09%20%20%20%20addAll%3A%20aCollection%3B%20%0A%09%20%20%20%20yourself%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_copyFrom_to_',
+smalltalk.method({
+selector: 'copyFrom:to:',
+category: 'copying',
+fn: function (anIndex, anotherIndex){
+var self=this;
+self._subclassResponsibility();
+return self;},
+source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%09self%20subclassResponsibility%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_copyWith_',
+smalltalk.method({
+selector: 'copyWith:',
+category: 'copying',
+fn: function (anObject){
+var self=this;
+return (function($rec){$rec._add_(anObject);return $rec._yourself();})(self._copy());
+return self;},
+source: unescape('copyWith%3A%20anObject%0A%09%5Eself%20copy%20add%3A%20anObject%3B%20yourself%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_copyWithAll_',
+smalltalk.method({
+selector: 'copyWithAll:',
+category: 'copying',
+fn: function (aCollection){
+var self=this;
+return (function($rec){$rec._addAll_(aCollection);return $rec._yourself();})(self._copy());
+return self;},
+source: unescape('copyWithAll%3A%20aCollection%0A%09%5Eself%20copy%20addAll%3A%20aCollection%3B%20yourself%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_asArray',
+smalltalk.method({
+selector: 'asArray',
+category: 'converting',
+fn: function (){
+var self=this;
+var array=nil;
+var index=nil;
+array=smalltalk.Array._new();
+index=(0);
+self._do_((function(each){index=index.__plus((1));return array._at_put_(index,each);}));
+return array;
+return self;},
+source: unescape('asArray%0A%09%7C%20array%20index%20%7C%0A%09array%20%3A%3D%20Array%20new.%0A%09index%20%3A%3D%200.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%20%20%20%20array%20at%3A%20index%20put%3A%20each%5D.%0A%09%5Earray%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_do_',
+smalltalk.method({
+selector: 'do:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+(function(){for(var i=0;i<self.length;i++){aBlock(self[i]);}})();
+return self;},
+source: unescape('do%3A%20aBlock%0A%09%7B%27for%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%7BaBlock%28self%5Bi%5D%29%3B%7D%27%7D%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_collect_',
+smalltalk.method({
+selector: 'collect:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+var stream=nil;
+stream=self._class()._new()._writeStream();
+self._do_((function(each){return stream._nextPut_(aBlock._value_(each));}));
+return stream._contents();
+return self;},
+source: unescape('collect%3A%20aBlock%0A%09%7C%20stream%20%7C%0A%09stream%20%3A%3D%20self%20class%20new%20writeStream.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20stream%20nextPut%3A%20%28aBlock%20value%3A%20each%29%5D.%0A%09%5Estream%20contents%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_detect_',
+smalltalk.method({
+selector: 'detect:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+return self._detect_ifNone_(aBlock,(function(){return self._errorNotFound();}));
+return self;},
+source: unescape('detect%3A%20aBlock%0A%09%5Eself%20detect%3A%20aBlock%20ifNone%3A%20%5Bself%20errorNotFound%5D%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_detect_ifNone_',
+smalltalk.method({
+selector: 'detect:ifNone:',
+category: 'enumerating',
+fn: function (aBlock, anotherBlock){
+var self=this;
+return (function(){
+	for(var i = 0; i < self.length; i++)
+		if(aBlock(self[i]))
+			return self[i];
+	return anotherBlock();
+	})();
+return self;},
+source: unescape('detect%3A%20aBlock%20ifNone%3A%20anotherBlock%0A%09%5E%7B%27%0A%09for%28var%20i%20%3D%200%3B%20i%20%3C%20self.length%3B%20i++%29%0A%09%09if%28aBlock%28self%5Bi%5D%29%29%0A%09%09%09return%20self%5Bi%5D%3B%0A%09return%20anotherBlock%28%29%3B%0A%09%27%7D%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_do_separatedBy_',
+smalltalk.method({
+selector: 'do:separatedBy:',
+category: 'enumerating',
+fn: function (aBlock, anotherBlock){
+var self=this;
+var first=nil;
+first=true;
+self._do_((function(each){first._ifTrue_ifFalse_((function(){return first=false;}),(function(){return anotherBlock._value();}));return aBlock._value_(each);}));
+return self;},
+source: unescape('do%3A%20aBlock%20separatedBy%3A%20anotherBlock%0A%20%20%20%20%09%7C%20first%20%7C%0A%20%20%20%20%09first%20%3A%3D%20true.%0A%20%20%20%20%09self%20do%3A%20%5B%3Aeach%20%7C%0A%20%20%20%20%09%20%20%20%20first%0A%20%20%20%20%09%09ifTrue%3A%20%5Bfirst%20%3A%3D%20false%5D%0A%20%20%20%20%09%09ifFalse%3A%20%5BanotherBlock%20value%5D.%0A%20%20%20%20%09%20%20%20%20aBlock%20value%3A%20each%5D%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_inject_into_',
+smalltalk.method({
+selector: 'inject:into:',
+category: 'enumerating',
+fn: function (anObject, aBlock){
+var self=this;
+var result=nil;
+result=anObject;
+self._do_((function(each){return result=aBlock._value_value_(result,each);}));
+return result;
+return self;},
+source: unescape('inject%3A%20anObject%20into%3A%20aBlock%0A%09%7C%20result%20%7C%0A%09result%20%3A%3D%20anObject.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%20%20%20%20result%20%3A%3D%20aBlock%20value%3A%20result%20value%3A%20each%5D.%0A%09%5Eresult%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_reject_',
+smalltalk.method({
+selector: 'reject:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+return self._select_((function(each){return aBlock._value_(each).__eq(false);}));
+return self;},
+source: unescape('reject%3A%20aBlock%0A%09%5Eself%20select%3A%20%5B%3Aeach%20%7C%20%28aBlock%20value%3A%20each%29%20%3D%20false%5D%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_select_',
+smalltalk.method({
+selector: 'select:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+var stream=nil;
+stream=self._class()._new()._writeStream();
+self._do_((function(each){return aBlock._value_(each)._ifTrue_((function(){return stream._nextPut_(each);}));}));
+return stream._contents();
+return self;},
+source: unescape('select%3A%20aBlock%0A%09%7C%20stream%20%7C%0A%09stream%20%3A%3D%20self%20class%20new%20writeStream.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20%28aBlock%20value%3A%20each%29%20ifTrue%3A%20%5B%0A%09%09stream%20nextPut%3A%20each%5D%5D.%0A%09%5Estream%20contents%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_errorNotFound',
+smalltalk.method({
+selector: 'errorNotFound',
+category: 'error handling',
+fn: function (){
+var self=this;
+self._error_("Object is not in the collection");
+return self;},
+source: unescape('errorNotFound%0A%09self%20error%3A%20%27Object%20is%20not%20in%20the%20collection%27%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_includes_',
+smalltalk.method({
+selector: 'includes:',
+category: 'testing',
+fn: function (anObject){
+var self=this;
+return (function(){
+		var i = self.length;
+		while (i--) {
+			if (self[i].__eq(anObject)) {
+				return true;
+			}	
+		}
+		return false;
+
+	})();
+return self;},
+source: unescape('includes%3A%20anObject%0A%09%5E%7B%27%0A%09%09var%20i%20%3D%20self.length%3B%0A%09%09while%20%28i--%29%20%7B%0A%09%09%09if%20%28self%5Bi%5D.__eq%28anObject%29%29%20%7B%0A%09%09%09%09return%20true%3B%0A%09%09%09%7D%09%0A%09%09%7D%0A%09%09return%20false%3B%0A%0A%09%27%7D%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_notEmpty',
+smalltalk.method({
+selector: 'notEmpty',
+category: 'testing',
+fn: function (){
+var self=this;
+return self._isEmpty()._not();
+return self;},
+source: unescape('notEmpty%0A%09%5Eself%20isEmpty%20not%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_isEmpty',
+smalltalk.method({
+selector: 'isEmpty',
+category: 'testing',
+fn: function (){
+var self=this;
+return self._size().__eq((0));
+return self;},
+source: unescape('isEmpty%0A%09%5Eself%20size%20%3D%200%0A')}),
+smalltalk.Collection);
+
+smalltalk.addMethod(
+'_remove_',
+smalltalk.method({
+selector: 'remove:',
+category: 'adding/removing',
+fn: function (anObject){
+var self=this;
+self._subclassResponsibility();
+return self;},
+source: unescape('remove%3A%20anObject%0A%20%20%20%20self%20subclassResponsibility%0A')}),
+smalltalk.Collection);
+
+
+smalltalk.addMethod(
+'_streamClass',
+smalltalk.method({
+selector: 'streamClass',
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.Stream;
+return self;},
+source: unescape('streamClass%0A%09%20%20%20%20%5EStream%0A')}),
+smalltalk.Collection.klass);
+
+smalltalk.addMethod(
+'_with_',
+smalltalk.method({
+selector: 'with:',
+category: 'instance creation',
+fn: function (anObject){
+var self=this;
+return (function($rec){$rec._add_(anObject);return $rec._yourself();})(self._new());
+return self;},
+source: unescape('with%3A%20anObject%0A%09%20%20%20%20%5Eself%20new%0A%09%09add%3A%20anObject%3B%0A%09%09yourself%0A')}),
+smalltalk.Collection.klass);
+
+smalltalk.addMethod(
+'_with_with_',
+smalltalk.method({
+selector: 'with:with:',
+category: 'instance creation',
+fn: function (anObject, anotherObject){
+var self=this;
+return (function($rec){$rec._add_(anObject);$rec._add_(anotherObject);return $rec._yourself();})(self._new());
+return self;},
+source: unescape('with%3A%20anObject%20with%3A%20anotherObject%0A%09%20%20%20%20%5Eself%20new%0A%09%09add%3A%20anObject%3B%0A%09%09add%3A%20anotherObject%3B%0A%09%09yourself%0A')}),
+smalltalk.Collection.klass);
+
+smalltalk.addMethod(
+'_with_with_with_',
+smalltalk.method({
+selector: 'with:with:with:',
+category: 'instance creation',
+fn: function (firstObject, secondObject, thirdObject){
+var self=this;
+return (function($rec){$rec._add_(firstObject);$rec._add_(secondObject);$rec._add_(thirdObject);return $rec._yourself();})(self._new());
+return self;},
+source: unescape('with%3A%20firstObject%20with%3A%20secondObject%20with%3A%20thirdObject%0A%09%20%20%20%20%5Eself%20new%0A%09%09add%3A%20firstObject%3B%0A%09%09add%3A%20secondObject%3B%0A%09%09add%3A%20thirdObject%3B%0A%09%09yourself%0A')}),
+smalltalk.Collection.klass);
+
+smalltalk.addMethod(
+'_withAll_',
+smalltalk.method({
+selector: 'withAll:',
+category: 'instance creation',
+fn: function (aCollection){
+var self=this;
+return (function($rec){$rec._addAll_(aCollection);return $rec._yourself();})(self._new());
+return self;},
+source: unescape('withAll%3A%20aCollection%0A%09%20%20%20%20%5Eself%20new%0A%09%09addAll%3A%20aCollection%3B%0A%09%09yourself%0A')}),
+smalltalk.Collection.klass);
+
+
+smalltalk.addClass('String', smalltalk.Collection, [], 'Kernel');
+smalltalk.addMethod(
+'__eq',
+smalltalk.method({
+selector: '=',
+category: 'comparing',
+fn: function (aString){
+var self=this;
+return (function(){return String(self) == aString})();
+return self;},
+source: unescape('%3D%20aString%0A%09%5E%7B%27return%20String%28self%29%20%3D%3D%20aString%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_size',
+smalltalk.method({
+selector: 'size',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.length})();
+return self;},
+source: unescape('size%0A%09%5E%7B%27return%20self.length%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_at_',
+smalltalk.method({
+selector: 'at:',
+category: 'accessing',
+fn: function (anIndex){
+var self=this;
+return (function(){return self[anIndex - 1] || nil;})();
+return self;},
+source: unescape('at%3A%20anIndex%0A%20%20%20%20%09%5E%7B%27return%20self%5BanIndex%20-%201%5D%20%7C%7C%20nil%3B%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_at_put_',
+smalltalk.method({
+selector: 'at:put:',
+category: 'accessing',
+fn: function (anIndex, anObject){
+var self=this;
+self._errorReadOnly();
+return self;},
+source: unescape('at%3A%20anIndex%20put%3A%20anObject%0A%20%20%20%20%09self%20errorReadOnly%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_at_ifAbsent_',
+smalltalk.method({
+selector: 'at:ifAbsent:',
+category: 'accessing',
+fn: function (anIndex, aBlock){
+var self=this;
+self._at_(anIndex)._ifNil_((function(){return aBlock;}));
+return self;},
+source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%20%20%20%20%09%28self%20at%3A%20anIndex%29%20ifNil%3A%20%5BaBlock%5D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_escaped',
+smalltalk.method({
+selector: 'escaped',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return escape(self)})();
+return self;},
+source: unescape('escaped%0A%09%5E%7B%27return%20escape%28self%29%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_unescaped',
+smalltalk.method({
+selector: 'unescaped',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return unescape(self)})();
+return self;},
+source: unescape('unescaped%0A%09%5E%7B%27return%20unescape%28self%29%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_add_',
+smalltalk.method({
+selector: 'add:',
+category: 'adding',
+fn: function (anObject){
+var self=this;
+self._errorReadOnly();
+return self;},
+source: unescape('add%3A%20anObject%0A%20%20%20%20%09self%20errorReadOnly%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'__comma',
+smalltalk.method({
+selector: ',',
+category: 'copying',
+fn: function (aString){
+var self=this;
+return (function(){return self + aString})();
+return self;},
+source: unescape('%2C%20aString%0A%20%20%20%20%09%5E%7B%27return%20self%20+%20aString%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_copyFrom_to_',
+smalltalk.method({
+selector: 'copyFrom:to:',
+category: 'copying',
+fn: function (anIndex, anotherIndex){
+var self=this;
+return (function(){return self.substring(anIndex - 1, anotherIndex);})();
+return self;},
+source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%20%20%20%20%09%5E%7B%27return%20self.substring%28anIndex%20-%201%2C%20anotherIndex%29%3B%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_shallowCopy',
+smalltalk.method({
+selector: 'shallowCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+return self._class()._fromString_(self);
+return self;},
+source: unescape('shallowCopy%0A%20%20%20%20%09%5Eself%20class%20fromString%3A%20self%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_deepCopy',
+smalltalk.method({
+selector: 'deepCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+return self._shallowCopy();
+return self;},
+source: unescape('deepCopy%0A%20%20%20%20%09%5Eself%20shallowCopy%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_asSelector',
+smalltalk.method({
+selector: 'asSelector',
+category: 'converting',
+fn: function (){
+var self=this;
+var selector=nil;
+selector="_".__comma(self);
+selector=selector._replace_with_(":","_");
+selector=selector._replace_with_(unescape("%5B+%5D"),"_plus");
+selector=selector._replace_with_(unescape("-"),"_minus");
+selector=selector._replace_with_(unescape("%5B*%5D"),"_star");
+selector=selector._replace_with_(unescape("%5B/%5D"),"_slash");
+selector=selector._replace_with_(unescape("%3E"),"_gt");
+selector=selector._replace_with_(unescape("%3C"),"_lt");
+selector=selector._replace_with_(unescape("%3D"),"_eq");
+selector=selector._replace_with_(unescape("%2C"),"_comma");
+selector=selector._replace_with_(unescape("%5B@%5D"),"_at");
+return selector;
+return self;},
+source: unescape('asSelector%0A%09%7C%20selector%20%7C%0A%09selector%20%3A%3D%20%27_%27%2C%20self.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27%3A%27%20with%3A%20%27_%27.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B+%5D%27%20with%3A%20%27_plus%27.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27-%27%20with%3A%20%27_minus%27.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B*%5D%27%20with%3A%20%27_star%27.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B/%5D%27%20with%3A%20%27_slash%27.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27%3E%27%20with%3A%20%27_gt%27.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27%3C%27%20with%3A%20%27_lt%27.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27%3D%27%20with%3A%20%27_eq%27.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27%2C%27%20with%3A%20%27_comma%27.%0A%20%20%20%20%09selector%20%3A%3D%20selector%20replace%3A%20%27%5B@%5D%27%20with%3A%20%27_at%27.%0A%09%5Eselector%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_asJavascript',
+smalltalk.method({
+selector: 'asJavascript',
+category: 'converting',
+fn: function (){
+var self=this;
+return (function(){
+	if(self.search(/^[a-zA-Z0-9_:.$ ]*$/) == -1)
+		return "unescape(\"" + escape(self) + "\")";
+	else
+		return "\"" + self + "\"";
+	})();
+return self;},
+source: unescape('asJavascript%0A%09%5E%7B%27%0A%09if%28self.search%28/%5E%5Ba-zA-Z0-9_%3A.%24%20%5D*%24/%29%20%3D%3D%20-1%29%0A%09%09return%20%22unescape%28%5C%22%22%20+%20escape%28self%29%20+%20%22%5C%22%29%22%3B%0A%09else%0A%09%09return%20%22%5C%22%22%20+%20self%20+%20%22%5C%22%22%3B%0A%09%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_replace_with_',
+smalltalk.method({
+selector: 'replace:with:',
+category: 'regular expressions',
+fn: function (aString, anotherString){
+var self=this;
+return self._replaceRegexp_with_(smalltalk.RegularExpression._fromString_flag_(aString,"g"),anotherString);
+return self;},
+source: unescape('replace%3A%20aString%20with%3A%20anotherString%0A%20%20%20%20%09%5Eself%20replaceRegexp%3A%20%28RegularExpression%20fromString%3A%20aString%20flag%3A%20%27g%27%29%20with%3A%20anotherString%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_replaceRegexp_with_',
+smalltalk.method({
+selector: 'replaceRegexp:with:',
+category: 'regular expressions',
+fn: function (aRegexp, aString){
+var self=this;
+return (function(){return self.replace(aRegexp, aString);})();
+return self;},
+source: unescape('replaceRegexp%3A%20aRegexp%20with%3A%20aString%0A%20%20%20%20%09%5E%7B%27return%20self.replace%28aRegexp%2C%20aString%29%3B%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_tokenize_',
+smalltalk.method({
+selector: 'tokenize:',
+category: 'converting',
+fn: function (aString){
+var self=this;
+return (function(){return self.split(aString)})();
+return self;},
+source: unescape('tokenize%3A%20aString%0A%09%5E%7B%27return%20self.split%28aString%29%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_match_',
+smalltalk.method({
+selector: 'match:',
+category: 'regular expressions',
+fn: function (aRegexp){
+var self=this;
+return (function(){return self.search(aRegexp) != -1})();
+return self;},
+source: unescape('match%3A%20aRegexp%0A%20%20%20%20%09%5E%7B%27return%20self.search%28aRegexp%29%20%21%3D%20-1%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_asString',
+smalltalk.method({
+selector: 'asString',
+category: 'converting',
+fn: function (){
+var self=this;
+return self;
+return self;},
+source: unescape('asString%0A%20%20%20%20%09%5Eself%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_asNumber',
+smalltalk.method({
+selector: 'asNumber',
+category: 'converting',
+fn: function (){
+var self=this;
+return (function(){return Number(self);})();
+return self;},
+source: unescape('asNumber%0A%09%5E%7B%27return%20Number%28self%29%3B%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_asParser',
+smalltalk.method({
+selector: 'asParser',
+category: 'converting',
+fn: function (){
+var self=this;
+return smalltalk.PPStringParser._new()._string_(self);
+return self;},
+source: unescape('asParser%0A%20%20%20%20%09%5EPPStringParser%20new%20string%3A%20self%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_asChoiceParser',
+smalltalk.method({
+selector: 'asChoiceParser',
+category: 'converting',
+fn: function (){
+var self=this;
+return smalltalk.PPChoiceParser._withAll_(self._asArray()._collect_((function(each){return each._asParser();})));
+return self;},
+source: unescape('asChoiceParser%0A%20%20%20%20%09%5EPPChoiceParser%20withAll%3A%20%28self%20asArray%20collect%3A%20%5B%3Aeach%20%7C%20each%20asParser%5D%29%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_asCharacterParser',
+smalltalk.method({
+selector: 'asCharacterParser',
+category: 'converting',
+fn: function (){
+var self=this;
+return smalltalk.PPCharacterParser._new()._string_(self);
+return self;},
+source: unescape('asCharacterParser%0A%20%20%20%20%09%5EPPCharacterParser%20new%20string%3A%20self%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_errorReadOnly',
+smalltalk.method({
+selector: 'errorReadOnly',
+category: 'error handling',
+fn: function (){
+var self=this;
+self._error_(unescape("Object%20is%20read-only"));
+return self;},
+source: unescape('errorReadOnly%0A%20%20%20%20%09self%20error%3A%20%27Object%20is%20read-only%27%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_printString',
+smalltalk.method({
+selector: 'printString',
+category: 'printing',
+fn: function (){
+var self=this;
+return unescape("%27").__comma(self).__comma(unescape("%27"));
+return self;},
+source: unescape('printString%0A%20%20%20%20%09%5E%27%27%27%27%2C%20self%2C%20%27%27%27%27%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_printNl',
+smalltalk.method({
+selector: 'printNl',
+category: 'printing',
+fn: function (){
+var self=this;
+(function(){console.log(self)})();
+return self;},
+source: unescape('printNl%0A%09%7B%27console.log%28self%29%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_isString',
+smalltalk.method({
+selector: 'isString',
+category: 'testing',
+fn: function (){
+var self=this;
+return true;
+return self;},
+source: unescape('isString%0A%20%20%20%20%09%5Etrue%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_asJQuery',
+smalltalk.method({
+selector: 'asJQuery',
+category: '*JQuery',
+fn: function (){
+var self=this;
+return smalltalk.JQuery._fromString_(self);
+return self;},
+source: unescape('asJQuery%0A%20%20%20%20%5EJQuery%20fromString%3A%20self%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_appendToJQuery_',
+smalltalk.method({
+selector: 'appendToJQuery:',
+category: '*JQuery',
+fn: function (aJQuery){
+var self=this;
+(function(){aJQuery._appendElement_(String(self))})();
+return self;},
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20%7B%27aJQuery._appendElement_%28String%28self%29%29%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_appendToBrush_',
+smalltalk.method({
+selector: 'appendToBrush:',
+category: '*Canvas',
+fn: function (aTagBrush){
+var self=this;
+aTagBrush._appendString_(self);
+return self;},
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20appendString%3A%20self%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'__gt',
+smalltalk.method({
+selector: '>',
+category: 'comparing',
+fn: function (aString){
+var self=this;
+return (function(){return String(self) > aString})();
+return self;},
+source: unescape('%3E%20aString%0A%09%5E%7B%27return%20String%28self%29%20%3E%20aString%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'__lt',
+smalltalk.method({
+selector: '<',
+category: 'comparing',
+fn: function (aString){
+var self=this;
+return (function(){return String(self) < aString})();
+return self;},
+source: unescape('%3C%20aString%0A%09%5E%7B%27return%20String%28self%29%20%3C%20aString%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'__gt_eq',
+smalltalk.method({
+selector: '>=',
+category: 'comparing',
+fn: function (aString){
+var self=this;
+return (function(){return String(self) >= aString})();
+return self;},
+source: unescape('%3E%3D%20aString%0A%09%5E%7B%27return%20String%28self%29%20%3E%3D%20aString%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'__lt_eq',
+smalltalk.method({
+selector: '<=',
+category: 'comparing',
+fn: function (aString){
+var self=this;
+return (function(){return String(self) <= aString})();
+return self;},
+source: unescape('%3C%3D%20aString%0A%09%5E%7B%27return%20String%28self%29%20%3C%3D%20aString%27%7D%0A')}),
+smalltalk.String);
+
+smalltalk.addMethod(
+'_remove_',
+smalltalk.method({
+selector: 'remove:',
+category: 'adding',
+fn: function (anObject){
+var self=this;
+self._errorReadOnly();
+return self;},
+source: unescape('remove%3A%20anObject%0A%20%20%20%20self%20errorReadOnly%0A')}),
+smalltalk.String);
+
+
+smalltalk.addMethod(
+'_streamClass',
+smalltalk.method({
+selector: 'streamClass',
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.StringStream;
+return self;},
+source: unescape('streamClass%0A%09%20%20%20%20%5EStringStream%0A')}),
+smalltalk.String.klass);
+
+smalltalk.addMethod(
+'_fromString_',
+smalltalk.method({
+selector: 'fromString:',
+category: 'instance creation',
+fn: function (aString){
+var self=this;
+return (function(){return new self.fn(aString);})();
+return self;},
+source: unescape('fromString%3A%20aString%0A%09%20%20%20%20%5E%7B%27return%20new%20self.fn%28aString%29%3B%27%7D%0A')}),
+smalltalk.String.klass);
+
+smalltalk.addMethod(
+'_cr',
+smalltalk.method({
+selector: 'cr',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){{return '\n'};})();
+return self;},
+source: unescape('cr%0A%09%20%20%20%20%5E%7B%27%7Breturn%20%27%27%5Cn%27%27%7D%3B%27%7D%0A')}),
+smalltalk.String.klass);
+
+smalltalk.addMethod(
+'_lf',
+smalltalk.method({
+selector: 'lf',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return '\r';})();
+return self;},
+source: unescape('lf%0A%09%20%20%20%20%5E%7B%27return%20%27%27%5Cr%27%27%3B%27%7D%0A')}),
+smalltalk.String.klass);
+
+smalltalk.addMethod(
+'_space',
+smalltalk.method({
+selector: 'space',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return ' ';})();
+return self;},
+source: unescape('space%0A%09%20%20%20%20%5E%7B%27return%20%27%27%20%27%27%3B%27%7D%0A')}),
+smalltalk.String.klass);
+
+smalltalk.addMethod(
+'_tab',
+smalltalk.method({
+selector: 'tab',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return '\t';})();
+return self;},
+source: unescape('tab%0A%09%20%20%20%20%5E%7B%27return%20%27%27%5Ct%27%27%3B%27%7D%0A')}),
+smalltalk.String.klass);
+
+
+smalltalk.addClass('RegularExpression', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_compile_',
+smalltalk.method({
+selector: 'compile:',
+category: 'evaluating',
+fn: function (aString){
+var self=this;
+return (function(){return self.compile(aString);})();
+return self;},
+source: unescape('compile%3A%20aString%0A%09%5E%7B%27return%20self.compile%28aString%29%3B%27%7D%0A')}),
+smalltalk.RegularExpression);
+
+smalltalk.addMethod(
+'_exec_',
+smalltalk.method({
+selector: 'exec:',
+category: 'evaluating',
+fn: function (aString){
+var self=this;
+return (function(){return self.exec(aString);})();
+return self;},
+source: unescape('exec%3A%20aString%0A%09%5E%7B%27return%20self.exec%28aString%29%3B%27%7D%0A')}),
+smalltalk.RegularExpression);
+
+smalltalk.addMethod(
+'_test_',
+smalltalk.method({
+selector: 'test:',
+category: 'evaluating',
+fn: function (aString){
+var self=this;
+return (function(){return self.test(aString);})();
+return self;},
+source: unescape('test%3A%20aString%0A%09%5E%7B%27return%20self.test%28aString%29%3B%27%7D%0A')}),
+smalltalk.RegularExpression);
+
+
+smalltalk.addMethod(
+'_fromString_flag_',
+smalltalk.method({
+selector: 'fromString:flag:',
+category: 'instance creation',
+fn: function (aString, anotherString){
+var self=this;
+return (function(){return new RegExp(aString, anotherString);})();
+return self;},
+source: unescape('fromString%3A%20aString%20flag%3A%20anotherString%0A%09%20%20%20%20%5E%7B%27return%20new%20RegExp%28aString%2C%20anotherString%29%3B%27%7D%0A')}),
+smalltalk.RegularExpression.klass);
+
+smalltalk.addMethod(
+'_fromString_',
+smalltalk.method({
+selector: 'fromString:',
+category: 'instance creation',
+fn: function (aString){
+var self=this;
+return self._fromString_flag_(aString,"");
+return self;},
+source: unescape('fromString%3A%20aString%0A%09%20%20%20%20%5Eself%20fromString%3A%20aString%20flag%3A%20%27%27%0A')}),
+smalltalk.RegularExpression.klass);
+
+
+smalltalk.addClass('Array', smalltalk.Collection, [], 'Kernel');
+smalltalk.addMethod(
+'_size',
+smalltalk.method({
+selector: 'size',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (function(){return self.length})();
+return self;},
+source: unescape('size%0A%09%5E%7B%27return%20self.length%27%7D%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_at_put_',
+smalltalk.method({
+selector: 'at:put:',
+category: 'accessing',
+fn: function (anIndex, anObject){
+var self=this;
+return (function(){return self[anIndex - 1] = anObject})();
+return self;},
+source: unescape('at%3A%20anIndex%20put%3A%20anObject%0A%09%5E%7B%27return%20self%5BanIndex%20-%201%5D%20%3D%20anObject%27%7D%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_at_ifAbsent_',
+smalltalk.method({
+selector: 'at:ifAbsent:',
+category: 'accessing',
+fn: function (anIndex, aBlock){
+var self=this;
+return (function(){
+	    var value = self[anIndex - 1];
+	    if(value === undefined) {
+		return aBlock();
+	    } else {
+		return value;
+	    }
+	})();
+return self;},
+source: unescape('at%3A%20anIndex%20ifAbsent%3A%20aBlock%0A%09%5E%7B%27%0A%09%20%20%20%20var%20value%20%3D%20self%5BanIndex%20-%201%5D%3B%0A%09%20%20%20%20if%28value%20%3D%3D%3D%20undefined%29%20%7B%0A%09%09return%20aBlock%28%29%3B%0A%09%20%20%20%20%7D%20else%20%7B%0A%09%09return%20value%3B%0A%09%20%20%20%20%7D%0A%09%27%7D%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_add_',
+smalltalk.method({
+selector: 'add:',
+category: 'adding',
+fn: function (anObject){
+var self=this;
+return (function(){self.push(anObject); return anObject;})();
+return self;},
+source: unescape('add%3A%20anObject%0A%09%5E%7B%27self.push%28anObject%29%3B%20return%20anObject%3B%27%7D%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_addLast_',
+smalltalk.method({
+selector: 'addLast:',
+category: 'adding',
+fn: function (anObject){
+var self=this;
+return self._add_(anObject);
+return self;},
+source: unescape('addLast%3A%20anObject%0A%09%5Eself%20add%3A%20anObject%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_shallowCopy',
+smalltalk.method({
+selector: 'shallowCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+var newCollection=nil;
+newCollection=self._class()._new();
+self._do_((function(each){return newCollection._add_(each);}));
+return newCollection;
+return self;},
+source: unescape('shallowCopy%0A%09%7C%20newCollection%20%7C%0A%09newCollection%20%3A%3D%20self%20class%20new.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%20newCollection%20add%3A%20each%5D.%0A%09%5EnewCollection%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_deepCopy',
+smalltalk.method({
+selector: 'deepCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+var newCollection=nil;
+newCollection=self._class()._new();
+self._do_((function(each){return newCollection._add_(each._deepCopy());}));
+return newCollection;
+return self;},
+source: unescape('deepCopy%0A%09%7C%20newCollection%20%7C%0A%09newCollection%20%3A%3D%20self%20class%20new.%0A%09self%20do%3A%20%5B%3Aeach%20%7C%20newCollection%20add%3A%20each%20deepCopy%5D.%0A%09%5EnewCollection%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_copyFrom_to_',
+smalltalk.method({
+selector: 'copyFrom:to:',
+category: 'copying',
+fn: function (anIndex, anotherIndex){
+var self=this;
+var array=nil;
+array=self._class()._new();
+anIndex._to_do_(anotherIndex,(function(each){return array._add_(self._at_(each));}));
+return array;
+return self;},
+source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%09%7C%20array%20%7C%0A%09array%20%3A%3D%20self%20class%20new.%0A%09anIndex%20to%3A%20anotherIndex%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20array%20add%3A%20%28self%20at%3A%20each%29%5D.%0A%09%5Earray%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_join_',
+smalltalk.method({
+selector: 'join:',
+category: 'enumerating',
+fn: function (aString){
+var self=this;
+return (function(){return self.join(aString);})();
+return self;},
+source: unescape('join%3A%20aString%0A%09%5E%7B%27return%20self.join%28aString%29%3B%27%7D%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_asJavascript',
+smalltalk.method({
+selector: 'asJavascript',
+category: 'converting',
+fn: function (){
+var self=this;
+return unescape("%5B").__comma(self._collect_((function(each){return each._asJavascript();}))._join_(unescape("%2C%20"))).__comma(unescape("%5D"));
+return self;},
+source: unescape('asJavascript%0A%09%5E%27%5B%27%2C%20%28%28self%20collect%3A%20%5B%3Aeach%20%7C%20each%20asJavascript%5D%29%20join%3A%20%27%2C%20%27%29%2C%20%20%27%5D%27%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_sort',
+smalltalk.method({
+selector: 'sort',
+category: 'enumerating',
+fn: function (){
+var self=this;
+return self._copy()._basicPerform_("sort");
+return self;},
+source: unescape('sort%0A%20%20%20%20%5Eself%20copy%20basicPerform%3A%20%27sort%27%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_sort_',
+smalltalk.method({
+selector: 'sort:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+return self._copy()._basicPerform_withArguments_("sort",smalltalk.Array._with_(aBlock));
+return self;},
+source: unescape('sort%3A%20aBlock%0A%20%20%20%20%5Eself%20copy%20basicPerform%3A%20%27sort%27%20withArguments%3A%20%28Array%20with%3A%20aBlock%29%0A')}),
+smalltalk.Array);
+
+smalltalk.addMethod(
+'_remove_',
+smalltalk.method({
+selector: 'remove:',
+category: 'adding',
+fn: function (anObject){
+var self=this;
+(function(){for(var i=0;i<self.length;i++) {
+	if(self[i] == anObject) {
+		self.splice(i,1);
+		break;
+	}
+    }})();
+return self;},
+source: unescape('remove%3A%20anObject%0A%20%20%20%20%7B%27for%28var%20i%3D0%3Bi%3Cself.length%3Bi++%29%20%7B%0A%09if%28self%5Bi%5D%20%3D%3D%20anObject%29%20%7B%0A%09%09self.splice%28i%2C1%29%3B%0A%09%09break%3B%0A%09%7D%0A%20%20%20%20%7D%27%7D%0A')}),
+smalltalk.Array);
+
+
+
+smalltalk.addClass('Error', smalltalk.Object, ['messageText'], 'Kernel');
+smalltalk.addMethod(
+'_messageText',
+smalltalk.method({
+selector: 'messageText',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@messageText'];
+return self;},
+source: unescape('messageText%0A%09%5EmessageText%0A')}),
+smalltalk.Error);
+
+smalltalk.addMethod(
+'_messageText_',
+smalltalk.method({
+selector: 'messageText:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+self['@messageText']=aString;
+return self;},
+source: unescape('messageText%3A%20aString%0A%09messageText%20%3A%3D%20aString%0A')}),
+smalltalk.Error);
+
+smalltalk.addMethod(
+'_signal',
+smalltalk.method({
+selector: 'signal',
+category: 'signaling',
+fn: function (){
+var self=this;
+return (function(){throw({smalltalkError: self})})();
+return self;},
+source: unescape('signal%0A%09%5E%7B%27throw%28%7BsmalltalkError%3A%20self%7D%29%27%7D%0A')}),
+smalltalk.Error);
+
+
+smalltalk.addMethod(
+'_signal_',
+smalltalk.method({
+selector: 'signal:',
+category: 'instance creation',
+fn: function (aString){
+var self=this;
+return (function($rec){$rec._messageText_(aString);return $rec._signal();})(self._new());
+return self;},
+source: unescape('signal%3A%20aString%0A%09%20%20%20%20%5Eself%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal%0A')}),
+smalltalk.Error.klass);
+
+
+smalltalk.addClass('Association', smalltalk.Object, ['key', 'value'], 'Kernel');
+smalltalk.addMethod(
+'__eq',
+smalltalk.method({
+selector: '=',
+category: 'comparing',
+fn: function (anAssociation){
+var self=this;
+return self._class().__eq(anAssociation._class())._and_((function(){return self._key().__eq(anAssociation._key())._and_((function(){return self._value().__eq(anAssociation._value());}));}));
+return self;},
+source: unescape('%3D%20anAssociation%0A%09%5Eself%20class%20%3D%20anAssociation%20class%20and%3A%20%5B%0A%09%20%20%20%20self%20key%20%3D%20anAssociation%20key%20and%3A%20%5B%0A%09%09self%20value%20%3D%20anAssociation%20value%5D%5D%0A')}),
+smalltalk.Association);
+
+smalltalk.addMethod(
+'_key_',
+smalltalk.method({
+selector: 'key:',
+category: 'accessing',
+fn: function (aKey){
+var self=this;
+self['@key']=aKey;
+return self;},
+source: unescape('key%3A%20aKey%0A%09key%20%3A%3D%20aKey%0A')}),
+smalltalk.Association);
+
+smalltalk.addMethod(
+'_key',
+smalltalk.method({
+selector: 'key',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@key'];
+return self;},
+source: unescape('key%0A%09%5Ekey%0A')}),
+smalltalk.Association);
+
+smalltalk.addMethod(
+'_value_',
+smalltalk.method({
+selector: 'value:',
+category: 'accessing',
+fn: function (aValue){
+var self=this;
+self['@value']=aValue;
+return self;},
+source: unescape('value%3A%20aValue%0A%09value%20%3A%3D%20aValue%0A')}),
+smalltalk.Association);
+
+smalltalk.addMethod(
+'_value',
+smalltalk.method({
+selector: 'value',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@value'];
+return self;},
+source: unescape('value%0A%09%5Evalue%0A')}),
+smalltalk.Association);
+
+
+smalltalk.addMethod(
+'_key_value_',
+smalltalk.method({
+selector: 'key:value:',
+category: 'instance creation',
+fn: function (aKey, aValue){
+var self=this;
+return (function($rec){$rec._key_(aKey);$rec._value_(aValue);return $rec._yourself();})(self._new());
+return self;},
+source: unescape('key%3A%20aKey%20value%3A%20aValue%0A%09%20%20%20%20%5Eself%20new%0A%09%09key%3A%20aKey%3B%0A%09%09value%3A%20aValue%3B%0A%09%09yourself%0A')}),
+smalltalk.Association.klass);
+
+
+smalltalk.addClass('Dictionary', smalltalk.Collection, ['keys'], 'Kernel');
+smalltalk.addMethod(
+'__eq',
+smalltalk.method({
+selector: '=',
+category: 'comparing',
+fn: function (aDictionary){
+var self=this;
+try{self._class().__eq(aDictionary._class())._ifFalse_((function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();}));
+self._associationsDo_((function(assoc){return aDictionary._at_ifAbsent_(assoc._key(),(function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();})).__eq(assoc._value())._ifFalse_((function(){return (function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return false}})})();}));}));
+(function(){throw({name: 'stReturn', selector: '__eq', fn: function(){return true}})})();
+return self;
+} catch(e) {if(e.name === 'stReturn' && e.selector === '__eq'){return e.fn()} throw(e)}},
+source: unescape('%3D%20aDictionary%0A%09self%20class%20%3D%20aDictionary%20class%20ifFalse%3A%20%5B%5Efalse%5D.%0A%09self%20associationsDo%3A%20%5B%3Aassoc%20%7C%0A%09%20%20%20%20%28aDictionary%20at%3A%20assoc%20key%20ifAbsent%3A%20%5B%5Efalse%5D%29%20%3D%20assoc%20value%20%0A%09%09ifFalse%3A%20%5B%5Efalse%5D%5D.%0A%09%5Etrue%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_shallowCopy',
+smalltalk.method({
+selector: 'shallowCopy',
+category: 'copying',
+fn: function (){
+var self=this;
+var copy=nil;
+copy=self._class()._new();
+self._associationsDo_((function(each){return copy._at_put_(each._key(),each._value());}));
+return copy;
+return self;},
+source: unescape('shallowCopy%0A%09%7C%20copy%20%7C%0A%09copy%20%3A%3D%20self%20class%20new.%0A%09self%20associationsDo%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20copy%20at%3A%20each%20key%20%20put%3A%20each%20value%5D.%0A%09%5Ecopy%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
+self['@keys']=[];
+return self;},
+source: unescape('initialize%0A%20%20%20%20%09super%20initialize.%0A%20%20%20%20%09keys%20%3A%3D%20%23%28%29%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_size',
+smalltalk.method({
+selector: 'size',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@keys']._size();
+return self;},
+source: unescape('size%0A%09%5Ekeys%20size%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_associations',
+smalltalk.method({
+selector: 'associations',
+category: 'accessing',
+fn: function (){
+var self=this;
+var associations=nil;
+associations=[];
+self['@keys']._do_((function(each){return associations._add_(smalltalk.Association._key_value_(each,self._at_(each)));}));
+return associations;
+return self;},
+source: unescape('associations%0A%09%7C%20associations%20%7C%0A%09associations%20%3A%3D%20%23%28%29.%0A%09keys%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20associations%20add%3A%20%28Association%20key%3A%20each%20value%3A%20%28self%20at%3A%20each%29%29%5D.%0A%09%5Eassociations%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_keys',
+smalltalk.method({
+selector: 'keys',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@keys']._copy();
+return self;},
+source: unescape('keys%0A%09%5Ekeys%20copy%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_values',
+smalltalk.method({
+selector: 'values',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@keys']._collect_((function(each){return self._at_(each);}));
+return self;},
+source: unescape('values%0A%20%20%20%20%09%5Ekeys%20collect%3A%20%5B%3Aeach%20%7C%20self%20at%3A%20each%5D%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_at_put_',
+smalltalk.method({
+selector: 'at:put:',
+category: 'accessing',
+fn: function (aKey, aValue){
+var self=this;
+self['@keys']._includes_(aKey)._ifFalse_((function(){return self['@keys']._add_(aKey);}));
+return self._basicAt_put_(aKey,aValue);
+return self;},
+source: unescape('at%3A%20aKey%20put%3A%20aValue%0A%09%28keys%20includes%3A%20aKey%29%20ifFalse%3A%20%5Bkeys%20add%3A%20aKey%5D.%0A%09%5Eself%20basicAt%3A%20aKey%20put%3A%20aValue%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_at_ifAbsent_',
+smalltalk.method({
+selector: 'at:ifAbsent:',
+category: 'accessing',
+fn: function (aKey, aBlock){
+var self=this;
+return self._basicAt_(aKey)._ifNil_(aBlock);
+return self;},
+source: unescape('at%3A%20aKey%20ifAbsent%3A%20aBlock%0A%09%5E%28self%20basicAt%3A%20aKey%29%20ifNil%3A%20aBlock%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_at_ifAbsentPut_',
+smalltalk.method({
+selector: 'at:ifAbsentPut:',
+category: 'accessing',
+fn: function (aKey, aBlock){
+var self=this;
+return self._at_ifAbsent_(aKey,(function(){return self._at_put_(aKey,aBlock._value());}));
+return self;},
+source: unescape('at%3A%20aKey%20ifAbsentPut%3A%20aBlock%0A%20%20%20%20%09%5Eself%20at%3A%20aKey%20ifAbsent%3A%20%5B%0A%20%20%20%20%09%20%20%20%20self%20at%3A%20aKey%20put%3A%20aBlock%20value%5D%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_at_ifPresent_',
+smalltalk.method({
+selector: 'at:ifPresent:',
+category: 'accessing',
+fn: function (aKey, aBlock){
+var self=this;
+return self._basicAt_(aKey)._ifNotNil_((function(){return aBlock._value_(self._at_(aKey));}));
+return self;},
+source: unescape('at%3A%20aKey%20ifPresent%3A%20aBlock%0A%09%5E%28self%20basicAt%3A%20aKey%29%20ifNotNil%3A%20%5BaBlock%20value%3A%20%28self%20at%3A%20aKey%29%5D%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_at_ifPresent_ifAbsent_',
+smalltalk.method({
+selector: 'at:ifPresent:ifAbsent:',
+category: 'accessing',
+fn: function (aKey, aBlock, anotherBlock){
+var self=this;
+return self._basicAt_(aKey)._ifNil_ifNotNil_(anotherBlock,(function(){return aBlock._value_(self._at_(aKey));}));
+return self;},
+source: unescape('at%3A%20aKey%20ifPresent%3A%20aBlock%20ifAbsent%3A%20anotherBlock%0A%09%5E%28self%20basicAt%3A%20aKey%29%0A%09%20%20%20%20ifNil%3A%20anotherBlock%0A%09%20%20%20%20ifNotNil%3A%20%5BaBlock%20value%3A%20%28self%20at%3A%20aKey%29%5D%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_add_',
+smalltalk.method({
+selector: 'add:',
+category: 'adding/removing',
+fn: function (anAssociation){
+var self=this;
+self._at_put_(anAssociation._key(),anAssociation._value());
+return self;},
+source: unescape('add%3A%20anAssociation%0A%20%20%20%20%09self%20at%3A%20anAssociation%20key%20put%3A%20anAssociation%20value%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_addAll_',
+smalltalk.method({
+selector: 'addAll:',
+category: 'adding/removing',
+fn: function (aDictionary){
+var self=this;
+self.klass.superclass.fn.prototype['_addAll_'].apply(self, [aDictionary._associations()]);
+return aDictionary;
+return self;},
+source: unescape('addAll%3A%20aDictionary%0A%20%20%20%20%09super%20addAll%3A%20aDictionary%20associations.%0A%20%20%20%20%09%5EaDictionary%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'__comma',
+smalltalk.method({
+selector: ',',
+category: 'copying',
+fn: function (aCollection){
+var self=this;
+self._shouldNotImplement();
+return self;},
+source: unescape('%2C%20aCollection%0A%09self%20shouldNotImplement%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_copyFrom_to_',
+smalltalk.method({
+selector: 'copyFrom:to:',
+category: 'copying',
+fn: function (anIndex, anotherIndex){
+var self=this;
+self._shouldNotImplement();
+return self;},
+source: unescape('copyFrom%3A%20anIndex%20to%3A%20anotherIndex%0A%09self%20shouldNotImplement%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_associationsDo_',
+smalltalk.method({
+selector: 'associationsDo:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+self._associations()._do_(aBlock);
+return self;},
+source: unescape('associationsDo%3A%20aBlock%0A%20%20%20%20%09self%20associations%20do%3A%20aBlock%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_keysAndValuesDo_',
+smalltalk.method({
+selector: 'keysAndValuesDo:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+self._associationsDo_((function(each){return aBlock._value_value_(each._key(),each._value());}));
+return self;},
+source: unescape('keysAndValuesDo%3A%20aBlock%0A%20%20%20%20%09self%20associationsDo%3A%20%5B%3Aeach%20%7C%0A%20%20%20%20%09%20%20%20%20aBlock%20value%3A%20each%20key%20value%3A%20each%20value%5D%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_do_',
+smalltalk.method({
+selector: 'do:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+self._values()._do_(aBlock);
+return self;},
+source: unescape('do%3A%20aBlock%0A%20%20%20%20%09self%20values%20do%3A%20aBlock%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_select_',
+smalltalk.method({
+selector: 'select:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+var newDict=nil;
+newDict=self._class()._new();
+self._keysAndValuesDo_((function(key, value){return aBlock._value_(value)._ifTrue_((function(){return newDict._at_put_(key,value);}));}));
+return newDict;
+return self;},
+source: unescape('select%3A%20aBlock%0A%20%20%20%20%09%7C%20newDict%20%7C%0A%20%20%20%20%09newDict%20%3A%3D%20self%20class%20new.%0A%20%20%20%20%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%20%20%20%20%09%20%20%20%20%28aBlock%20value%3A%20value%29%20ifTrue%3A%20%5BnewDict%20at%3A%20key%20put%3A%20value%5D%5D.%0A%20%20%20%20%09%5EnewDict%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_collect_',
+smalltalk.method({
+selector: 'collect:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+var newDict=nil;
+newDict=self._class()._new();
+self._keysAndValuesDo_((function(key, value){return aBlock._value_(value)._ifTrue_((function(){return newDict._at_put_(key,value);}));}));
+return newDict;
+return self;},
+source: unescape('collect%3A%20aBlock%0A%20%20%20%20%09%7C%20newDict%20%7C%0A%20%20%20%20%09newDict%20%3A%3D%20self%20class%20new.%0A%20%20%20%20%09self%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%0A%20%20%20%20%09%20%20%20%20%28aBlock%20value%3A%20value%29%20ifTrue%3A%20%5BnewDict%20at%3A%20key%20put%3A%20value%5D%5D.%0A%20%20%20%20%09%5EnewDict%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_detect_ifNone_',
+smalltalk.method({
+selector: 'detect:ifNone:',
+category: 'enumerating',
+fn: function (aBlock, anotherBlock){
+var self=this;
+return self._values()._detect_ifNone_(aBlock,anotherBlock);
+return self;},
+source: unescape('detect%3A%20aBlock%20ifNone%3A%20anotherBlock%0A%09%5Eself%20values%20detect%3A%20aBlock%20ifNone%3A%20anotherBlock%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_includes_',
+smalltalk.method({
+selector: 'includes:',
+category: 'enumerating',
+fn: function (anObject){
+var self=this;
+return self._values()._includes_(anObject);
+return self;},
+source: unescape('includes%3A%20anObject%0A%09%5Eself%20values%20includes%3A%20anObject%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_remove_',
+smalltalk.method({
+selector: 'remove:',
+category: 'adding/removing',
+fn: function (aKey){
+var self=this;
+self._removeKey_(aKey);
+return self;},
+source: unescape('remove%3A%20aKey%0A%20%20%20%20self%20removeKey%3A%20aKey%0A')}),
+smalltalk.Dictionary);
+
+smalltalk.addMethod(
+'_removeKey_',
+smalltalk.method({
+selector: 'removeKey:',
+category: 'adding/removing',
+fn: function (aKey){
+var self=this;
+self['@keys']._remove_(aKey);
+return self;},
+source: unescape('removeKey%3A%20aKey%0A%20%20%20%20keys%20remove%3A%20aKey%0A')}),
+smalltalk.Dictionary);
+
+
+
+smalltalk.addClass('ClassBuilder', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_superclass_subclass_',
+smalltalk.method({
+selector: 'superclass:subclass:',
+category: 'class creation',
+fn: function (aClass, aString){
+var self=this;
+self._superclass_subclass_instanceVariableNames_category_(aClass,aString,"",nil);
+return self;},
+source: unescape('superclass%3A%20aClass%20subclass%3A%20aString%0A%09self%20superclass%3A%20aClass%20subclass%3A%20aString%20instanceVariableNames%3A%20%27%27%20category%3A%20nil%0A')}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+'_superclass_subclass_instanceVariableNames_category_',
+smalltalk.method({
+selector: 'superclass:subclass:instanceVariableNames:category:',
+category: 'class creation',
+fn: function (aClass, aString, aString2, aString3){
+var self=this;
+var newClass=nil;
+newClass=self._addSubclassOf_named_instanceVariableNames_(aClass,aString,self._instanceVariableNamesFor_(aString2));
+self._setupClass_(newClass);
+newClass._category_(aString3._ifNil_((function(){return "unclassified";})));
+return self;},
+source: unescape('superclass%3A%20aClass%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%7C%20newClass%20%7C%0A%09newClass%20%3A%3D%20self%20addSubclassOf%3A%20aClass%20named%3A%20aString%20instanceVariableNames%3A%20%28self%20instanceVariableNamesFor%3A%20aString2%29.%0A%09self%20setupClass%3A%20newClass.%0A%09newClass%20category%3A%20%28aString3%20ifNil%3A%20%5B%27unclassified%27%5D%29%0A')}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+'_class_instanceVariableNames_',
+smalltalk.method({
+selector: 'class:instanceVariableNames:',
+category: 'class creation',
+fn: function (aClass, aString){
+var self=this;
+aClass._isMetaclass()._ifFalse_((function(){return self._error_(aClass._name().__comma(" is not a metaclass"));}));
+aClass._basicAt_put_("iVarNames",self._instanceVariableNamesFor_(aString));
+self._setupClass_(aClass);
+return self;},
+source: unescape('class%3A%20aClass%20instanceVariableNames%3A%20aString%0A%09aClass%20isMetaclass%20ifFalse%3A%20%5Bself%20error%3A%20aClass%20name%2C%20%27%20is%20not%20a%20metaclass%27%5D.%0A%09aClass%20basicAt%3A%20%27iVarNames%27%20put%3A%20%28self%20instanceVariableNamesFor%3A%20aString%29.%0A%09self%20setupClass%3A%20aClass%0A')}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+'_instanceVariableNamesFor_',
+smalltalk.method({
+selector: 'instanceVariableNamesFor:',
+category: 'private',
+fn: function (aString){
+var self=this;
+return aString._tokenize_(" ")._reject_((function(each){return each._isEmpty();}));
+return self;},
+source: unescape('instanceVariableNamesFor%3A%20aString%0A%09%5E%28aString%20tokenize%3A%20%27%20%27%29%20reject%3A%20%5B%3Aeach%20%7C%20each%20isEmpty%5D%0A')}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+'_addSubclassOf_named_instanceVariableNames_',
+smalltalk.method({
+selector: 'addSubclassOf:named:instanceVariableNames:',
+category: 'private',
+fn: function (aClass, aString, aCollection){
+var self=this;
+return (function(){smalltalk.addClass(aString, aClass, aCollection);
+	    return smalltalk[aString]})();
+return self;},
+source: unescape('addSubclassOf%3A%20aClass%20named%3A%20aString%20instanceVariableNames%3A%20aCollection%0A%09%5E%7B%27smalltalk.addClass%28aString%2C%20aClass%2C%20aCollection%29%3B%0A%09%20%20%20%20return%20smalltalk%5BaString%5D%27%7D%0A')}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+'_setupClass_',
+smalltalk.method({
+selector: 'setupClass:',
+category: 'private',
+fn: function (aClass){
+var self=this;
+(function(){smalltalk.init(aClass);})();
+return self;},
+source: unescape('setupClass%3A%20aClass%0A%09%7B%27smalltalk.init%28aClass%29%3B%27%7D%0A')}),
+smalltalk.ClassBuilder);
+
+
+
+smalltalk.addClass('ClassCategoryReader', smalltalk.Object, ['class', 'category', 'chunkParser'], 'Kernel');
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
+self['@chunkParser']=smalltalk.ChunkParser._new();
+return self;},
+source: unescape('initialize%0A%09super%20initialize.%0A%09chunkParser%20%3A%3D%20ChunkParser%20new.%0A')}),
+smalltalk.ClassCategoryReader);
+
+smalltalk.addMethod(
+'_class_category_',
+smalltalk.method({
+selector: 'class:category:',
+category: 'accessing',
+fn: function (aClass, aString){
+var self=this;
+self['@class']=aClass;
+self['@category']=aString;
+return self;},
+source: unescape('class%3A%20aClass%20category%3A%20aString%0A%09class%20%3A%3D%20aClass.%0A%09category%20%3A%3D%20aString%0A')}),
+smalltalk.ClassCategoryReader);
+
+smalltalk.addMethod(
+'_scanFrom_',
+smalltalk.method({
+selector: 'scanFrom:',
+category: 'fileIn',
+fn: function (aStream){
+var self=this;
+var nextChunk=nil;
+nextChunk=self['@chunkParser']._emptyChunk().__slash(self['@chunkParser']._chunk())._parse_(aStream);
+nextChunk._isEmptyChunk()._ifFalse_((function(){self._compileMethod_(nextChunk._contents());return self._scanFrom_(aStream);}));
+return self;},
+source: unescape('scanFrom%3A%20aStream%0A%09%7C%20nextChunk%20%7C%0A%09nextChunk%20%3A%3D%20%28chunkParser%20emptyChunk%20/%20chunkParser%20chunk%29%20parse%3A%20aStream.%0A%09nextChunk%20isEmptyChunk%20ifFalse%3A%20%5B%0A%09%20%20%20%20self%20compileMethod%3A%20nextChunk%20contents.%0A%09%20%20%20%20self%20scanFrom%3A%20aStream%5D.%0A')}),
+smalltalk.ClassCategoryReader);
+
+smalltalk.addMethod(
+'_compileMethod_',
+smalltalk.method({
+selector: 'compileMethod:',
+category: 'private',
+fn: function (aString){
+var self=this;
+var method=nil;
+method=smalltalk.Compiler._new()._load_forClass_(aString,self['@class']);
+method._category_(self['@category']);
+self['@class']._addCompiledMethod_(method);
+return self;},
+source: unescape('compileMethod%3A%20aString%0A%09%7C%20method%20%7C%0A%09method%20%3A%3D%20Compiler%20new%20load%3A%20aString%20forClass%3A%20class.%0A%09method%20category%3A%20category.%0A%09class%20addCompiledMethod%3A%20method%0A')}),
+smalltalk.ClassCategoryReader);
+
+
+
+smalltalk.addClass('Stream', smalltalk.Object, ['collection', 'position', 'streamSize'], 'Kernel');
+smalltalk.addMethod(
+'_collection',
+smalltalk.method({
+selector: 'collection',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@collection'];
+return self;},
+source: unescape('collection%0A%09%5Ecollection%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_setCollection_',
+smalltalk.method({
+selector: 'setCollection:',
+category: 'accessing',
+fn: function (aCollection){
+var self=this;
+self['@collection']=aCollection;
+return self;},
+source: unescape('setCollection%3A%20aCollection%0A%09collection%20%3A%3D%20aCollection%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_position',
+smalltalk.method({
+selector: 'position',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@position']._ifNil_((function(){return self['@position']=(0);}));
+return self;},
+source: unescape('position%0A%09%5Eposition%20ifNil%3A%20%5Bposition%20%3A%3D%200%5D%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_position_',
+smalltalk.method({
+selector: 'position:',
+category: 'accessing',
+fn: function (anInteger){
+var self=this;
+self['@position']=anInteger;
+return self;},
+source: unescape('position%3A%20anInteger%0A%09position%20%3A%3D%20anInteger%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_streamSize',
+smalltalk.method({
+selector: 'streamSize',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@streamSize'];
+return self;},
+source: unescape('streamSize%0A%09%5EstreamSize%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_setStreamSize_',
+smalltalk.method({
+selector: 'setStreamSize:',
+category: 'accessing',
+fn: function (anInteger){
+var self=this;
+self['@streamSize']=anInteger;
+return self;},
+source: unescape('setStreamSize%3A%20anInteger%0A%09streamSize%20%3A%3D%20anInteger%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_contents',
+smalltalk.method({
+selector: 'contents',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._collection()._copyFrom_to_((1),self._streamSize());
+return self;},
+source: unescape('contents%0A%09%5Eself%20collection%0A%09%20%20%20%20copyFrom%3A%201%20%0A%09%20%20%20%20to%3A%20self%20streamSize%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_size',
+smalltalk.method({
+selector: 'size',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self._streamSize();
+return self;},
+source: unescape('size%0A%09%5Eself%20streamSize%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_reset',
+smalltalk.method({
+selector: 'reset',
+category: 'actions',
+fn: function (){
+var self=this;
+self._position_((0));
+return self;},
+source: unescape('reset%0A%09self%20position%3A%200%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_close',
+smalltalk.method({
+selector: 'close',
+category: 'actions',
+fn: function (){
+var self=this;
+
+return self;},
+source: unescape('close%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_flush',
+smalltalk.method({
+selector: 'flush',
+category: 'actions',
+fn: function (){
+var self=this;
+
+return self;},
+source: unescape('flush%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_resetContents',
+smalltalk.method({
+selector: 'resetContents',
+category: 'actions',
+fn: function (){
+var self=this;
+self._reset();
+self._setStreamSize_((0));
+return self;},
+source: unescape('resetContents%0A%09self%20reset.%0A%09self%20setStreamSize%3A%200%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_do_',
+smalltalk.method({
+selector: 'do:',
+category: 'enumerating',
+fn: function (aBlock){
+var self=this;
+(function(){return self._atEnd();})._whileFalse_((function(){return aBlock._value_(self._next());}));
+return self;},
+source: unescape('do%3A%20aBlock%0A%09%5Bself%20atEnd%5D%20whileFalse%3A%20%5BaBlock%20value%3A%20self%20next%5D%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_setToEnd',
+smalltalk.method({
+selector: 'setToEnd',
+category: 'positioning',
+fn: function (){
+var self=this;
+self._position_(self._size());
+return self;},
+source: unescape('setToEnd%0A%09self%20position%3A%20self%20size%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_skip_',
+smalltalk.method({
+selector: 'skip:',
+category: 'positioning',
+fn: function (anInteger){
+var self=this;
+self._position_(self._position().__plus(anInteger)._min_max_(self._size(),(0)));
+return self;},
+source: unescape('skip%3A%20anInteger%0A%09self%20position%3A%20%28%28self%20position%20+%20anInteger%29%20min%3A%20self%20size%20max%3A%200%29%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_next',
+smalltalk.method({
+selector: 'next',
+category: 'reading',
+fn: function (){
+var self=this;
+self._position_(self._position().__plus((1)));
+return self['@collection']._at_(self._position());
+return self;},
+source: unescape('next%0A%09self%20position%3A%20self%20position%20+%201.%20%0A%09%5Ecollection%20at%3A%20self%20position%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_next_',
+smalltalk.method({
+selector: 'next:',
+category: 'reading',
+fn: function (anInteger){
+var self=this;
+var tempCollection=nil;
+tempCollection=self._collection()._class()._new();
+anInteger._timesRepeat_((function(){return self._atEnd()._ifFalse_((function(){return tempCollection._add_(self._next());}));}));
+return tempCollection;
+return self;},
+source: unescape('next%3A%20anInteger%0A%09%7C%20tempCollection%20%7C%0A%09tempCollection%20%3A%3D%20self%20collection%20class%20new.%0A%09anInteger%20timesRepeat%3A%20%5B%0A%09%20%20%20%20self%20atEnd%20ifFalse%3A%20%5B%0A%09%09tempCollection%20add%3A%20self%20next%5D%5D.%0A%09%5EtempCollection%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_nextPut_',
+smalltalk.method({
+selector: 'nextPut:',
+category: 'writing',
+fn: function (anObject){
+var self=this;
+self._position_(self._position().__plus((1)));
+self._collection()._at_put_(self._position(),anObject);
+self._setStreamSize_(self._streamSize()._max_(self._position()));
+return self;},
+source: unescape('nextPut%3A%20anObject%0A%09self%20position%3A%20self%20position%20+%201.%0A%09self%20collection%20at%3A%20self%20position%20put%3A%20anObject.%0A%09self%20setStreamSize%3A%20%28self%20streamSize%20max%3A%20self%20position%29%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_nextPutAll_',
+smalltalk.method({
+selector: 'nextPutAll:',
+category: 'writing',
+fn: function (aCollection){
+var self=this;
+aCollection._do_((function(each){return self._nextPut_(each);}));
+return self;},
+source: unescape('nextPutAll%3A%20aCollection%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20nextPut%3A%20each%5D%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_peek',
+smalltalk.method({
+selector: 'peek',
+category: 'reading',
+fn: function (){
+var self=this;
+return self._atEnd()._ifFalse_((function(){return self._collection()._at_(self._position().__plus((1)));}));
+return self;},
+source: unescape('peek%0A%09%5Eself%20atEnd%20ifFalse%3A%20%5B%0A%09%20%20%20%20self%20collection%20at%3A%20self%20position%20+%201%5D%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_atEnd',
+smalltalk.method({
+selector: 'atEnd',
+category: 'testing',
+fn: function (){
+var self=this;
+return self._position().__eq(self._size());
+return self;},
+source: unescape('atEnd%0A%09%5Eself%20position%20%3D%20self%20size%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_atStart',
+smalltalk.method({
+selector: 'atStart',
+category: 'testing',
+fn: function (){
+var self=this;
+return self._position().__eq((0));
+return self;},
+source: unescape('atStart%0A%09%5Eself%20position%20%3D%200%0A')}),
+smalltalk.Stream);
+
+smalltalk.addMethod(
+'_isEmpty',
+smalltalk.method({
+selector: 'isEmpty',
+category: 'testing',
+fn: function (){
+var self=this;
+return self._size().__eq((0));
+return self;},
+source: unescape('isEmpty%0A%09%5Eself%20size%20%3D%200%0A')}),
+smalltalk.Stream);
+
+
+smalltalk.addMethod(
+'_on_',
+smalltalk.method({
+selector: 'on:',
+category: 'instance creation',
+fn: function (aCollection){
+var self=this;
+return (function($rec){$rec._setCollection_(aCollection);$rec._setStreamSize_(aCollection._size());return $rec._yourself();})(self._new());
+return self;},
+source: unescape('on%3A%20aCollection%0A%09%20%20%20%20%5Eself%20new%20%0A%09%09setCollection%3A%20aCollection%3B%0A%09%09setStreamSize%3A%20aCollection%20size%3B%0A%09%09yourself%0A')}),
+smalltalk.Stream.klass);
+
+
+smalltalk.addClass('StringStream', smalltalk.Stream, [], 'Kernel');
+smalltalk.addMethod(
+'_next_',
+smalltalk.method({
+selector: 'next:',
+category: 'reading',
+fn: function (anInteger){
+var self=this;
+var tempCollection=nil;
+tempCollection=self._collection()._class()._new();
+anInteger._timesRepeat_((function(){return self._atEnd()._ifFalse_((function(){return tempCollection=tempCollection.__comma(self._next());}));}));
+return tempCollection;
+return self;},
+source: unescape('next%3A%20anInteger%0A%09%7C%20tempCollection%20%7C%0A%09tempCollection%20%3A%3D%20self%20collection%20class%20new.%0A%09anInteger%20timesRepeat%3A%20%5B%0A%09%20%20%20%20self%20atEnd%20ifFalse%3A%20%5B%0A%09%09tempCollection%20%3A%3D%20tempCollection%2C%20self%20next%5D%5D.%0A%09%5EtempCollection%0A')}),
+smalltalk.StringStream);
+
+smalltalk.addMethod(
+'_nextPut_',
+smalltalk.method({
+selector: 'nextPut:',
+category: 'writing',
+fn: function (aString){
+var self=this;
+self._nextPutAll_(aString);
+return self;},
+source: unescape('nextPut%3A%20aString%0A%09self%20nextPutAll%3A%20aString%0A')}),
+smalltalk.StringStream);
+
+smalltalk.addMethod(
+'_nextPutAll_',
+smalltalk.method({
+selector: 'nextPutAll:',
+category: 'writing',
+fn: function (aString){
+var self=this;
+self._setCollection_(self._collection()._copyFrom_to_((1),self._position()).__comma(aString).__comma(self._collection()._copyFrom_to_(self._position().__plus((1)).__plus(aString._size()),self._collection()._size())));
+self._position_(self._position().__plus(aString._size()));
+self._setStreamSize_(self._streamSize()._max_(self._position()));
+return self;},
+source: unescape('nextPutAll%3A%20aString%0A%09self%20setCollection%3A%20%0A%09%20%20%20%20%28self%20collection%20copyFrom%3A%201%20to%3A%20self%20position%29%2C%0A%09%20%20%20%20aString%2C%0A%09%20%20%20%20%28self%20collection%20copyFrom%3A%20%28self%20position%20+%201%20+%20aString%20size%29%20to%3A%20self%20collection%20size%29.%0A%09self%20position%3A%20self%20position%20+%20aString%20size.%0A%09self%20setStreamSize%3A%20%28self%20streamSize%20max%3A%20self%20position%29%0A')}),
+smalltalk.StringStream);
+
+
+
+smalltalk.addClass('ClassCommentReader', smalltalk.Object, ['class', 'chunkParser'], 'Kernel');
+smalltalk.addMethod(
+'_class_',
+smalltalk.method({
+selector: 'class:',
+category: 'accessing',
+fn: function (aClass){
+var self=this;
+self['@class']=aClass;
+return self;},
+source: unescape('class%3A%20aClass%0A%09class%20%3A%3D%20aClass%0A')}),
+smalltalk.ClassCommentReader);
+
+smalltalk.addMethod(
+'_scanFrom_',
+smalltalk.method({
+selector: 'scanFrom:',
+category: 'fileIn',
+fn: function (aStream){
+var self=this;
+var nextChunk=nil;
+nextChunk=self['@chunkParser']._emptyChunk().__slash(self['@chunkParser']._chunk())._parse_(aStream);
+nextChunk._isEmptyChunk()._ifFalse_((function(){return self._setComment_(nextChunk._contents());}));
+return self;},
+source: unescape('scanFrom%3A%20aStream%0A%09%7C%20nextChunk%20%7C%0A%09nextChunk%20%3A%3D%20%28chunkParser%20emptyChunk%20/%20chunkParser%20chunk%29%20parse%3A%20aStream.%0A%09nextChunk%20isEmptyChunk%20ifFalse%3A%20%5B%0A%09%20%20%20%20self%20setComment%3A%20nextChunk%20contents%5D.%0A')}),
+smalltalk.ClassCommentReader);
+
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
+self['@chunkParser']=smalltalk.ChunkParser._new();
+return self;},
+source: unescape('initialize%0A%09super%20initialize.%0A%09chunkParser%20%3A%3D%20ChunkParser%20new.%0A')}),
+smalltalk.ClassCommentReader);
+
+smalltalk.addMethod(
+'_setComment_',
+smalltalk.method({
+selector: 'setComment:',
+category: 'private',
+fn: function (aString){
+var self=this;
+self['@class']._comment_(aString);
+return self;},
+source: unescape('setComment%3A%20aString%0A%20%20%20%20class%20comment%3A%20aString%0A')}),
+smalltalk.ClassCommentReader);
+
+
+
+

+ 69 - 0
js/less.js

@@ -0,0 +1,69 @@
+//
+// LESS - Leaner CSS v1.0.41
+// http://lesscss.org
+// 
+// Copyright (c) 2010, Alexis Sellier
+// Licensed under the Apache 2.0 License.
+//
+(function(z){function s(d){return z.less[d.split("/")[1]]}function U(){for(var d=document.getElementsByTagName("style"),b=0;b<d.length;b++)if(d[b].type.match(V))(new o.Parser).parse(d[b].innerHTML||"",function(a,g){d[b].type="text/css";d[b].innerHTML=g.toCSS()})}function W(d,b){for(var a=0;a<o.sheets.length;a++)X(o.sheets[a],d,b,o.sheets.length-(a+1))}function X(d,b,a,g){var e=z.location.href.replace(/[#?].*$/,""),h=d.href.replace(/\?.*$/,""),i=B&&B.getItem(h),k=B&&B.getItem(h+":timestamp"),n={css:i,
+timestamp:k};/^(https?|file):/.test(h)||(h=e.slice(0,e.lastIndexOf("/")+1)+h);Z(d.href,d.type,function(r,p){if(!a&&n&&p&&(new Date(p)).valueOf()===(new Date(n.timestamp)).valueOf()){N(n.css,d);b(null,d,{local:true,remaining:g})}else try{(new o.Parser({optimization:o.optimization,paths:[h.replace(/[\w\.-]+$/,"")],mime:d.type})).parse(r,function(K,O){if(K)return Q(K,h);try{b(O,d,{local:false,lastModified:p,remaining:g});var F=document.getElementById("less-error-message:"+R(h));F&&F.parentNode.removeChild(F)}catch(f){Q(f,
+h)}})}catch(t){Q(t,h)}},function(r,p){throw Error("Couldn't load "+p+" ("+r+")");})}function R(d){return d.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function N(d,b,a){var g,e=b.href?b.href.replace(/\?.*$/,""):"",h="less:"+(b.title||R(e));if((g=document.getElementById(h))===null){g=document.createElement("style");g.type="text/css";g.media=b.media||"screen";g.id=h;document.getElementsByTagName("head")[0].appendChild(g)}if(g.styleSheet)try{g.styleSheet.cssText=
+d}catch(i){throw Error("Couldn't reassign styleSheet.cssText.");}else(function(k){if(g.childNodes.length>0)g.firstChild.nodeValue!==k.nodeValue&&g.replaceChild(k,g.firstChild);else g.appendChild(k)})(document.createTextNode(d));if(a&&B){H("saving "+e+" to cache.");B.setItem(e,d);B.setItem(e+":timestamp",a)}}function Z(d,b,a,g){function e(k,n,r){if(k.status>=200&&k.status<300)n(k.responseText,k.getResponseHeader("Last-Modified"));else typeof r==="function"&&r(k.status,d)}var h=$(),i=P?false:o.async;
+typeof h.overrideMimeType==="function"&&h.overrideMimeType("text/css");h.open("GET",d,i);h.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5");h.send(null);if(P)h.status===0?a(h.responseText):g(h.status,d);else if(i)h.onreadystatechange=function(){h.readyState==4&&e(h,a,g)};else e(h,a,g)}function $(){if(z.XMLHttpRequest)return new XMLHttpRequest;else try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(d){H("browser doesn't support AJAX.");return null}}function H(d){o.env==
+"development"&&typeof console!=="undefined"&&console.log("less: "+d)}function Q(d,b){var a="less-error-message:"+R(b),g=document.createElement("div"),e,h;g.id=a;g.className="less-error-message";h="<h3>"+(d.message||"There is an error in your .less file")+'</h3><p><a href="'+b+'">'+b+"</a> ";if(d.extract)h+="on line "+d.line+", column "+(d.column+1)+":</p>"+'<ul>\n<li><label>[-1]</label><pre class="ctx">{0}</pre></li>\n<li><label>[0]</label><pre>{current}</pre></li>\n<li><label>[1]</label><pre class="ctx">{2}</pre></li>\n</ul>'.replace(/\[(-?\d)\]/g,
+function(i,k){return parseInt(d.line)+parseInt(k)||""}).replace(/\{(\d)\}/g,function(i,k){return d.extract[parseInt(k)]||""}).replace(/\{current\}/,d.extract[1].slice(0,d.column)+'<span class="error">'+d.extract[1].slice(d.column)+"</span>");g.innerHTML=h;N(".less-error-message ul, .less-error-message li {\nlist-style-type: none;\nmargin-right: 15px;\npadding: 4px 0;\nmargin: 0;\n}\n.less-error-message label {\nfont-size: 12px;\nmargin-right: 15px;\npadding: 4px 0;\ncolor: #cc7777;\n}\n.less-error-message pre {\ncolor: #ee4444;\npadding: 4px 0;\nmargin: 0;\ndisplay: inline-block;\n}\n.less-error-message pre.ctx {\ncolor: #dd4444;\n}\n.less-error-message h3 {\nfont-size: 20px;\nfont-weight: bold;\npadding: 15px 0 5px 0;\nmargin: 0;\n}\n.less-error-message a {\ncolor: #10a\n}\n.less-error-message .error {\ncolor: red;\nfont-weight: bold;\npadding-bottom: 2px;\nborder-bottom: 1px dashed red;\n}",
+{title:"error-message"});g.style.cssText="font-family: Arial, sans-serif;border: 1px solid #e00;background-color: #eee;border-radius: 5px;-webkit-border-radius: 5px;-moz-border-radius: 5px;color: #e00;padding: 15px;margin-bottom: 15px";if(o.env=="development")e=setInterval(function(){if(document.body){document.getElementById(a)?document.body.replaceChild(g,document.getElementById(a)):document.body.insertBefore(g,document.body.firstChild);clearInterval(e)}},10)}if(!Array.isArray)Array.isArray=function(d){return Object.prototype.toString.call(d)===
+"[object Array]"||d instanceof Array};if(!Array.prototype.forEach)Array.prototype.forEach=function(d,b){for(var a=this.length>>>0,g=0;g<a;g++)g in this&&d.call(b,this[g],g,this)};if(!Array.prototype.map)Array.prototype.map=function(d,b){for(var a=this.length>>>0,g=Array(a),e=0;e<a;e++)if(e in this)g[e]=d.call(b,this[e],e,this);return g};if(!Array.prototype.filter)Array.prototype.filter=function(d,b){for(var a=[],g=0;g<this.length;g++)d.call(b,this[g])&&a.push(this[g]);return a};if(!Array.prototype.reduce)Array.prototype.reduce=
+function(d){var b=this.length>>>0,a=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var g=arguments[1];else{do{if(a in this){g=this[a++];break}if(++a>=b)throw new TypeError;}while(1)}for(;a<b;a++)if(a in this)g=d.call(null,g,this[a],a,this);return g};if(!Array.prototype.indexOf)Array.prototype.indexOf=function(d,b){var a=this.length,g=b||0;if(!a)return-1;if(g>=a)return-1;if(g<0)g+=a;for(;g<a;g++)if(Object.prototype.hasOwnProperty.call(this,g))if(d===this[g])return g;return-1};
+if(!Object.keys)Object.keys=function(d){var b=[],a;for(a in d)Object.prototype.hasOwnProperty.call(d,a)&&b.push(a);return b};if(!String.prototype.trim)String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")};var o,m;if(typeof z==="undefined"){o=exports;m=s("less/tree")}else{if(typeof z.less==="undefined")z.less={};o=z.less;m=z.less.tree={}}o.Parser=function(d){function b(){if(h>t){p[i]=p[i].slice(h-t);t=h}}function a(f){var j,l,q;if(f instanceof Function)return f.call(K.parsers);
+else if(typeof f==="string"){f=e.charAt(h)===f?f:null;j=1;b()}else{b();if(f=f.exec(p[i]))j=f[0].length;else return null}if(f){mem=h+=j;for(q=h+p[i].length-j;h<q;){l=e.charCodeAt(h);if(!(l===32||l===10||l===9))break;h++}p[i]=p[i].slice(j+(h-mem));t=h;p[i].length===0&&i<p.length-1&&i++;return typeof f==="string"?f:f.length===1?f[0]:f}}function g(f){return typeof f==="string"?e.charAt(h)===f:f.test(p[i])?true:false}var e,h,i,k,n,r,p,t,K,O=function(){},F=this.imports={paths:d&&d.paths||[],queue:[],files:{},
+mime:d&&d.mime,push:function(f,j){var l=this;this.queue.push(f);o.Parser.importer(f,this.paths,function(q){l.queue.splice(l.queue.indexOf(f),1);l.files[f]=q;j(q);l.queue.length===0&&O()},d)}};this.env=d=d||{};this.optimization="optimization"in this.env?this.env.optimization:1;this.env.filename=this.env.filename||null;return K={imports:F,parse:function(f,j){var l,q,I,S=null;h=i=t=r=0;p=[];e=f.replace(/\r\n/g,"\n");p=function(L){for(var D=0,E=/[^"'`\{\}\/]+/g,G=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,
+A=0,w,x=L[0],y,u=0,v;u<e.length;u++){E.lastIndex=u;if(w=E.exec(e))if(w.index===u){u+=w[0].length;x.push(w[0])}v=e.charAt(u);G.lastIndex=u;if(!y&&v==="/"){w=e.charAt(u+1);if(w==="/"||w==="*")if(w=G.exec(e))if(w.index===u){u+=w[0].length;x.push(w[0]);v=e.charAt(u)}}if(v==="{"&&!y){A++;x.push(v)}else if(v==="}"&&!y){A--;x.push(v);L[++D]=x=[]}else{if(v==='"'||v==="'"||v==="`")y=y?y===v?false:y:v;x.push(v)}}if(A>0)throw{type:"Syntax",message:"Missing closing `}`",filename:d.filename};return L.map(function(C){return C.join("")})}([[]]);
+l=new m.Ruleset([],a(this.parsers.primary));l.root=true;l.toCSS=function(L){var D,E;return function(G,A){function w(v){return v?(e.slice(0,v).match(/\n/g)||"").length:null}var x=[];G=G||{};if(typeof A==="object"&&!Array.isArray(A)){A=Object.keys(A).map(function(v){var C=A[v];if(!(C instanceof m.Value)){C instanceof m.Expression||(C=new m.Expression([C]));C=new m.Value([C])}return new m.Rule("@"+v,C,false,0)});x=[new m.Ruleset(null,A)]}try{var y=L.call(this,{frames:x}).toCSS([],{compress:G.compress||
+false})}catch(u){E=e.split("\n");D=w(u.index);x=u.index;for(y=-1;x>=0&&e.charAt(x)!=="\n";x--)y++;throw{type:u.type,message:u.message,filename:d.filename,index:u.index,line:typeof D==="number"?D+1:null,callLine:u.call&&w(u.call)+1,callExtract:E[w(u.call)],stack:u.stack,column:y,extract:[E[D-1],E[D],E[D+1]]};}return G.compress?y.replace(/(\s)+/g,"$1"):y}}(l.eval);if(h<e.length-1){h=r;I=e.split("\n");q=(e.slice(0,h).match(/\n/g)||"").length+1;for(var T=h,Y=-1;T>=0&&e.charAt(T)!=="\n";T--)Y++;S={name:"ParseError",
+message:"Syntax Error on line "+q,filename:d.filename,line:q,column:Y,extract:[I[q-2],I[q-1],I[q]]}}if(this.imports.queue.length>0)O=function(){j(S,l)};else j(S,l)},parsers:{primary:function(){for(var f,j=[];(f=a(this.mixin.definition)||a(this.rule)||a(this.ruleset)||a(this.mixin.call)||a(this.comment)||a(this.directive))||a(/^[\s\n]+/);)f&&j.push(f);return j},comment:function(){var f;if(e.charAt(h)==="/")if(e.charAt(h+1)==="/")return new m.Comment(a(/^\/\/.*/),true);else if(f=a(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new m.Comment(f)},
+entities:{quoted:function(){var f;if(!(e.charAt(h)!=='"'&&e.charAt(h)!=="'"))if(f=a(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new m.Quoted(f[0],f[1]||f[2])},keyword:function(){var f;if(f=a(/^[A-Za-z-]+/))return new m.Keyword(f)},call:function(){var f,j;if(f=/^([\w-]+|%)\(/.exec(p[i])){f=f[1].toLowerCase();if(f==="url")return null;else h+=f.length+1;if(f==="alpha")return a(this.alpha);j=a(this.entities.arguments);if(a(")"))if(f)return new m.Call(f,j)}},arguments:function(){for(var f=
+[],j;j=a(this.expression);){f.push(j);if(!a(","))break}return f},literal:function(){return a(this.entities.dimension)||a(this.entities.color)||a(this.entities.quoted)},url:function(){var f;if(!(e.charAt(h)!=="u"||!a(/^url\(/))){f=a(this.entities.quoted)||a(this.entities.variable)||a(this.entities.dataURI)||a(/^[-\w%@$\/.&=:;#+?]+/)||"";if(!a(")"))throw Error("missing closing ) for url()");return new m.URL(f.value||f.data||f instanceof m.Variable?f:new m.Anonymous(f),F.paths)}},dataURI:function(){var f;
+if(a(/^data:/)){f={};f.mime=a(/^[^\/]+\/[^,;)]+/)||"";f.charset=a(/^;\s*charset=[^,;)]+/)||"";f.base64=a(/^;\s*base64/)||"";f.data=a(/^,\s*[^)]+/);if(f.data)return f}},variable:function(){var f,j=h;if(e.charAt(h)==="@"&&(f=a(/^@[\w-]+/)))return new m.Variable(f,j)},color:function(){var f;if(e.charAt(h)==="#"&&(f=a(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new m.Color(f[1])},dimension:function(){var f;f=e.charCodeAt(h);if(!(f>57||f<45||f===47))if(f=a(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new m.Dimension(f[1],
+f[2])},javascript:function(){var f;if(e.charAt(h)==="`")if(f=a(/^`([^`]*)`/))return new m.JavaScript(f[1],h)}},variable:function(){var f;if(e.charAt(h)==="@"&&(f=a(/^(@[\w-]+)\s*:/)))return f[1]},shorthand:function(){var f,j;if(g(/^[@\w.%-]+\/[@\w.-]+/))if((f=a(this.entity))&&a("/")&&(j=a(this.entity)))return new m.Shorthand(f,j)},mixin:{call:function(){var f=[],j,l,q,I=h;j=e.charAt(h);if(!(j!=="."&&j!=="#")){for(;j=a(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/);){f.push(new m.Element(l,
+j));l=a(">")}a("(")&&(q=a(this.entities.arguments))&&a(")");if(f.length>0&&(a(";")||g("}")))return new m.mixin.Call(f,q,I)}},definition:function(){var f,j=[],l,q;if(!(e.charAt(h)!=="."&&e.charAt(h)!=="#"||g(/^[^{]*(;|})/)))if(f=a(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){for(f=f[1];l=a(this.entities.variable)||a(this.entities.literal)||a(this.entities.keyword);){if(l instanceof m.Variable)if(a(":"))if(q=a(this.expression))j.push({name:l.name,value:q});else throw Error("Expected value");
+else j.push({name:l.name});else j.push({value:l});if(!a(","))break}if(!a(")"))throw Error("Expected )");if(l=a(this.block))return new m.mixin.Definition(f,j,l)}}},entity:function(){return a(this.entities.literal)||a(this.entities.variable)||a(this.entities.url)||a(this.entities.call)||a(this.entities.keyword)||a(this.entities.javascript)},end:function(){return a(";")||g("}")},alpha:function(){var f;if(a(/^opacity=/i))if(f=a(/^\d+/)||a(this.entities.variable)){if(!a(")"))throw Error("missing closing ) for alpha()");
+return new m.Alpha(f)}},element:function(){var f;c=a(this.combinator);if(f=a(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||a("*")||a(this.attribute)||a(/^\([^)@]+\)/))return new m.Element(c,f)},combinator:function(){var f=e.charAt(h);if(f===">"||f==="&"||f==="+"||f==="~"){for(h++;e.charAt(h)===" ";)h++;return new m.Combinator(f)}else if(f===":"&&e.charAt(h+1)===":"){for(h+=2;e.charAt(h)===" ";)h++;return new m.Combinator("::")}else return e.charAt(h-1)===" "?new m.Combinator(" "):
+new m.Combinator(null)},selector:function(){for(var f,j=[],l;f=a(this.element);){l=e.charAt(h);j.push(f);if(l==="{"||l==="}"||l===";"||l===",")break}if(j.length>0)return new m.Selector(j)},tag:function(){return a(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||a("*")},attribute:function(){var f="",j,l,q;if(a("[")){if(j=a(/^[a-zA-Z-]+/)||a(this.entities.quoted))f=(q=a(/^[|~*$^]?=/))&&(l=a(this.entities.quoted)||a(/^[\w-]+/))?[j,q,l.toCSS?l.toCSS():l].join(""):j;if(a("]"))if(f)return"["+f+"]"}},block:function(){var f;
+if(a("{")&&(f=a(this.primary))&&a("}"))return f},ruleset:function(){var f=[],j,l;k=p[i];t=n=h;if(j=/^([.#: \w-]+)[\s\n]*\{/.exec(p[i])){h+=j[0].length-1;f=[new m.Selector([new m.Element(null,j[1])])]}else{for(;j=a(this.selector);){f.push(j);if(!a(","))break}j&&a(this.comment)}if(f.length>0&&(l=a(this.block)))return new m.Ruleset(f,l);else{r=h;p[i]=k;t=h=n}},rule:function(){var f,j;f=e.charAt(h);var l;k=p[i];t=n=h;if(!(f==="."||f==="#"||f==="&"))if(f=a(this.variable)||a(this.property)){if(f.charAt(0)!=
+"@"&&(match=/^([^@+\/'"*`(;{}-]*);/.exec(p[i]))){h+=match[0].length-1;j=new m.Anonymous(match[1])}else j=f==="font"?a(this.font):a(this.value);l=a(this.important);if(j&&a(this.end))return new m.Rule(f,j,l,n);else{r=h;p[i]=k;t=h=n}}},"import":function(){var f;if(a(/^@import\s+/)&&(f=a(this.entities.quoted)||a(this.entities.url))&&a(";"))return new m.Import(f,F)},directive:function(){var f,j,l;if(e.charAt(h)==="@")if(j=a(this["import"]))return j;else if(f=a(/^@media|@page/)){l=(a(/^[^{]+/)||"").trim();
+if(j=a(this.block))return new m.Directive(f+" "+l,j)}else if(f=a(/^@[-a-z]+/))if(f==="@font-face"){if(j=a(this.block))return new m.Directive(f,j)}else if((j=a(this.entity))&&a(";"))return new m.Directive(f,j)},font:function(){for(var f=[],j=[],l;l=a(this.shorthand)||a(this.entity);)j.push(l);f.push(new m.Expression(j));if(a(","))for(;l=a(this.expression);){f.push(l);if(!a(","))break}return new m.Value(f)},value:function(){for(var f,j=[];f=a(this.expression);){j.push(f);if(!a(","))break}if(j.length>
+0)return new m.Value(j)},important:function(){if(e.charAt(h)==="!")return a(/^! *important/)},sub:function(){var f;if(a("(")&&(f=a(this.expression))&&a(")"))return f},multiplication:function(){var f,j,l,q;if(f=a(this.operand)){for(;(l=a("/")||a("*"))&&(j=a(this.operand));)q=new m.Operation(l,[q||f,j]);return q||f}},addition:function(){var f,j,l,q;if(f=a(this.multiplication)){for(;(l=a(/^[-+]\s+/)||e.charAt(h-1)!=" "&&(a("+")||a("-")))&&(j=a(this.multiplication));)q=new m.Operation(l,[q||f,j]);return q||
+f}},operand:function(){return a(this.sub)||a(this.entities.dimension)||a(this.entities.color)||a(this.entities.variable)||a(this.entities.call)},expression:function(){for(var f,j=[];f=a(this.addition)||a(this.entity);)j.push(f);if(j.length>0)return new m.Expression(j)},property:function(){var f;if(f=a(/^(\*?-?[-a-z_0-9]+)\s*:/))return f[1]}}}};if(typeof z!=="undefined")o.Parser.importer=function(d,b,a,g){if(d.charAt(0)!=="/"&&b.length>0)d=b[0]+d;X({href:d,title:d,type:g.mime},a,true)};(function(d){function b(e){return d.functions.hsla(e.h,
+e.s,e.l,e.a)}function a(e){if(e instanceof d.Dimension)return parseFloat(e.unit=="%"?e.value/100:e.value);else if(typeof e==="number")return e;else throw{error:"RuntimeError",message:"color functions take numbers as parameters"};}function g(e){return Math.min(1,Math.max(0,e))}d.functions={rgb:function(e,h,i){return this.rgba(e,h,i,1)},rgba:function(e,h,i,k){e=[e,h,i].map(function(n){return a(n)});k=a(k);return new d.Color(e,k)},hsl:function(e,h,i){return this.hsla(e,h,i,1)},hsla:function(e,h,i,k){function n(t){t=
+t<0?t+1:t>1?t-1:t;return t*6<1?p+(r-p)*t*6:t*2<1?r:t*3<2?p+(r-p)*(2/3-t)*6:p}e=a(e)%360/360;h=a(h);i=a(i);k=a(k);var r=i<=0.5?i*(h+1):i+h-i*h,p=i*2-r;return this.rgba(n(e+1/3)*255,n(e)*255,n(e-1/3)*255,k)},hue:function(e){return new d.Dimension(Math.round(e.toHSL().h))},saturation:function(e){return new d.Dimension(Math.round(e.toHSL().s*100),"%")},lightness:function(e){return new d.Dimension(Math.round(e.toHSL().l*100),"%")},alpha:function(e){return new d.Dimension(e.toHSL().a)},saturate:function(e,
+h){var i=e.toHSL();i.s+=h.value/100;i.s=g(i.s);return b(i)},desaturate:function(e,h){var i=e.toHSL();i.s-=h.value/100;i.s=g(i.s);return b(i)},lighten:function(e,h){var i=e.toHSL();i.l+=h.value/100;i.l=g(i.l);return b(i)},darken:function(e,h){var i=e.toHSL();i.l-=h.value/100;i.l=g(i.l);return b(i)},fadein:function(e,h){var i=e.toHSL();i.a+=h.value/100;i.a=g(i.a);return b(i)},fadeout:function(e,h){var i=e.toHSL();i.a-=h.value/100;i.a=g(i.a);return b(i)},spin:function(e,h){var i=e.toHSL(),k=(i.h+h.value)%
+360;i.h=k<0?360+k:k;return b(i)},mix:function(e,h,i){i=i.value/100;var k=i*2-1,n=e.toHSL().a-h.toHSL().a;k=((k*n==-1?k:(k+n)/(1+k*n))+1)/2;n=1-k;return new d.Color([e.rgb[0]*k+h.rgb[0]*n,e.rgb[1]*k+h.rgb[1]*n,e.rgb[2]*k+h.rgb[2]*n],e.alpha*i+h.alpha*(1-i))},greyscale:function(e){return this.desaturate(e,new d.Dimension(100))},e:function(e){return new d.Anonymous(e instanceof d.JavaScript?e.evaluated:e)},"%":function(e){for(var h=Array.prototype.slice.call(arguments,1),i=e.value,k=0;k<h.length;k++)i=
+i.replace(/%s/,h[k].value).replace(/%[da]/,h[k].toCSS());i=i.replace(/%%/g,"%");return new d.Quoted('"'+i+'"',i)}}})(s("less/tree"));(function(d){d.Alpha=function(b){this.value=b};d.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(){return this}}})(s("less/tree"));(function(d){d.Anonymous=function(b){this.value=b.value||b};d.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}})(s("less/tree"));
+(function(d){d.Call=function(b,a){this.name=b;this.args=a};d.Call.prototype={eval:function(b){var a=this.args.map(function(g){return g.eval(b)});return this.name in d.functions?d.functions[this.name].apply(d.functions,a):new d.Anonymous(this.name+"("+a.map(function(g){return g.toCSS()}).join(", ")+")")},toCSS:function(b){return this.eval(b).toCSS()}}})(s("less/tree"));(function(d){d.Color=function(b,a){this.rgb=Array.isArray(b)?b:b.length==6?b.match(/.{2}/g).map(function(g){return parseInt(g,16)}):
+b.split("").map(function(g){return parseInt(g+g,16)});this.alpha=typeof a==="number"?a:1};d.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(b){return Math.round(b)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(b){b=Math.round(b);b=(b>255?255:b<0?0:b).toString(16);return b.length===1?"0"+b:b}).join("")},operate:function(b,a){var g=[];a instanceof d.Color||(a=a.toColor());for(var e=0;e<3;e++)g[e]=d.operate(b,this.rgb[e],
+a.rgb[e]);return new d.Color(g)},toHSL:function(){var b=this.rgb[0]/255,a=this.rgb[1]/255,g=this.rgb[2]/255,e=this.alpha,h=Math.max(b,a,g),i=Math.min(b,a,g),k,n=(h+i)/2,r=h-i;if(h===i)k=i=0;else{i=n>0.5?r/(2-h-i):r/(h+i);switch(h){case b:k=(a-g)/r+(a<g?6:0);break;case a:k=(g-b)/r+2;break;case g:k=(b-a)/r+4}k/=6}return{h:k*360,s:i,l:n,a:e}}}})(s("less/tree"));(function(d){d.Comment=function(b,a){this.value=b;this.silent=!!a};d.Comment.prototype={toCSS:function(b){return b.compress?"":this.value},eval:function(){return this}}})(s("less/tree"));
+(function(d){d.Dimension=function(b,a){this.value=parseFloat(b);this.unit=a||null};d.Dimension.prototype={eval:function(){return this},toColor:function(){return new d.Color([this.value,this.value,this.value])},toCSS:function(){return this.value+this.unit},operate:function(b,a){return new d.Dimension(d.operate(b,this.value,a.value),this.unit||a.unit)}}})(s("less/tree"));(function(d){d.Directive=function(b,a){this.name=b;if(Array.isArray(a))this.ruleset=new d.Ruleset([],a);else this.value=a};d.Directive.prototype=
+{toCSS:function(b,a){if(this.ruleset){this.ruleset.root=true;return this.name+(a.compress?"{":" {\n  ")+this.ruleset.toCSS(b,a).trim().replace(/\n/g,"\n  ")+(a.compress?"}":"\n}\n")}else return this.name+" "+this.value.toCSS()+";\n"},eval:function(b){b.frames.unshift(this);this.ruleset=this.ruleset&&this.ruleset.eval(b);b.frames.shift();return this},variable:function(b){return d.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return d.Ruleset.prototype.find.apply(this.ruleset,arguments)},
+rulesets:function(){return d.Ruleset.prototype.rulesets.apply(this.ruleset)}}})(s("less/tree"));(function(d){d.Element=function(b,a){this.combinator=b instanceof d.Combinator?b:new d.Combinator(b);this.value=a.trim()};d.Element.prototype.toCSS=function(b){return this.combinator.toCSS(b||{})+this.value};d.Combinator=function(b){this.value=b===" "?" ":b?b.trim():""};d.Combinator.prototype.toCSS=function(b){return{"":""," ":" ","&":"",":":" :","::":"::","+":b.compress?"+":" + ","~":b.compress?"~":" ~ ",
+">":b.compress?">":" > "}[this.value]}})(s("less/tree"));(function(d){d.Expression=function(b){this.value=b};d.Expression.prototype={eval:function(b){return this.value.length>1?new d.Expression(this.value.map(function(a){return a.eval(b)})):this.value[0].eval(b)},toCSS:function(b){return this.value.map(function(a){return a.toCSS(b)}).join(" ")}}})(s("less/tree"));(function(d){d.Import=function(b,a){var g=this;this._path=b;this.path=b instanceof d.Quoted?/\.(le?|c)ss$/.test(b.value)?b.value:b.value+
+".less":b.value.value||b.value;(this.css=/css$/.test(this.path))||a.push(this.path,function(e){if(!e)throw Error("Error parsing "+g.path);g.root=e})};d.Import.prototype={toCSS:function(){return this.css?"@import "+this._path.toCSS()+";\n":""},eval:function(b){var a;if(this.css)return this;else{a=new d.Ruleset(null,this.root.rules.slice(0));for(var g=0;g<a.rules.length;g++)a.rules[g]instanceof d.Import&&Array.prototype.splice.apply(a.rules,[g,1].concat(a.rules[g].eval(b)));return a.rules}}}})(s("less/tree"));
+(function(d){d.JavaScript=function(b,a){this.expression=b;this.index=a};d.JavaScript.prototype={toCSS:function(){return JSON.stringify(this.evaluated)},eval:function(b){var a=new Function("return ("+this.expression+")"),g={},e;for(e in b.frames[0].variables())g[e.slice(1)]={value:b.frames[0].variables()[e].value,toJS:function(){return this.value.eval(b).toCSS()}};try{this.evaluated=a.call(g)}catch(h){throw{message:"JavaScript evaluation error: '"+h.name+": "+h.message+"'",index:this.index};}return this}}})(s("less/tree"));
+(function(d){d.Keyword=function(b){this.value=b};d.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value}}})(s("less/tree"));(function(d){d.mixin={};d.mixin.Call=function(b,a,g){this.selector=new d.Selector(b);this.arguments=a;this.index=g};d.mixin.Call.prototype={eval:function(b){for(var a,g=[],e=false,h=0;h<b.frames.length;h++)if((a=b.frames[h].find(this.selector)).length>0){for(h=0;h<a.length;h++)if(a[h].match(this.arguments,b))try{Array.prototype.push.apply(g,a[h].eval(b,
+this.arguments).rules);e=true}catch(i){throw{message:i.message,index:i.index,stack:i.stack,call:this.index};}if(e)return g;else throw{message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(k){return k.toCSS()}).join(", ")+")`",index:this.index};}throw{message:this.selector.toCSS().trim()+" is undefined",index:this.index};}};d.mixin.Definition=function(b,a,g){this.name=b;this.selectors=[new d.Selector([new d.Element(null,b)])];this.params=a;this.arity=
+a.length;this.rules=g;this._lookups={};this.required=a.reduce(function(e,h){return!h.name||h.name&&!h.value?e+1:e},0);this.parent=d.Ruleset.prototype;this.frames=[]};d.mixin.Definition.prototype={toCSS:function(){return""},variable:function(b){return this.parent.variable.call(this,b)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},eval:function(b,a){for(var g=
+new d.Ruleset(null,[]),e=0,h;e<this.params.length;e++)if(this.params[e].name)if(h=a&&a[e]||this.params[e].value)g.rules.unshift(new d.Rule(this.params[e].name,h.eval(b)));else throw{message:"wrong number of arguments for "+this.name+" ("+a.length+" for "+this.arity+")"};return(new d.Ruleset(null,this.rules.slice(0))).eval({frames:[this,g].concat(this.frames,b.frames)})},match:function(b,a){var g=b&&b.length||0;if(g<this.required)return false;if(this.required>0&&g>this.params.length)return false;g=
+Math.min(g,this.arity);for(var e=0;e<g;e++)if(!this.params[e].name)if(b[e].eval(a).toCSS()!=this.params[e].value.eval(a).toCSS())return false;return true}}})(s("less/tree"));(function(d){d.Operation=function(b,a){this.op=b.trim();this.operands=a};d.Operation.prototype.eval=function(b){var a=this.operands[0].eval(b);b=this.operands[1].eval(b);var g;if(a instanceof d.Dimension&&b instanceof d.Color)if(this.op==="*"||this.op==="+"){g=b;b=a;a=g}else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};
+return a.operate(this.op,b)};d.operate=function(b,a,g){switch(b){case "+":return a+g;case "-":return a-g;case "*":return a*g;case "/":return a/g}}})(s("less/tree"));(function(d){d.Quoted=function(b,a){this.value=a||"";this.quote=b.charAt(0)};d.Quoted.prototype={toCSS:function(){return this.quote+this.value+this.quote},eval:function(){return this}}})(s("less/tree"));(function(d){d.Rule=function(b,a,g,e){this.name=b;this.value=a instanceof d.Value?a:new d.Value([a]);this.important=g?" "+g.trim():"";
+this.index=e;this.variable=b.charAt(0)==="@"?true:false};d.Rule.prototype.toCSS=function(b){return this.variable?"":this.name+(b.compress?":":": ")+this.value.toCSS(b)+this.important+";"};d.Rule.prototype.eval=function(b){return new d.Rule(this.name,this.value.eval(b),this.important,this.index)};d.Shorthand=function(b,a){this.a=b;this.b=a};d.Shorthand.prototype={toCSS:function(b){return this.a.toCSS(b)+"/"+this.b.toCSS(b)},eval:function(){return this}}})(s("less/tree"));(function(d){d.Ruleset=function(b,
+a){this.selectors=b;this.rules=a;this._lookups={}};d.Ruleset.prototype={eval:function(b){var a=new d.Ruleset(this.selectors,this.rules.slice(0));a.root=this.root;b.frames.unshift(a);if(a.root)for(var g=0;g<a.rules.length;g++)a.rules[g]instanceof d.Import&&Array.prototype.splice.apply(a.rules,[g,1].concat(a.rules[g].eval(b)));for(g=0;g<a.rules.length;g++)if(a.rules[g]instanceof d.mixin.Definition)a.rules[g].frames=b.frames.slice(0);for(g=0;g<a.rules.length;g++)a.rules[g]instanceof d.mixin.Call&&Array.prototype.splice.apply(a.rules,
+[g,1].concat(a.rules[g].eval(b)));g=0;for(var e;g<a.rules.length;g++){e=a.rules[g];e instanceof d.mixin.Definition||(a.rules[g]=e.eval?e.eval(b):e)}b.frames.shift();return a},match:function(b){return!b||b.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,a){if(a instanceof d.Rule&&a.variable===true)b[a.name]=a;return b},{})},variable:function(b){return this.variables()[b]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=
+this.rules.filter(function(b){return b instanceof d.Ruleset||b instanceof d.mixin.Definition})},find:function(b,a){a=a||this;var g=[],e=b.toCSS();if(e in this._lookups)return this._lookups[e];this.rulesets().forEach(function(h){if(h!==a)for(var i=0;i<h.selectors.length;i++)if(b.match(h.selectors[i])){b.elements.length>1?Array.prototype.push.apply(g,h.find(new d.Selector(b.elements.slice(1)),a)):g.push(h);break}});return this._lookups[e]=g},toCSS:function(b,a){var g=[],e=[],h=[],i=[],k;if(!this.root)if(b.length===
+0)i=this.selectors.map(function(r){return[r]});else for(k=0;k<this.selectors.length;k++)for(var n=0;n<b.length;n++)i.push(b[n].concat([this.selectors[k]]));for(n=0;n<this.rules.length;n++){k=this.rules[n];if(k.rules||k instanceof d.Directive)h.push(k.toCSS(i,a));else if(k instanceof d.Comment)k.silent||(this.root?h.push(k.toCSS(a)):e.push(k.toCSS(a)));else if(k.toCSS&&!k.variable)e.push(k.toCSS(a));else k.value&&!k.variable&&e.push(k.value.toString())}h=h.join("");if(this.root)g.push(e.join(a.compress?
+"":"\n"));else if(e.length>0){i=i.map(function(r){return r.map(function(p){return p.toCSS(a)}).join("").trim()}).join(a.compress?",":i.length>3?",\n":", ");g.push(i,(a.compress?"{":" {\n  ")+e.join(a.compress?"":"\n  ")+(a.compress?"}":"\n}\n"))}g.push(h);return g.join("")+(a.compress?"\n":"")}}})(s("less/tree"));(function(d){d.Selector=function(b){this.elements=b;if(this.elements[0].combinator.value==="")this.elements[0].combinator.value=" "};d.Selector.prototype.match=function(b){return this.elements[0].value===
+b.elements[0].value?true:false};d.Selector.prototype.toCSS=function(b){if(this._css)return this._css;return this._css=this.elements.map(function(a){return typeof a==="string"?" "+a.trim():a.toCSS(b)}).join("")}})(s("less/tree"));(function(d){d.URL=function(b,a){if(b.data)this.attrs=b;else{if(!/^(?:https?:\/|file:\/)?\//.test(b.value)&&a.length>0&&typeof z!=="undefined")b.value=a[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value);this.value=b;this.paths=a}};d.URL.prototype={toCSS:function(){return"url("+
+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(b){return this.attrs?this:new d.URL(this.value.eval(b),this.paths)}}})(s("less/tree"));(function(d){d.Value=function(b){this.value=b;this.is="value"};d.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new d.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(b){return this.value.map(function(a){return a.toCSS(b)}).join(b.compress?
+",":", ")}}})(s("less/tree"));(function(d){d.Variable=function(b,a){this.name=b;this.index=a};d.Variable.prototype={eval:function(b){var a,g,e=this.name;if(a=d.find(b.frames,function(h){if(g=h.variable(e))return g.value.eval(b)}))return a;else throw{message:"variable "+this.name+" is undefined",index:this.index};}}})(s("less/tree"));s("less/tree").find=function(d,b){for(var a=0,g;a<d.length;a++)if(g=b.call(d,d[a]))return g;return null};var P=location.protocol==="file:"||location.protocol==="chrome:"||
+location.protocol==="resource:";o.env=o.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||P?"development":"production");o.async=false;o.poll=o.poll||(P?1E3:1500);o.watch=function(){return this.watchMode=true};o.unwatch=function(){return this.watchMode=false};if(o.env==="development"){o.optimization=0;/!watch/.test(location.hash)&&o.watch();o.watchTimer=setInterval(function(){o.watchMode&&W(function(d,b,a){d&&N(d.toCSS(),b,a.lastModified)})},
+o.poll)}else o.optimization=3;var B;try{B=typeof z.localStorage==="undefined"?null:z.localStorage}catch(aa){B=null}var M=document.getElementsByTagName("link"),V=/^text\/(x-)?less$/;o.sheets=[];for(var J=0;J<M.length;J++)if(M[J].rel==="stylesheet/less"||M[J].rel.match(/stylesheet/)&&M[J].type.match(V))o.sheets.push(M[J]);o.refresh=function(d){var b=endTime=new Date;W(function(a,g,e){if(e.local)H("loading "+g.href+" from cache.");else{H("parsed "+g.href+" successfully.");N(a.toCSS(),g,e.lastModified)}H("css for "+
+g.href+" generated in "+(new Date-endTime)+"ms");e.remaining===0&&H("css generated in "+(new Date-b)+"ms");endTime=new Date},d);U()};o.refreshStyles=U;o.refresh(o.env==="development")})(window);

Разница между файлами не показана из-за своего большого размера
+ 897 - 0
js/parser.js


+ 10 - 0
scripts/compile.js

@@ -0,0 +1,10 @@
+if(arguments[0]) {
+    smalltalk.Importer._new()._import_(read(arguments[0])._stream());
+}
+
+if(arguments[1]) {
+    print(smalltalk.Exporter._new()._exportCategory_(arguments[1]));
+}
+
+
+

+ 27 - 0
scripts/jtalk

@@ -0,0 +1,27 @@
+#!/bin/bash
+
+USAGE=" $0 [OPTIONS]\n\n
+
+The currently defined set of flags is:\n\n
+
+-o category\t fileout compiled classes in category\n
+-f file   \t filein file\n"
+FILE=''
+CATEGORY=''
+
+if [ $# == 0 ]; then
+        echo -e $USAGE
+        exit 1
+fi
+
+while getopts f:o:h o
+do        case "$o" in
+        f) 	  FILE="$OPTARG";;
+        o) 	  CATEGORY="$OPTARG";;
+        h)    echo -e "Usage:"
+              echo -e $USAGE
+                exit 1;;
+        esac
+done
+
+d8 ./js/boot.js ./js/kernel.js ./js/parser.js ./js/compiler.js ./js/canvas.js ./js/init.js ./scripts/compile.js -- $FILE $CATEGORY

+ 372 - 0
st/canvas.st

@@ -0,0 +1,372 @@
+Object subclass: #HTMLCanvas
+	instanceVariableNames: 'root'
+	category: 'Canvas'!
+
+!HTMLCanvas methodsFor: 'accessing'!
+
+root: aTagBrush
+    root := aTagBrush
+!
+
+root
+    ^root
+! !
+
+!HTMLCanvas methodsFor: 'initialization'!
+
+initialize
+    super initialize.
+    root := TagBrush fromString: 'div' canvas: self
+! !
+
+!HTMLCanvas methodsFor: 'tags'!
+
+newTag: aString
+    ^TagBrush fromString: aString canvas: self
+!
+
+tag: aString
+    ^root addBrush: (self newTag: aString)
+!
+
+h1
+    ^self tag: 'h1'
+!
+
+h2
+    ^self tag: 'h2'
+!
+
+h3
+    ^self tag: 'h3'
+!
+
+h4
+    ^self tag: 'h4'
+!
+
+h5
+    ^self tag: 'h5'
+!
+
+h6
+    ^self tag: 'h6'
+!
+
+p
+    ^self tag: 'p'
+!
+
+div
+    ^self tag: 'div'
+!
+
+span
+    ^self tag: 'span'
+!
+
+img
+    ^self tag: 'img'
+!
+
+ul
+    ^self tag: 'ul'
+!
+
+ol
+    ^self tag: 'ol'
+!
+
+li
+    ^self tag: 'li'
+!
+
+table
+    ^self tag: 'table'
+!
+
+tr
+    ^self tag: 'tr'
+!
+
+td 
+    ^self tag: 'td'
+!
+
+th
+    ^self tag: 'th'
+!
+
+form
+    ^self tag: 'form'
+!
+
+input
+    ^self tag: 'input'
+!
+
+button
+    ^self tag: 'button'
+!
+
+select
+    ^self tag: 'select'
+!
+
+option
+    ^self tag: 'option'
+!
+
+textarea
+    ^self tag: 'textarea'
+!
+
+a
+    ^self tag: 'a'
+! !
+
+
+!HTMLCanvas methodsFor: '*JQuery'!
+
+appendToJQuery: aJQuery
+    aJQuery appendElement: root element
+! !
+
+
+Object subclass: #TagBrush
+	instanceVariableNames: 'element'
+	category: 'Canvas'!
+
+!TagBrush class methodsFor: 'instance creation'!
+
+fromString: aString canvas: aCanvas
+    ^self new
+	initializeFromString: aString canvas: aCanvas;
+	yourself
+! !
+
+!TagBrush methodsFor: 'adding'!
+
+contents: anObject
+    self asJQuery empty.
+    self append: anObject
+!
+
+addBrush: aTagBrush
+    self appendChild: aTagBrush element.
+    ^aTagBrush
+!
+
+with: anObject
+    self append: anObject
+!
+
+append: anObject
+    anObject appendToBrush: self
+!
+
+appendToBrush: aTagBrush
+    aTagBrush addBrush: self
+!
+
+appendBlock: aBlock
+    | root |
+    root := canvas root.
+    canvas root: self.
+    aBlock value: canvas.
+    canvas root: root
+!
+
+appendChild: anElement
+    {'self[''@element''].appendChild(anElement)'}
+!
+
+appendString: aString
+    self appendChild: (self createTextNodeFor: aString)
+! !
+
+!TagBrush methodsFor: 'attributes'!
+
+at: aString put: aValue
+    {'self[''@element''].setAttribute(aString, aValue)'}
+!
+
+removeAt: aString
+    {'self[''@element''].removeAttribute(aString)'}
+!
+
+class: aString
+    self at: 'class' put: aString
+!
+
+id: aString
+    self at: 'id' put: aString
+!
+
+src: aString
+    self  at: 'src' put: aString
+!
+
+href: aString
+    self at: 'href' put: aString
+!
+
+title: aString
+    self at: 'title' put: aString
+!
+
+style: aString
+    self at: 'style' put: aString
+! !
+
+!TagBrush methodsFor: 'initialization'!
+
+initializeFromString: aString canvas: aCanvas
+    element := self createElementFor: aString.
+    canvas := aCanvas
+! !
+
+!TagBrush methodsFor: 'accessing'!
+
+element
+    ^element
+! !
+
+!TagBrush methodsFor: 'converting'!
+
+asJQuery
+    ^{'return smalltalk.JQuery._from_(jQuery(self[''@element'']))'}
+! !
+
+!TagBrush methodsFor: 'events'!
+
+onKeyDown: aBlock
+    self asJQuery on: 'keydown' do: aBlock
+!
+
+onKeyPress: aBlock
+    self asJQuery on: 'keypress' do: aBlock
+!
+
+onKeyUp: aBlock
+    self asJQuery on: 'keyup' do: aBlock
+!
+
+onFocus: aBlock
+    self asJQuery on: 'focus' do: aBlock
+!
+
+onBlur: aBlock
+    self asJQuery on: 'blur' do: aBlock
+!
+
+onChange: aBlock
+    self asJQuery on: 'change' do: aBlock
+!
+
+onClick: aBlock
+    self asJQuery on: 'click' do: aBlock
+! !
+
+!TagBrush methodsFor: 'private'!
+
+createElementFor: aString
+    ^{'return document.createElement(String(aString))'}
+!
+
+createTextNodeFor: aString
+    ^{'return document.createTextNode(String(aString))'}
+! !
+
+
+
+Object subclass: #Widget
+	instanceVariableNames: 'root'
+	category: 'Canvas'!
+
+!Widget methodsFor: 'accessing'!
+
+root
+    ^root
+! !
+
+!Widget methodsFor: 'adding'!
+
+appendToBrush: aTagBrush
+    self appendToJQuery: aTagBrush asJQuery
+!
+
+appendToJQuery: aJQuery
+    self render.
+    aJQuery append: self root asJQuery
+! !
+
+!Widget methodsFor: 'actions'!
+
+confirm: aString
+    ^{'return window.confirm(aString)'}
+!
+
+prompt: aString
+    ^self prompt: aString default: ''
+!
+
+prompt: aString default: anotherString
+    ^{'return window.prompt(aString, anotherString)'}
+!
+
+update
+    | canvas |
+    canvas := HTMLCanvas new.
+    canvas root: self root.
+    self root asJQuery empty.
+    self renderOn: canvas
+! !
+
+!Widget methodsFor: 'rendering'!
+
+render
+    | canvas |
+    canvas := HTMLCanvas new.
+    root := canvas root.
+    self renderOn: canvas
+!
+
+renderOn: html
+    self
+! !
+
+Widget subclass: #Counter
+	instanceVariableNames: 'count'
+	category: 'Canvas'!
+
+!Counter methodsFor: 'initialization'!
+
+initialize
+    super initialize.
+    count := 0
+! !
+
+!Counter methodsFor: 'rendering'!
+
+renderOn: html
+    html h1 with: count asString.
+    html button
+	with: '++';
+	onClick: [self increase].
+    html button
+	with: '--';
+	onClick: [self decrease]
+! !
+
+!Counter methodsFor: 'actions'!
+
+increase
+    count := count + 1.
+    self update
+!
+
+decrease
+    count := count - 1.
+    self update
+! !

+ 624 - 0
st/compiler.st

@@ -0,0 +1,624 @@
+Object subclass: #Node
+	instanceVariableNames: 'nodes'
+	category: 'Compiler'!
+
+
+!Node methodsFor: 'accessing'!
+
+addNode: aNode
+	self nodes add: aNode
+!
+
+nodes
+	^nodes ifNil: [nodes := Array new]
+! !
+
+!Node methodsFor: 'building'!
+
+nodes: aCollection
+	nodes := aCollection
+! !
+
+!Node methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitNode: self
+! !
+
+
+Node subclass: #MethodNode
+	instanceVariableNames: 'selector arguments source'
+	category: 'Compiler'!
+
+
+!MethodNode methodsFor: 'accessing'!
+
+arguments
+	^arguments ifNil: [#()]
+!
+
+arguments: aCollection
+	arguments := aCollection
+!
+
+selector
+	^selector
+!
+
+selector: aString
+	selector := aString
+!
+
+source
+	^source
+!
+
+source: aString
+	source := aString
+! !
+
+!MethodNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitMethodNode: self
+! !
+
+
+Node subclass: #SendNode
+	instanceVariableNames: 'selector arguments receiver'
+	category: 'Compiler'!
+
+
+!SendNode methodsFor: 'accessing'!
+
+arguments
+	^arguments ifNil: [arguments := #()]
+!
+
+arguments: aCollection
+	arguments := aCollection
+!
+
+cascadeNodeWithMessages: aCollection
+	| first |
+	first := SendNode new
+	    selector: self selector;
+	    arguments: self arguments;
+	    yourself.
+	^CascadeNode new
+	    receiver: self receiver;
+	    nodes: (Array with: first), aCollection;
+	    yourself
+!
+
+receiver
+	^receiver
+!
+
+receiver: aNode
+	receiver := aNode
+!
+
+selector
+	^selector
+!
+
+selector: aString
+	selector := aString
+!
+
+valueForReceiver: anObject
+	^SendNode new
+	    receiver: (self receiver 
+		ifNil: [anObject]
+		ifNotNil: [self receiver valueForReceiver: anObject]);
+	    selector: self selector;
+	    arguments: self arguments;
+	    yourself
+! !
+
+!SendNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitSendNode: self
+! !
+
+
+Node subclass: #CascadeNode
+	instanceVariableNames: 'receiver'
+	category: 'Compiler'!
+
+
+!CascadeNode methodsFor: 'accessing'!
+
+receiver
+	^receiver
+!
+
+receiver: aNode
+	receiver := aNode
+! !
+
+!CascadeNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitCascadeNode: self
+! !
+
+
+Node subclass: #AssignmentNode
+	instanceVariableNames: 'left right'
+	category: 'Compiler'!
+
+
+!AssignmentNode methodsFor: 'accessing'!
+
+left
+	^left
+!
+
+left: aNode
+	left := aNode
+!
+
+right
+	^right
+!
+
+right: aNode
+	right := aNode
+! !
+
+!AssignmentNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitAssignmentNode: self
+! !
+
+
+Node subclass: #BlockNode
+	instanceVariableNames: 'parameters'
+	category: 'Compiler'!
+
+
+!BlockNode methodsFor: 'accessing'!
+
+parameters
+	^parameters ifNil: [parameters := Array new]
+!
+
+parameters: aCollection
+	parameters := aCollection
+! !
+
+!BlockNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitBlockNode: self
+! !
+
+
+Node subclass: #SequenceNode
+	instanceVariableNames: 'temps'
+	category: 'Compiler'!
+
+
+!SequenceNode methodsFor: 'accessing'!
+
+temps
+	^temps ifNil: [#()]
+!
+
+temps: aCollection
+	temps := aCollection
+! !
+
+!SequenceNode methodsFor: 'testing'!
+
+asBlockSequenceNode
+	^BlockSequenceNode new
+	    nodes: self nodes;
+	    temps: self temps;
+	    yourself
+! !
+
+!SequenceNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitSequenceNode: self
+! !
+
+
+SequenceNode subclass: #BlockSequenceNode
+	instanceVariableNames: ''
+	category: 'Compiler'!
+
+
+!BlockSequenceNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitBlockSequenceNode: self
+! !
+
+
+Node subclass: #ReturnNode
+	instanceVariableNames: ''
+	category: 'Compiler'!
+
+
+!ReturnNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitReturnNode: self
+! !
+
+
+Node subclass: #ValueNode
+	instanceVariableNames: 'value'
+	category: 'Compiler'!
+
+
+!ValueNode methodsFor: 'accessing'!
+
+value
+	^value
+!
+
+value: anObject
+	value := anObject
+! !
+
+!ValueNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitValueNode: self
+! !
+
+
+ValueNode subclass: #VariableNode
+	instanceVariableNames: ''
+	category: 'Compiler'!
+
+
+!VariableNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitVariableNode: self
+! !
+
+
+VariableNode subclass: #ClassReferenceNode
+	instanceVariableNames: ''
+	category: 'Compiler'!
+
+
+!ClassReferenceNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitClassReferenceNode: self
+! !
+
+
+Node subclass: #JSStatementNode
+	instanceVariableNames: 'source'
+	category: 'Compiler'!
+
+
+!JSStatementNode methodsFor: 'accessing'!
+
+source
+	^source ifNil: ['']
+!
+
+source: aString
+	source := aString
+! !
+
+!JSStatementNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitJSStatementNode: self
+! !
+
+
+Object subclass: #NodeVisitor
+	instanceVariableNames: ''
+	category: 'Compiler'!
+
+
+!NodeVisitor methodsFor: 'visiting'!
+
+visit: aNode
+	aNode accept: self
+!
+
+visitAssignmentNode: aNode
+	self visitNode: aNode
+!
+
+visitBlockNode: aNode
+	self visitNode: aNode
+!
+
+visitBlockSequenceNode: aNode
+	self visitSequenceNode: aNode
+!
+
+visitCascadeNode: aNode
+	self visitNode: aNode
+!
+
+visitClassReferenceNode: aNode
+	self 
+	    nextPutAll: 'smalltalk.';
+	    nextPutAll: aNode value
+!
+
+visitJSStatementNode: aNode
+	self 
+	    nextPutAll: 'function(){';
+	    nextPutAll: aNode source;
+	    nextPutAll: '})()'
+!
+
+visitMethodNode: aNode
+	self visitNode: aNode
+!
+
+visitNode: aNode
+!
+
+visitReturnNode: aNode
+	self visitNode: aNode
+!
+
+visitSendNode: aNode
+	self visitNode: aNode
+!
+
+visitSequenceNode: aNode
+	self visitNode: aNode
+!
+
+visitValueNode: aNode
+	self visitNode: aNode
+!
+
+visitVariableNode: aNode
+! !
+
+
+NodeVisitor subclass: #Compiler
+	instanceVariableNames: 'stream nestedBlocks earlyReturn currentClass currentSelector'
+	category: 'Compiler'!
+
+
+!Compiler methodsFor: 'accessing'!
+
+currentClass
+	^currentClass
+!
+
+currentClass: aClass
+	currentClass := aClass
+!
+
+parser
+	^SmalltalkParser new
+! !
+
+!Compiler methodsFor: 'compiling'!
+
+compile: aString
+	^self compileNode: (self parser parse: aString readStream)
+!
+
+compile: aString forClass: aClass
+	self currentClass: aClass.
+	^self compile: aString
+!
+
+compileExpression: aString
+	self currentClass: DoIt.
+	^self compile: 'doIt ^[', aString, '] value'
+!
+
+compileNode: aNode
+	stream := '' writeStream.
+	self visit: aNode.
+	^stream contents
+!
+
+eval: aString
+	^{'return eval(aString);'}
+!
+
+load: aString forClass: aClass
+	^self eval: (self compile: aString forClass: aClass)
+!
+
+loadExpression: aString
+	DoIt addCompiledMethod: (self eval: (self compileExpression: aString)).
+	^DoIt new doIt
+! !
+
+!Compiler methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	stream := '' writeStream
+! !
+
+!Compiler methodsFor: 'visiting'!
+
+visit: aNode
+	aNode accept: self
+!
+
+visitAssignmentNode: aNode
+	self visit: aNode left.
+	stream nextPutAll: '='.
+	self visit: aNode right
+!
+
+visitBlockNode: aNode
+	stream nextPutAll: '(function('.
+	aNode parameters 
+	    do: [:each |
+		stream nextPutAll: each]
+	    separatedBy: [stream nextPutAll: ', '].
+	stream nextPutAll: '){'.
+	aNode nodes do: [:each | self visit: each].
+	stream nextPutAll: '})'
+!
+
+visitBlockSequenceNode: aNode
+	| index |
+	nestedBlocks := nestedBlocks + 1.
+	aNode nodes isEmpty
+	    ifTrue: [
+		stream nextPutAll: 'return nil;']
+	    ifFalse: [
+		aNode temps do: [:each |
+		    stream nextPutAll: 'var ', each, '=nil;'.
+		    stream nextPutAll: String cr].
+		index := 0.
+		aNode nodes do: [:each |
+		    index := index + 1.
+		    index = aNode nodes size ifTrue: [
+			stream nextPutAll: 'return '].
+		    self visit: each.
+		    stream nextPutAll: ';']].
+	nestedBlocks := nestedBlocks - 1
+!
+
+visitCascadeNode: aNode
+	| index |
+	index := 0.
+	stream nextPutAll: '(function($rec){'.
+	aNode nodes do: [:each |
+	    index := index + 1.
+	    index = aNode nodes size ifTrue: [
+		stream nextPutAll: 'return '].
+	    each receiver: (VariableNode new value: '$rec').
+	    self visit: each.
+	    stream nextPutAll: ';'].
+	stream nextPutAll: '})('.
+	self visit: aNode receiver.
+	stream nextPutAll: ')'
+!
+
+visitClassReferenceNode: aNode
+	stream
+	    nextPutAll: 'smalltalk.';
+	    nextPutAll: aNode value
+!
+
+visitJSStatementNode: aNode
+	stream nextPutAll: '(function(){'.
+	stream nextPutAll: (aNode source value replace: '''''' with: '''').
+	stream nextPutAll: '})()'
+!
+
+visitMethodNode: aNode
+	| str currentSelector |
+	currentSelector := aNode selector asSelector.
+	nestedBlocks := 0.
+	earlyReturn := false.
+	stream 
+	    nextPutAll: 'smalltalk.method({', String cr;
+	    nextPutAll: 'selector: "', aNode selector, '",', String cr;
+	    nextPutAll: 'source: unescape("', aNode source escaped, '"),', String cr;
+	    nextPutAll: 'fn: function('.
+	aNode arguments 
+	    do: [:each | stream nextPutAll: each]
+	    separatedBy: [stream nextPutAll: ', '].
+	stream 
+	    nextPutAll: '){', String cr;
+	    nextPutAll: 'var self=this;', String cr.
+	str := stream.
+	stream := '' writeStream.
+	aNode nodes do: [:each |
+	    self visit: each].
+	earlyReturn ifTrue: [
+	    str nextPutAll: 'try{'].
+	str nextPutAll: stream contents.
+	stream := str.
+	stream 
+	    nextPutAll: String cr; 
+	    nextPutAll: 'return self;'.
+	earlyReturn ifTrue: [
+	    stream nextPutAll: String cr, '} catch(e) {if(e.name === ''stReturn'' && e.selector === ', currentSelector printString, '){return e.fn()} throw(e)}'].
+	stream 
+	    nextPutAll: '}', String cr;
+	    nextPutAll: '})'
+!
+
+visitReturnNode: aNode
+	nestedBlocks > 0 ifTrue: [
+	    earlyReturn := true].
+	earlyReturn
+	    ifTrue: [
+		stream
+		    nextPutAll: '(function(){throw(';
+		    nextPutAll: '{name: ''stReturn'', selector: ';
+		    nextPutAll: currentSelector printString;
+		    nextPutAll: ', fn: function(){return ']
+	    ifFalse: [stream nextPutAll: 'return '].
+	aNode nodes do: [:each |
+	    self visit: each].
+	earlyReturn ifTrue: [
+	    stream nextPutAll: '}})})()']
+!
+
+visitSendNode: aNode
+	| str |
+	str := stream.
+	stream := '' writeStream.
+	self visit: aNode receiver.
+	stream contents = 'super' 
+	    ifTrue: [
+		stream := str.
+		stream 
+		    nextPutAll: 'self.klass.superclass.fn.prototype[''';
+		    nextPutAll: aNode selector asSelector;
+		    nextPutAll: '''].apply(self, ['.
+		aNode arguments 
+		    do: [:each | self visit: each]
+		    separatedBy: [stream nextPutAll: ','].
+		stream nextPutAll: '])']
+	    ifFalse: [
+		str nextPutAll: stream contents.
+		stream := str.
+		stream nextPutAll: '.', aNode selector asSelector, '('.
+		aNode arguments 
+		    do: [:each | self visit: each]
+		    separatedBy: [stream nextPutAll: ','].
+		stream nextPutAll: ')']
+!
+
+visitSequenceNode: aNode
+	aNode temps do: [:each |
+	    stream nextPutAll: 'var ', each, '=nil;'.
+	    stream nextPutAll: String cr].
+	aNode nodes do: [:each |
+	    self visit: each.
+	    stream nextPutAll: ';']
+	    separatedBy: [stream nextPutAll: String cr]
+!
+
+visitValueNode: aNode
+	stream nextPutAll: aNode value asJavascript
+!
+
+visitVariableNode: aNode
+	(self currentClass instVarNames includes: aNode value) 
+	    ifTrue: [stream nextPutAll: 'self[''@', aNode value, ''']']
+	    ifFalse: [stream nextPutAll: aNode value]
+! !
+
+
+Object subclass: #DoIt
+	instanceVariableNames: ''
+	category: 'Compiler'!
+

+ 762 - 0
st/ide.st

@@ -0,0 +1,762 @@
+Widget subclass: #TabManager
+	instanceVariableNames: 'selectedTab tabs opened'
+	category: 'IDE'!
+
+TabManager class instanceVariableNames: 'current'!
+
+!TabManager class methodsFor: 'instance creation'!
+
+current
+    ^current ifNil: [current := super new]
+!
+
+new
+    self shouldNotImplement
+! !
+
+!TabManager methodsFor: 'initialization'!
+
+initialize
+    super initialize.
+    opened := true.
+    'body' asJQuery 
+	append: self;
+	addClass: 'jtalk'.
+    self 
+	addTab: Transcript current;
+	addTab: Workspace new.
+    self selectTab: self tabs last.
+! !
+
+!TabManager methodsFor: 'accessing'!
+
+tabs
+    ^tabs ifNil: [tabs := Array new]
+! !
+
+!TabManager methodsFor: 'adding/Removing'!
+
+addTab: aWidget
+    self tabs add: aWidget.
+    'body' asJQuery append: aWidget.
+    aWidget root asJQuery hide
+!
+
+removeTab: aWidget
+    self tabs remove: aWidget.
+    self update
+! !
+
+!TabManager methodsFor: 'actions'!
+
+open
+    opened ifFalse: [
+	self root asJQuery show.
+	'body' asJQuery addClass: 'jtalk'.
+	selectedTab root asJQuery show.
+	opened := true]
+!
+
+close
+    opened ifTrue: [
+	self tabs do: [:each |
+	    each root asJQuery hide].
+	self root asJQuery hide.
+	'body' asJQuery removeClass: 'jtalk'.
+	opened := false]
+!
+
+newBrowserTab
+    Browser open
+!
+
+selectTab: aWidget
+    self open.
+    selectedTab := aWidget.
+    self tabs do: [:each |
+	each root asJQuery hide].
+    aWidget root asJQuery show.
+    self update
+!
+
+closeTab: aWidget
+    self removeTab: aWidget.
+    self selectTab: self tabs last.
+    aWidget root asJQuery remove.
+    self update
+! !
+
+!TabManager methodsFor: 'rendering'!
+
+renderOn: html
+    html ul
+	id: 'jtalkTabs';
+	with: [
+	    html li 
+		class: 'closeAll';
+		with: 'x';
+		onClick: [self close].
+	    self tabs do: [:each |
+		self renderTabFor: each on: html].
+	    html li
+		class: 'newtab';
+		with: ' + ';
+		onClick: [self newBrowserTab]]
+!
+
+renderTabFor: aWidget on: html
+    | li |
+    li := html li.
+    selectedTab = aWidget ifTrue: [
+	li class: 'selected'].
+    li with: [
+	html span
+	    with: aWidget label;
+	    onClick: [self selectTab: aWidget].
+	aWidget canBeClosed ifTrue: [
+	    html span 
+		class: 'close';
+		with: 'x';
+		onClick: [self closeTab: aWidget]]]
+! !
+
+
+Widget subclass: #TabWidget
+	instanceVariableNames: ''
+	category: 'IDE'!
+
+!TabWidget class methodsFor: 'instance creation'!
+
+open
+    ^self new open
+! !
+
+!TabWidget methodsFor: 'accessing'!
+
+label
+    self subclassResponsibility
+! !
+
+!TabWidget methodsFor: 'actions'!
+
+open
+    TabManager current
+	addTab: self;
+	selectTab: self
+! !
+   
+!TabWidget methodsFor: 'testing'!
+
+canBeClosed
+    ^false
+! !
+
+!TabWidget methodsFor: 'rendering'!
+
+renderOn: html
+    html div 
+	class: 'jtalkTool';
+	with: [
+	    html div
+		class: 'box';
+		with: [self renderBoxOn: html].
+	    html div
+		class: 'buttons';
+		with: [self renderButtonsOn: html]]
+!
+
+renderBoxOn: html
+!
+
+renderButtonsOn: html
+! !
+
+
+
+TabWidget subclass: #Workspace
+	instanceVariableNames: 'textarea'
+	category: 'IDE'!
+
+!Workspace methodsFor: 'accessing'!
+
+label
+    ^'[Workspace]'
+!
+
+selection
+    ^{'return document.selection'}
+!
+
+selectionStart
+    ^{'return jQuery(''.workspace'')[0].selectionStart'}
+!
+
+selectionEnd
+    ^{'return jQuery(''.workspace'')[0].selectionEnd'}
+!
+
+selectionStart: anInteger
+    {'jQuery(''.workspace'')[0].selectionStart = anInteger'}
+!
+
+selectionEnd: anInteger
+    {'jQuery(''.workspace'')[0].selectionEnd = anInteger'}
+!
+
+currentLine
+    | lines startLine endLine|
+    lines := textarea asJQuery val tokenize: String cr.
+    startLine := endLine := 0.
+    lines do: [:each |
+	endLine := startLine + each size.
+	startLine := endLine + 1.
+	endLine >= self selectionStart ifTrue: [
+	    self selectionEnd: endLine.
+	    ^each]]
+! !
+
+!Workspace methodsFor: 'actions'!
+
+handleKeyDown: anEvent
+    ^{'if(anEvent.ctrlKey) {
+		if(anEvent.keyCode === 68) { //ctrl+p
+			self._printIt();
+			return false;
+		}
+		if(anEvent.keyCode === 80) { //ctrl+d
+			self._doIt();
+			return false;
+		}
+	}'}
+!
+
+clearWorkspace
+    textarea asJQuery val: ''
+!
+
+doIt
+    self printIt
+!
+
+printIt
+    | selection |
+    textarea asJQuery focus.
+    self selectionStart = self selectionEnd
+	ifTrue: [selection := self currentLine]
+	ifFalse: [
+	    selection := textarea asJQuery val copyFrom: self selectionStart + 1 to: self selectionEnd + 1].
+    self print: (self eval: selection) printString
+!
+
+print: aString
+    | start |
+    start := self selectionEnd.
+    textarea asJQuery val: (
+	(textarea asJQuery val copyFrom: 1 to: start),
+	' ', aString, ' ',
+	(textarea asJQuery val copyFrom: start + 1 to: textarea asJQuery val size)).
+    self selectionStart: start.
+    self selectionEnd: start + aString size + 2
+!
+
+eval: aString
+    ^Compiler new loadExpression: aString
+! !
+
+!Workspace methodsFor: 'rendering'!
+
+renderBoxOn: html
+    textarea := html textarea.
+    textarea onKeyDown: [:e | self handleKeyDown: e].
+    textarea 
+	class: 'workspace';
+	at: 'spellcheck' put: 'false'
+!
+
+renderButtonsOn: html
+    html button
+	with: 'DoIt';
+	title: 'ctrl+d';
+	onClick: [self doIt].
+    html button
+	with: 'PrintIt';
+	title: 'ctrl+p';
+	onClick: [self printIt].
+    html button
+	with: 'Clear workspace';
+	onClick: [self clearWorkspace]
+! !
+
+
+
+TabWidget subclass: #Transcript
+	instanceVariableNames: 'textarea'
+	category: 'IDE'!
+
+Transcript class instanceVariableNames: 'current'!
+
+!Transcript class methodsFor: 'instance creation'!
+
+open
+    self current open
+!
+
+new
+    self shouldNotImplement
+!
+
+current
+    ^current ifNil: [current := super new]
+! !
+
+!Transcript class methodsFor: 'printing'!
+
+show: anObject
+    self current show: anObject
+!
+
+cr
+    self current show: String cr
+!
+
+clear
+    self current clear
+! !
+
+
+!Transcript methodsFor: 'accessing'!
+
+label
+    ^'[Transcript]'
+! !
+
+!Transcript methodsFor: 'actions'!
+
+show: anObject
+    textarea asJQuery val: textarea asJQuery val, anObject asString.
+
+!
+
+cr
+    textarea asJQuery val: textarea asJQuery val, String cr.
+!
+
+clear
+    textarea asJQuery val: ''
+! !
+
+!Transcript methodsFor: 'rendering'!
+
+renderBoxOn: html
+    textarea := html textarea.
+    textarea 
+	class: 'transcript';
+	at: 'spellcheck' put: 'false'
+!
+
+renderButtonsOn: html
+    html button
+	with: 'Clear transcript';
+	onClick: [self clear]
+! !
+
+TabWidget subclass: #Browser
+	instanceVariableNames: 'selectedCategory selectedClass selectedProtocol selectedMethod categoriesList classesList protocolsList methodsList sourceTextarea tabsList selectedTab saveButton classButtons methodButtons'
+	category: 'IDE'!
+
+!Browser class methodsFor: 'convenience'!
+
+open
+    self new open
+! !
+
+!Browser methodsFor: 'initialization'!
+
+initialize
+    super initialize.
+    selectedTab := #instance
+! !
+
+!Browser methodsFor: 'accessing'!
+
+label
+    ^selectedClass 
+	ifNil: ['Browser (nil)']
+	ifNotNil: [selectedClass name]
+!
+
+categories
+    | categories |
+    categories := Array new.
+    Smalltalk current classes do: [:each |
+	(categories includes: each category) ifFalse: [
+	    categories add: each category]].
+    ^categories sort
+!
+
+classes
+    ^(Smalltalk current classes 
+	select: [:each | each category = selectedCategory])
+	sort: [:a :b | a name > b name]
+!
+
+protocols
+    | class protocols |
+    protocols := Array new.
+    selectedClass ifNotNil: [
+	selectedTab = #comment ifTrue: [^#()].
+	class := selectedTab = #instance
+	    ifTrue: [selectedClass]
+	    ifFalse: [selectedClass class].
+	class methodDictionary isEmpty ifTrue: [
+	    protocols add: 'not yet classified'].
+	class methodDictionary do: [:each |
+	    (protocols includes: each category) ifFalse: [
+		protocols add: each category]]].
+    ^protocols sort
+!
+
+methods
+    | class |
+    selectedTab = #comment ifTrue: [^#()].
+    selectedClass ifNotNil: [
+	class := selectedTab = #instance
+	    ifTrue: [selectedClass]
+	    ifFalse: [selectedClass class]].
+    ^(selectedProtocol 
+	ifNil: [
+	    class 
+		ifNil: [#()] 
+		ifNotNil: [class methodDictionary values]]
+	ifNotNil: [
+	    class methodDictionary values select: [:each |
+		each category = selectedProtocol]]) sort: [:a :b | a selector > b selector]
+!
+
+source
+    selectedTab = #comment ifFalse: [
+	^(selectedProtocol notNil or: [selectedMethod notNil])
+	    ifFalse: [self declarationSource]
+	    ifTrue: [self methodSource]].
+    ^selectedClass
+	ifNil: ['']
+	ifNotNil: [self classCommentSource]
+!
+
+methodSource
+    ^selectedMethod
+	ifNil: [self dummyMethodSource]
+	ifNotNil: [selectedMethod source]
+!
+
+dummyMethodSource
+    ^'messageSelectorAndArgumentNames
+	"comment stating purpose of message"
+
+	| temporary variable names |
+	statements'
+!
+
+declarationSource
+    ^selectedTab = #instance
+	ifTrue: [self classDeclarationSource]
+	ifFalse: [self metaclassDeclarationSource]
+!
+
+classDeclarationSource
+    | stream |
+    stream := '' writeStream.
+    selectedClass ifNotNil: [
+	stream 
+	    nextPutAll: selectedClass superclass asString;
+	    nextPutAll: ' subclass: #';
+	    nextPutAll: selectedClass name;
+	    nextPutAll: String cr, String tab;
+	    nextPutAll: 'instanceVariableNames: '''.
+	selectedClass instanceVariableNames 
+	    do: [:each | stream nextPutAll: each] 
+	    separatedBy: [stream nextPutAll: ' '].
+	stream
+	    nextPutAll: '''', String cr, String tab;
+	    nextPutAll: 'category: ''';
+	    nextPutAll: selectedClass category;
+	    nextPutAll: ''''].
+    ^stream contents
+!
+
+metaclassDeclarationSource
+    | stream |
+    stream := '' writeStream.
+    selectedClass ifNotNil: [
+	stream 
+	    nextPutAll: selectedClass asString;
+	    nextPutAll: ' class ';
+	    nextPutAll: 'instanceVariableNames: '''.
+	selectedClass class instanceVariableNames
+	    do: [:each | stream nextPutAll: each]
+	    separatedBy: [stream nextPutAll: ' '].
+	stream nextPutAll: ''''].
+    ^stream contents
+!
+
+classCommentSource
+    ^selectedClass comment
+! !
+
+!Browser methodsFor: 'actions'!
+
+enableSaveButton
+    saveButton removeAt: 'disabled'
+!
+
+disableSaveButton
+    saveButton ifNotNil: [
+	saveButton at: 'disabled' put: true]
+!
+
+hideClassButtons
+    classButtons asJQuery hide
+!
+
+showClassButtons
+    classButtons asJQuery show
+!
+
+hideMethodButtons
+    methodButtons asJQuery hide
+!
+
+showMethodButtons
+    methodButtons asJQuery show
+!
+
+compile
+    selectedTab = #comment ifTrue: [
+	selectedClass ifNotNil: [
+	    self compileClassComment]].
+    (selectedProtocol notNil or: [selectedMethod notNil])
+	ifFalse: [self compileDefinition]
+	ifTrue: [self compileMethodDefinition].
+    self disableSaveButton
+!
+
+compileClassComment
+    selectedClass comment: sourceTextarea asJQuery val
+!
+
+compileMethodDefinition
+    selectedTab = #instance
+	ifTrue: [self compileMethodDefinitionFor: selectedClass]
+	ifFalse: [self compileMethodDefinitionFor: selectedClass class]
+!
+
+compileMethodDefinitionFor: aClass
+    | method |
+    method := Compiler new load: sourceTextarea asJQuery val forClass: selectedClass.
+    method category: selectedProtocol.
+    aClass addCompiledMethod: method.
+    self updateMethodsList.
+    self selectMethod: method
+!
+
+compileDefinition
+    | newClass |
+    newClass := Compiler new loadExpression: sourceTextarea asJQuery val.
+    self 
+	updateCategoriesList;
+	updateClassesList
+!
+
+selectCategory: aCategory
+    selectedCategory := aCategory.
+    selectedClass := selectedProtocol := selectedMethod :=  nil.
+    self 
+	updateCategoriesList;
+	updateClassesList;
+	updateProtocolsList;
+	updateMethodsList;
+	updateSourceAndButtons
+!
+
+selectClass: aClass
+    selectedClass := aClass.
+    selectedProtocol := selectedMethod := nil.
+    self 
+	updateClassesList;
+	updateProtocolsList;
+	updateMethodsList;
+	updateSourceAndButtons
+!
+
+selectProtocol: aString
+    selectedProtocol := aString.
+    selectedMethod := nil.
+    self 
+	updateProtocolsList;
+	updateMethodsList;
+	updateSourceAndButtons
+!
+
+selectMethod: aMethod
+    selectedMethod := aMethod.
+    self 
+	updateProtocolsList;
+	updateMethodsList;
+	updateSourceAndButtons
+!
+
+selectTab: aString
+    selectedTab := aString.
+    self selectProtocol: nil.
+    self updateTabsList.
+! !
+
+
+!Browser methodsFor: 'rendering'!
+
+renderBoxOn: html
+    self 
+	renderTopPanelOn: html;
+	renderTabsOn: html;
+	renderBottomPanelOn: html
+!
+
+renderTopPanelOn: html
+    html div 
+	class: 'top'; 
+	with: [
+	    categoriesList := html ul class: 'column categories'.
+	    classesList := html ul class: 'column classes'.
+	    protocolsList := html ul class: 'column protocols'.
+	    methodsList := html ul class: 'column methods'.
+	    self
+		updateCategoriesList;
+		updateClassesList;
+		updateProtocolsList;
+		updateMethodsList.
+	    html div class: 'clear']
+!
+
+renderTabsOn: html
+    tabsList := html ul class: 'tabs'.
+    self updateTabsList.
+!
+
+renderBottomPanelOn: html
+    html div
+	class: 'sourceCode';
+	with: [
+	    sourceTextarea := html textarea 
+		onKeyPress: [self enableSaveButton];
+		class: 'source';
+		at: 'spellcheck' put: 'false']
+!
+
+renderButtonsOn: html
+    saveButton := html button.
+    saveButton 
+	with: 'Save';
+	onClick: [self compile].
+    methodButtons := html span with: [
+	html button
+	    with: 'Remove method';
+	    onClick: [self removeMethod]].
+    classButtons := html span with: [
+	html button
+	    with: 'Remove class';
+	    onClick: [self removeClass]].
+    self updateSourceAndButtons
+! !
+
+!Browser methodsFor: 'updating'!
+
+updateCategoriesList
+    categoriesList contents: [:html |
+	self categories do: [:each || li |
+	    li := html li.
+	    selectedCategory = each ifTrue: [
+		li class: 'selected'].
+	    li
+		with: each;
+		onClick: [self selectCategory: each]]]
+!
+
+updateClassesList
+    TabManager current update.
+    classesList contents: [:html |
+	self classes do: [:each || li |
+	    li := html li.
+	    selectedClass = each ifTrue: [
+		li class: 'selected'].
+	    li
+		with: each name;
+		onClick: [self selectClass: each]]]
+!
+
+updateProtocolsList
+    protocolsList contents: [:html |
+	self protocols do: [:each || li |
+	    li := html li.
+	    selectedProtocol = each ifTrue: [
+		li class: 'selected'].
+	    li 
+		with: each;
+		onClick: [self selectProtocol: each]]]
+!
+
+updateMethodsList
+    methodsList contents: [:html |
+	self methods do: [:each || li |
+	    li := html li.
+	    selectedMethod = each ifTrue: [
+		li class: 'selected'].
+	    li
+		with: each selector;
+		onClick: [self selectMethod: each]]]
+!
+
+updateTabsList
+    tabsList contents: [:html || li |
+	li := html li.
+	selectedTab = #instance ifTrue: [li class: 'selected'].
+	li
+	    with: 'Instance';
+	    onClick: [self selectTab: #instance].
+	li := html li.
+	selectedTab = #class ifTrue: [li class: 'selected'].
+	li
+	    with: 'Class';
+	    onClick: [self selectTab: #class].
+	li := html li.
+	selectedTab = #comment ifTrue: [li class: 'selected'].
+	li
+	    with: 'Comment';
+	    onClick: [self selectTab: #comment]]
+!
+
+updateSourceAndButtons
+    self disableSaveButton.
+    selectedMethod 
+	ifNil: [
+	    self hideMethodButtons.
+	    selectedClass 
+		ifNil: [self hideClassButtons]
+		ifNotNil: [self showClassButtons]]
+	ifNotNil: [
+	    self hideClassButtons
+	    self showMethodButtons].
+    sourceTextarea asJQuery val: self source
+! !
+
+!Browser methodsFor: 'testing'!
+
+canBeClosed
+    ^true
+! !
+		
+
+
+
+
+
+	

+ 217 - 0
st/jQuery.st

@@ -0,0 +1,217 @@
+Object subclass: #JQuery
+	instanceVariableNames: 'jquery'
+	category: 'JQuery'!
+
+!JQuery class methodsFor: 'instance creation'!
+
+fromString: aString
+    | newJQuery |
+    {'newJQuery = jQuery(String(aString))'}.
+    ^self from: newJQuery
+!
+
+from: anObject
+    ^self new
+	initializeWithJQueryObject: anObject;
+	yourself
+! !
+
+!JQuery methodsFor: 'attributes'!
+
+removeAttribute: aString
+    "Remove an attribute from each element in the set of matched elements."
+    ^self call: 'removeAttribute' withArgument: aString
+!
+
+attr: aString
+    "Get the value of an attribute for the first element in the set of matched elements."
+    ^self call: 'attr' withArgument: aString
+!
+
+val
+    "Get the current value of the first element in the set of matched elements."
+    ^self call: 'val'
+!
+
+val: aString
+    self call: 'val' withArgument: aString
+! !
+
+!JQuery methodsFor: 'css'!
+
+cssAt: aString
+    ^{'return self[''@jquery''].css(aString)'}
+!
+
+cssAt: aString put: anotherString
+    {'self[''@jquery''].css(aString, anotherString)'}
+!
+ 
+addClass: aString
+    "Adds the specified class(es) to each of the set of matched elements."
+    self call: 'addClass' withArgument: aString
+!
+
+removeClass: aString
+    "Remove a single class, multiple classes, or all classes from each element in the set of matched elements."
+    self call: 'removeClass' withArgument: aString
+!
+
+toggleClass: aString
+    "Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument."
+    self call: 'toggleClass' withArgument: aString
+!
+
+height 
+    "Get the current computed height for the first element in the set of matched elements."
+    ^self call: 'height'
+!
+
+height: anInteger
+    self call: 'height' withArgument: anInteger
+!
+
+width: anInteger
+    self call: 'width' withArgument: anInteger
+!
+ 
+width
+    "Get the current computed width for the first element in the set of matched elements."
+    ^self call: 'width'
+!
+
+innerHeight
+    "Get the current computed height for the first element in the set of matched elements, including padding but not border."
+    ^self call: 'innerHeight'
+!
+
+innerWidth
+    "Get the current computed width for the first element in the set of matched elements, including padding but not border."
+    ^self call: 'innerWidth'
+!
+
+outerHeight
+    "Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin."
+    ^self call: 'outerHeight'
+!
+
+outerWidth
+    "Get the current computed width for the first element in the set of matched elements, including padding and border."
+    ^self call: 'outerWidth'
+!
+
+top
+    "Get the current y coordinate of the first element in the set of matched elements, relative to the offset parent."
+    ^(self call: 'position') basicAt: 'top'
+!
+
+left
+    "Get the current x coordinate of the first element in the set of matched elements, relative to the offset parent."
+    ^(self call: 'position') basicAt: 'left'
+!
+
+offsetLeft
+    "Get the current coordinates of the first element in the set of matched elements, relative to the document."
+    ^(self call: 'offset') basicAt: 'left'
+!
+
+offsetTop
+    "Get the current coordinates of the first element in the set of matched elements, relative to the document."
+    ^(self call: 'offset') basicAt: 'top'
+!
+
+scrollLeft
+    "Get the current horizontal position of the scroll bar for the first element in the set of matched elements."
+    ^self call: 'scrollLeft'
+!
+
+scrollTop
+    "Get the current vertical position of the scroll bar for the first element in the set of matched elements."
+    ^self call: 'scrollTop'
+!
+
+scrollLeft: anInteger
+    self call: 'scrollLeft' withArgument: anInteger
+!
+
+scrollTop: anInteger
+    self call: 'scrollTop' withArgument: anInteger
+! !
+
+!JQuery methodsFor: 'events'!
+
+focus
+    self call: 'focus'
+!
+
+show
+    self call: 'show'
+!
+
+hide
+    self call: 'hide'
+!
+
+remove
+    self call: 'remove'
+!
+
+on: anEventString do: aBlock
+    "Attach aBlock for anEventString on the element"
+    {'self[''@jquery''].bind(anEventString, aBlock)'}
+!
+
+removeEvents: aString
+    "Unbind all handlers attached to the event aString"
+    self call: 'unbind' withArgument: aString
+! !
+
+!JQuery methodsFor: 'DOM insertion'!
+
+append: anObject
+    "Append anObject at the end of the element."
+    anObject appendToJQuery: self
+!
+
+appendElement: anElement
+    "Append anElement at the end of the element.
+     Dont't call this method directly, use #append: instead"
+    self call: 'append' withArgument: anElement
+!
+
+appendToJQuery: aJQuery
+    aJQuery appendElement: jquery
+!
+
+contents: anObject
+    self empty.
+    self append: anObject
+!
+
+empty
+    self call: 'empty'
+! !
+
+!JQuery methodsFor: 'initialization'!
+
+initializeWithJQueryObject: anObject
+    jquery := anObject
+! !
+
+!JQuery methodsFor: 'private'!
+
+call: aString
+    ^{'return self[''@jquery''][aString]()'}
+!
+
+call: aString withArgument: anObject
+    ^{'return self[''@jquery''][aString](anObject)'}
+! !
+
+
+!JQuery methodsFor: 'testing'!
+
+hasClass: aString
+    "Determine whether any of the matched elements are assigned the given class."
+    ^self call: 'hasClass' withArgument: aString
+! !

+ 1819 - 0
st/kernel.st

@@ -0,0 +1,1819 @@
+nil subclass: #Object
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!Object methodsFor: 'accessing'!
+
+basicAt: aString
+	^{'
+	    var value = self[aString];
+	    if(typeof(value) == ''undefined'') {
+		return nil;
+	    } else {
+		return value;
+	    }
+	'}
+!
+
+basicAt: aString put: anObject
+	^{'return self[aString] = anObject'}
+!
+
+basicDelete: aString
+    {'delete self[aString]'}
+!
+
+class
+	^{'return self.klass'}
+!
+
+instVarAt: aString
+	^{'
+	    var value = self[''@''+aString];
+	    if(typeof(value) == ''undefined'') {
+		return nil;
+	    } else {
+		return value;
+	    }
+	'}
+!
+
+instVarAt: aString put: anObject
+	^{'self[''@'' + aString] = anObject'}
+!
+
+size
+	self error: 'Object not indexable'
+!
+
+yourself
+	^self
+! !
+
+!Object methodsFor: 'comparing'!
+
+= anObject
+	^{'return self == anObject'}
+!
+
+~= anObject
+	^(self = anObject) == false
+! !
+
+!Object methodsFor: 'converting'!
+
+-> anObject
+	^Association key: self value: anObject
+!
+
+asJavascript
+	^self asString
+!
+
+asString
+	^self printString
+! !
+
+!Object methodsFor: 'copying'!
+
+copy
+	^self shallowCopy postCopy
+!
+
+deepCopy
+	{'	    
+	    var copy = self.klass._new();
+	    for(var i in self) {
+		if(/^@.+/.test(i)) {
+		    copy[i] = self[i]._deepCopy();
+		}
+	    }
+	    return copy;
+	'}.
+!
+
+postCopy
+!
+
+shallowCopy
+	^{'
+	    var copy = self.klass._new();
+	    for(var i in self) {
+		if(/^@.+/.test(i)) {
+		    copy[i] = self[i];
+		}
+	    }
+	    return copy;
+	'}
+! !
+
+!Object methodsFor: 'error handling'!
+
+error: aString
+	Error signal: aString
+!
+
+perform: aSymbol
+    ^self perform: aSymbol withArguments: #()
+!
+
+perform: aSymbol withArguments: aCollection
+	^self basicPerform: aSymbol asSelector withArguments: aCollection
+!
+
+basicPerform: aSymbol 
+    ^self basicPerform: aSymbol withArguments: #()
+!
+
+basicPerform: aSymbol withArguments: aCollection
+	^{'return self[aSymbol].apply(self, aCollection);'}
+!
+
+shouldNotImplement
+	self error: 'This method should not be implemented in ', self class name
+!
+
+subclassResponsibility
+	self error: 'This method is a responsibility of a subclass'
+!
+
+try: aBlock catch: anotherBlock
+	{'try{aBlock()} catch(e) {anotherBlock(e)}'}
+! !
+
+!Object methodsFor: 'initialization'!
+
+initialize
+! !
+
+!Object methodsFor: 'message handling'!
+
+perform: aSymbol
+	^self perform: aSymbol withArguments: #()
+! !
+
+!Object methodsFor: 'printing'!
+
+printNl
+	{'console.log(self)'}
+!
+
+printString
+	^'a ', self class name
+! !
+
+!Object methodsFor: 'testing'!
+
+ifNil: aBlock
+	^self
+!
+
+ifNil: aBlock ifNotNil: anotherBlock
+	^anotherBlock value
+!
+
+ifNotNil: aBlock
+	^aBlock value
+!
+
+ifNotNil: aBlock ifNil: anotherBlock
+	^aBlock value
+!
+
+isClass
+	^false
+!
+
+isKindOf: aClass
+	^(self isMemberOf: aClass)
+	    ifTrue: [true]
+	    ifFalse: [self class inheritsFrom: aClass]
+!
+
+isMemberOf: aClass
+	^self class = aClass
+!
+
+isMetaclass
+	^false
+!
+
+isNil
+	^false
+!
+
+isNumber
+	^false
+!
+
+isParseFailure
+	^false
+!
+
+isString
+	^false
+!
+
+notNil
+	^self isNil not
+! !
+
+!Object methodsFor: '*Canvas'!
+
+appendToBrush: aTagBrush
+    aTagBrush append: self asString
+! !
+
+Object subclass: #Smalltalk
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+Smalltalk class instanceVariableNames: 'current'!
+
+!Smalltalk class methodsFor: 'accessing'!
+
+current
+	    ^{'return smalltalk'}
+! !
+
+!Smalltalk methodsFor: 'accessing'!
+
+classes
+	^{'return self.classes()'}
+! !
+
+
+Object subclass: #Behavior
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!Behavior methodsFor: 'accessing'!
+
+addCompiledMethod: aMethod
+	{'self.fn.prototype[aMethod.selector._asSelector()] = aMethod.fn;
+	self.fn.prototype.methods[aMethod.selector] = aMethod'}
+!
+
+removeCompiledMethod: aMethod
+	{'delete self.fn.prototype[aMethod.selector._asSelector()];
+	delete self.fn.prototype.methods[aMethod.selector]'}
+!
+
+allSubclasses
+	| result |
+	result := self subclasses.
+	self subclasses do: [:each |
+	    result addAll: each allSubclasses].
+	^result
+!
+
+instanceVariableNames
+	^{'return self.iVarNames'}
+!
+
+methodDictionary
+	^{'var dict = smalltalk.Dictionary._new();
+	var methods = self.fn.prototype.methods;
+	for(var i in methods) {
+		if(methods[i].selector) {
+			dict._at_put_(methods[i].selector, methods[i]);
+		}
+	};
+	return dict'}
+!
+
+methodsFor: aString
+	^ClassCategoryReader new
+	    class: self category: aString;
+	    yourself
+!
+
+comment
+    ^(self basicAt: 'comment') ifNil: ['']
+!
+
+comment: aString
+    self basicAt: 'comment' put: aString
+!
+
+commentStamp
+    ^ClassCommentReader new
+	class: self;
+	yourself
+!
+
+name
+	^{'return self.className || nil'}
+!
+
+prototype
+	^{'return self.fn.prototype'}
+!
+
+subclasses
+	^{'return smalltalk.subclasses(self)'}
+!
+
+superclass
+	^{'return self.superclass || nil'}
+!
+
+withAllSubclasses
+	^(Array with: self) addAll: self allSubclasses; yourself
+! !
+
+!Behavior methodsFor: 'instance creation'!
+
+basicNew
+	^{'return new self.fn();'}
+!
+
+new
+	^self basicNew 
+	    initialize;
+	    yourself
+! !
+
+
+Behavior subclass: #Class
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!Class methodsFor: 'accessing'!
+
+category
+	^{'return self.category'}
+!
+
+category: aString
+	{'self.category = aString'}
+! !
+
+!Class methodsFor: 'class creation'!
+
+subclass: aString instanceVariableNames: anotherString
+	^self subclass: aString instanceVariableNames: anotherString category: nil
+!
+
+subclass: aString instanceVariableNames: aString2 category: aString3
+	^ClassBuilder new
+	    superclass: self subclass: aString instanceVariableNames: aString2 category: aString3
+! !
+
+!Class methodsFor: 'printing'!
+
+printString
+	^self name
+! !
+
+!Class methodsFor: 'testing'!
+
+isClass
+	^true
+! !
+
+
+Behavior subclass: #Metaclass
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!Metaclass methodsFor: 'accessing'!
+
+instanceClass
+	^{'return self.instanceClass'}
+!
+
+instanceVariableNames: aCollection
+	ClassBuilder new
+	    class: self instanceVariableNames: aCollection
+! !
+
+!Metaclass methodsFor: 'printing'!
+
+printString
+	^self instanceClass name, ' class'
+! !
+
+!Metaclass methodsFor: 'testing'!
+
+isMetaclass
+	^true
+! !
+
+
+Object subclass: #CompiledMethod
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!CompiledMethod methodsFor: 'accessing'!
+
+category
+	^(self basicAt: 'category') ifNil: ['']
+!
+
+category: aString
+	self basicAt: 'category' put: aString
+!
+
+fn
+	^self basicAt: 'fn'
+!
+
+fn: aBlock
+	self basicAt: 'fn' put: aBlock
+!
+
+selector
+	^self basicAt: 'selector'
+!
+
+selector: aString
+	self basicAt: 'selector' put: aString
+!
+
+source
+	^(self basicAt: 'source') ifNil: ['']
+!
+
+source: aString
+	self basicAt: 'source' put: aString
+! !
+
+
+Object subclass: #Number
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!Number methodsFor: 'arithmetic'!
+
+* aNumber
+	^{'return self * aNumber'}
+!
+
++ aNumber
+	^{'return self + aNumber'}
+!
+
+- aNumber
+	^{'return self - aNumber'}
+!
+
+/ aNumber
+	^{'return self / aNumber'}
+!
+
+max: aNumber
+	^{'return Math.max(self, aNumber);'}
+!
+
+min: aNumber
+	^{'return Math.min(self, aNumber);'}
+! !
+
+!Number methodsFor: 'comparing'!
+
+< aNumber
+	^{'return self < aNumber'}
+!
+
+<= aNumber
+	^{'return self <= aNumber'}
+!
+
+= aNumber
+	^{'return Number(self) == aNumber'}
+!
+
+> aNumber
+	^{'return self > aNumber'}
+!
+
+>= aNumber
+	^{'return self >= aNumber'}
+! !
+
+!Number methodsFor: 'converting'!
+
+asJavascript
+	^'(', self printString, ')'
+!
+
+asString
+	^self printString
+!
+
+rounded
+	^{'return Math.round(self);'}
+!
+
+to: aNumber
+	| array first last count |
+	first := self truncated.
+	last := aNumber truncated + 1.
+	count := 1.
+	(first <= last) ifFalse: [self error: 'Wrong interval'].
+	array := Array new.
+	(last - first) timesRepeat: [
+	    array at: count put: first.
+	    count := count + 1.
+	    first := first + 1].
+	^array
+!
+
+truncated
+	^{'return Math.floor(self);'}
+! !
+
+!Number methodsFor: 'enumerating'!
+
+timesRepeat: aBlock
+	| integer count |
+	integer := self truncated.
+	count := 1.
+	[count > self] whileFalse: [
+	    aBlock value.
+	    count := count + 1]
+!
+
+to: aNumber do: aBlock
+	^(self to: aNumber) do: aBlock
+! !
+
+!Number methodsFor: 'printing'!
+
+printString
+	^{'return String(self)'}
+! !
+
+!Number methodsFor: 'testing'!
+
+isNumber
+	^true
+! !
+
+
+Object subclass: #BlockClosure
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!BlockClosure methodsFor: 'accessing'!
+
+compiledSource
+	^{'return self.toString()'}
+! !
+
+!BlockClosure methodsFor: 'controlling'!
+
+whileFalse: aBlock
+	{'while(!!self()) {aBlock()}'}
+!
+
+whileTrue: aBlock
+	{'while(self()) {aBlock()}'}
+! !
+
+!BlockClosure methodsFor: 'error handling'!
+
+on: anErrorClass do: aBlock
+	self try: self catch: [:error |
+	    (error isKindOf: anErrorClass) 
+	     ifTrue: [aBlock value]
+	     ifFalse: [error signal]]
+! !
+
+!BlockClosure methodsFor: 'evaluating'!
+
+value
+	^{'return self();'}
+!
+
+value: anArg
+	^{'return self(anArg);'}
+!
+
+value: firstArg value: secondArg
+	^{'return self(firstArg, secondArg);'}
+!
+
+value: firstArg value: secondArg value: thirdArg
+	^{'return self(firstArg, secondArg, thirdArg);'}
+!
+
+valueWithPossibleArguments: aCollection
+	^{'return self.apply(null, aCollection);'}
+! !
+
+!BlockClosure methodsFor: '*JQuery'!
+
+appendToJQuery: aJQuery
+	| canvas |
+	canvas := HTMLCanvas new.
+	self value: canvas.
+	aJQuery append: canvas
+! !
+
+!BlockClosure methodsFor: '*Canvas'!
+
+appendToBrush: aTagBrush
+    aTagBrush appendBlock: self
+! !
+
+
+
+Object subclass: #Boolean
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!Boolean methodsFor: 'comparing'!
+
+= aBoolean
+    	^{'return Boolean(self == true) == aBoolean'}
+! !
+
+!Boolean methodsFor: 'controlling'!
+
+and: aBlock
+	^self = true
+	    ifTrue: aBlock
+	    ifFalse: [false]
+!
+
+ifFalse: aBlock
+	^self ifTrue: [] ifFalse: aBlock
+!
+
+ifFalse: aBlock ifTrue: anotherBlock
+	^self ifTrue: anotherBlock ifFalse: aBlock
+!
+
+ifTrue: aBlock
+	^self ifTrue: aBlock ifFalse: []
+!
+
+ifTrue: aBlock ifFalse: anotherBlock
+	^{'
+	    if(self == true) {
+		return aBlock();
+	    } else {
+		return anotherBlock();
+	    }
+	'}
+!
+
+not
+	^self = false
+!
+
+or: aBlock
+	^self = true
+	    ifTrue: [true]
+	    ifFalse: aBlock
+! !
+
+!Boolean methodsFor: 'copying'!
+
+deepCopy
+	^self
+!
+
+shallowCopy
+	^self
+! !
+
+!Boolean methodsFor: 'printing'!
+
+printString
+	^{'return self.toString()'}
+! !
+
+
+Object subclass: #UndefinedObject
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!UndefinedObject class methodsFor: 'instance creation'!
+
+new
+	    self error: 'You cannot create new instances of UndefinedObject. Use nil'
+! !
+
+!UndefinedObject methodsFor: 'class creation'!
+
+subclass: aString instanceVariableNames: anotherString
+	^self subclass: aString instanceVariableNames: anotherString category: nil
+!
+
+subclass: aString instanceVariableNames: aString2 category: aString3
+	^ClassBuilder new
+	    superclass: self subclass: aString instanceVariableNames: aString2 category: aString3
+! !
+
+!UndefinedObject methodsFor: 'copying'!
+
+deepCopy
+	^self
+!
+
+shallowCopy
+	^self
+! !
+
+!UndefinedObject methodsFor: 'printing'!
+
+printString
+    ^'nil'
+! !
+
+!UndefinedObject methodsFor: 'testing'!
+
+ifNil: aBlock
+	^self ifNil: aBlock ifNotNil: []
+!
+
+ifNil: aBlock ifNotNil: anotherBlock
+	^aBlock value
+!
+
+ifNotNil: aBlock
+	^self
+!
+
+ifNotNil: aBlock ifNil: anotherBlock
+	^anotherBlock value
+!
+
+isNil
+	^true
+!
+
+notNil
+	^false
+! !
+
+
+Object subclass: #Error
+	instanceVariableNames: 'messageText'
+	category: 'Kernel'!
+
+
+!Error class methodsFor: 'instance creation'!
+
+signal: aString
+	    ^self new
+		messageText: aString;
+		signal
+! !
+
+!Error methodsFor: 'accessing'!
+
+messageText
+	^messageText
+!
+
+messageText: aString
+	messageText := aString
+! !
+
+!Error methodsFor: 'signaling'!
+
+signal
+	^{'throw({smalltalkError: self})'}
+! !
+
+
+Object subclass: #Collection
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!Collection class methodsFor: 'accessing'!
+
+streamClass
+	    ^Stream
+! !
+
+!Collection class methodsFor: 'instance creation'!
+
+with: anObject
+	    ^self new
+		add: anObject;
+		yourself
+!
+
+with: anObject with: anotherObject
+	    ^self new
+		add: anObject;
+		add: anotherObject;
+		yourself
+!
+
+with: firstObject with: secondObject with: thirdObject
+	    ^self new
+		add: firstObject;
+		add: secondObject;
+		add: thirdObject;
+		yourself
+!
+
+withAll: aCollection
+	    ^self new
+		addAll: aCollection;
+		yourself
+! !
+
+!Collection methodsFor: 'accessing'!
+
+at: anIndex
+	^self at: anIndex ifAbsent: [
+	    self errorNotFound]
+!
+
+at: anIndex ifAbsent: aBlock
+	self subclassResponsibility
+!
+
+at: anIndex put: anObject
+	self subclassResponsibility
+!
+
+first
+	^self at: 1
+!
+
+fourth
+	^self at: 4
+!
+
+last
+	^self at: self size
+!
+
+readStream
+	^self stream
+!
+
+second
+	^self at: 2
+!
+
+size
+	self subclassResponsibility
+!
+
+stream
+	^self streamClass on: self
+!
+
+streamClass
+	^self class streamClass
+!
+
+third
+	^self at: 3
+!
+
+writeStream
+	^self stream
+! !
+
+!Collection methodsFor: 'adding/removing'!
+
+add: anObject
+	self subclassResponsibility
+!
+
+addAll: aCollection
+	aCollection do: [:each |
+	    self add: each].
+	^aCollection
+!
+
+remove: anObject
+    self subclassResponsibility
+! !
+
+!Collection methodsFor: 'converting'!
+
+asArray
+	| array index |
+	array := Array new.
+	index := 0.
+	self do: [:each |
+	    index := index + 1.
+	    array at: index put: each].
+	^array
+! !
+
+!Collection methodsFor: 'copying'!
+
+, aCollection
+	^self copy 
+	    addAll: aCollection; 
+	    yourself
+!
+
+copyFrom: anIndex to: anotherIndex
+	self subclassResponsibility
+!
+
+copyWith: anObject
+	^self copy add: anObject; yourself
+!
+
+copyWithAll: aCollection
+	^self copy addAll: aCollection; yourself
+! !
+
+!Collection methodsFor: 'enumerating'!
+
+collect: aBlock
+	| stream |
+	stream := self class new writeStream.
+	self do: [:each |
+	    stream nextPut: (aBlock value: each)].
+	^stream contents
+!
+
+detect: aBlock
+	^self detect: aBlock ifNone: [self errorNotFound]
+!
+
+detect: aBlock ifNone: anotherBlock
+	^{'
+	for(var i = 0; i < self.length; i++)
+		if(aBlock(self[i]))
+			return self[i];
+	return anotherBlock();
+	'}
+!
+
+do: aBlock
+	{'for(var i=0;i<self.length;i++){aBlock(self[i]);}'}
+!
+
+do: aBlock separatedBy: anotherBlock
+    	| first |
+    	first := true.
+    	self do: [:each |
+    	    first
+    		ifTrue: [first := false]
+    		ifFalse: [anotherBlock value].
+    	    aBlock value: each]
+!
+
+inject: anObject into: aBlock
+	| result |
+	result := anObject.
+	self do: [:each | 
+	    result := aBlock value: result value: each].
+	^result
+!
+
+reject: aBlock
+	^self select: [:each | (aBlock value: each) = false]
+!
+
+select: aBlock
+	| stream |
+	stream := self class new writeStream.
+	self do: [:each |
+	    (aBlock value: each) ifTrue: [
+		stream nextPut: each]].
+	^stream contents
+! !
+
+!Collection methodsFor: 'error handling'!
+
+errorNotFound
+	self error: 'Object is not in the collection'
+! !
+
+!Collection methodsFor: 'testing'!
+
+includes: anObject
+	^{'
+		var i = self.length;
+		while (i--) {
+			if (self[i].__eq(anObject)) {
+				return true;
+			}	
+		}
+		return false;
+
+	'}
+!
+
+isEmpty
+	^self size = 0
+!
+
+notEmpty
+	^self isEmpty not
+! !
+
+
+Collection subclass: #String
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!String class methodsFor: 'accessing'!
+
+cr
+	    ^{'{return ''\n''};'}
+!
+
+lf
+	    ^{'return ''\r'';'}
+!
+
+space
+	    ^{'return '' '';'}
+!
+
+streamClass
+	    ^StringStream
+!
+
+tab
+	    ^{'return ''\t'';'}
+! !
+
+!String class methodsFor: 'instance creation'!
+
+fromString: aString
+	    ^{'return new self.fn(aString);'}
+! !
+
+!String methodsFor: 'accessing'!
+
+at: anIndex
+    	^{'return self[anIndex - 1] || nil;'}
+!
+
+at: anIndex ifAbsent: aBlock
+    	(self at: anIndex) ifNil: [aBlock]
+!
+
+at: anIndex put: anObject
+    	self errorReadOnly
+!
+
+escaped
+	^{'return escape(self)'}
+!
+
+size
+	^{'return self.length'}
+!
+
+unescaped
+	^{'return unescape(self)'}
+! !
+
+!String methodsFor: 'adding'!
+
+add: anObject
+    	self errorReadOnly
+!
+
+remove: anObject
+    self errorReadOnly
+! !
+
+!String methodsFor: 'comparing'!
+
+= aString
+	^{'return String(self) == aString'}
+!
+
+> aString
+	^{'return String(self) > aString'}
+!
+
+< aString
+	^{'return String(self) < aString'}
+!
+
+>= aString
+	^{'return String(self) >= aString'}
+!
+
+<= aString
+	^{'return String(self) <= aString'}
+! !
+
+!String methodsFor: 'converting'!
+
+asCharacterParser
+    	^PPCharacterParser new string: self
+!
+
+asChoiceParser
+    	^PPChoiceParser withAll: (self asArray collect: [:each | each asParser])
+!
+
+asJavascript
+	^{'
+	if(self.search(/^[a-zA-Z0-9_:.$ ]*$/) == -1)
+		return "unescape(\"" + escape(self) + "\")";
+	else
+		return "\"" + self + "\"";
+	'}
+!
+
+asNumber
+	^{'return Number(self);'}
+!
+
+asParser
+    	^PPStringParser new string: self
+!
+
+asSelector
+	| selector |
+	selector := '_', self.
+    	selector := selector replace: ':' with: '_'.
+    	selector := selector replace: '[+]' with: '_plus'.
+    	selector := selector replace: '-' with: '_minus'.
+    	selector := selector replace: '[*]' with: '_star'.
+    	selector := selector replace: '[/]' with: '_slash'.
+    	selector := selector replace: '>' with: '_gt'.
+    	selector := selector replace: '<' with: '_lt'.
+    	selector := selector replace: '=' with: '_eq'.
+    	selector := selector replace: ',' with: '_comma'.
+    	selector := selector replace: '[@]' with: '_at'.
+	^selector
+!
+
+asString
+    	^self
+!
+
+tokenize: aString
+	^{'return self.split(aString)'}
+! !
+
+!String methodsFor: 'copying'!
+
+, aString
+    	^{'return self + aString'}
+!
+
+copyFrom: anIndex to: anotherIndex
+    	^{'return self.substring(anIndex - 1, anotherIndex);'}
+!
+
+deepCopy
+    	^self shallowCopy
+!
+
+shallowCopy
+    	^self class fromString: self
+! !
+
+!String methodsFor: 'error handling'!
+
+errorReadOnly
+    	self error: 'Object is read-only'
+! !
+
+!String methodsFor: 'printing'!
+
+printNl
+	{'console.log(self)'}
+!
+
+printString
+    	^'''', self, ''''
+! !
+
+!String methodsFor: 'regular expressions'!
+
+match: aRegexp
+    	^{'return self.search(aRegexp) !!= -1'}
+!
+
+replace: aString with: anotherString
+    	^self replaceRegexp: (RegularExpression fromString: aString flag: 'g') with: anotherString
+!
+
+replaceRegexp: aRegexp with: aString
+    	^{'return self.replace(aRegexp, aString);'}
+! !
+
+!String methodsFor: 'testing'!
+
+isString
+    	^true
+! !
+
+!String methodsFor: '*JQuery'!
+
+asJQuery
+    ^JQuery fromString: self
+!
+
+appendToJQuery: aJQuery
+    {'aJQuery._appendElement_(String(self))'}
+! !
+
+!String methodsFor: '*Canvas'!
+
+appendToBrush: aTagBrush
+    aTagBrush appendString: self
+! !
+
+Object subclass: #RegularExpression
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!RegularExpression class methodsFor: 'instance creation'!
+
+fromString: aString
+	    ^self fromString: aString flag: ''
+!
+
+fromString: aString flag: anotherString
+	    ^{'return new RegExp(aString, anotherString);'}
+! !
+
+!RegularExpression methodsFor: 'evaluating'!
+
+compile: aString
+	^{'return self.compile(aString);'}
+!
+
+exec: aString
+	^{'return self.exec(aString);'}
+!
+
+test: aString
+	^{'return self.test(aString);'}
+! !
+
+
+Collection subclass: #Array
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!Array methodsFor: 'accessing'!
+
+at: anIndex ifAbsent: aBlock
+	^{'
+	    var value = self[anIndex - 1];
+	    if(value === undefined) {
+		return aBlock();
+	    } else {
+		return value;
+	    }
+	'}
+!
+
+at: anIndex put: anObject
+	^{'return self[anIndex - 1] = anObject'}
+!
+
+size
+	^{'return self.length'}
+! !
+
+!Array methodsFor: 'adding'!
+
+add: anObject
+	^{'self.push(anObject); return anObject;'}
+!
+
+addLast: anObject
+	^self add: anObject
+!
+
+remove: anObject
+    {'for(var i=0;i<self.length;i++) {
+	if(self[i] == anObject) {
+		self.splice(i,1);
+		break;
+	}
+    }'}
+! !
+
+!Array methodsFor: 'converting'!
+
+asJavascript
+	^'[', ((self collect: [:each | each asJavascript]) join: ', '),  ']'
+! !
+
+!Array methodsFor: 'copying'!
+
+deepCopy
+	| newCollection |
+	newCollection := self class new.
+	self do: [:each | newCollection add: each deepCopy].
+	^newCollection
+!
+
+shallowCopy
+	| newCollection |
+	newCollection := self class new.
+	self do: [:each | newCollection add: each].
+	^newCollection
+!
+
+copyFrom: anIndex to: anotherIndex
+	| array |
+	array := self class new.
+	anIndex to: anotherIndex do: [:each |
+	    array add: (self at: each)].
+	^array
+! !
+
+!Array methodsFor: 'enumerating'!
+
+sort
+    ^self copy basicPerform: 'sort'
+!
+
+sort: aBlock
+    ^self copy basicPerform: 'sort' withArguments: (Array with: aBlock)
+!
+
+join: aString
+	^{'return self.join(aString);'}
+! !
+
+
+
+Object subclass: #Association
+	instanceVariableNames: 'key value'
+	category: 'Kernel'!
+
+
+!Association class methodsFor: 'instance creation'!
+
+key: aKey value: aValue
+	    ^self new
+		key: aKey;
+		value: aValue;
+		yourself
+! !
+
+!Association methodsFor: 'accessing'!
+
+key
+	^key
+!
+
+key: aKey
+	key := aKey
+!
+
+value
+	^value
+!
+
+value: aValue
+	value := aValue
+! !
+
+!Association methodsFor: 'comparing'!
+
+= anAssociation
+	^self class = anAssociation class and: [
+	    self key = anAssociation key and: [
+		self value = anAssociation value]]
+! !
+
+
+Collection subclass: #Dictionary
+	instanceVariableNames: 'keys'
+	category: 'Kernel'!
+
+
+!Dictionary methodsFor: 'accessing'!
+
+associations
+	| associations |
+	associations := #().
+	keys do: [:each |
+	    associations add: (Association key: each value: (self at: each))].
+	^associations
+!
+
+at: aKey ifAbsent: aBlock
+	^(self basicAt: aKey) ifNil: aBlock
+!
+
+at: aKey ifAbsentPut: aBlock
+    	^self at: aKey ifAbsent: [
+    	    self at: aKey put: aBlock value]
+!
+
+at: aKey ifPresent: aBlock
+	^(self basicAt: aKey) ifNotNil: [aBlock value: (self at: aKey)]
+!
+
+at: aKey ifPresent: aBlock ifAbsent: anotherBlock
+	^(self basicAt: aKey)
+	    ifNil: anotherBlock
+	    ifNotNil: [aBlock value: (self at: aKey)]
+!
+
+at: aKey put: aValue
+	(keys includes: aKey) ifFalse: [keys add: aKey].
+	^self basicAt: aKey put: aValue
+!
+
+keys
+	^keys copy
+!
+
+size
+	^keys size
+!
+
+values
+    	^keys collect: [:each | self at: each]
+! !
+
+!Dictionary methodsFor: 'adding/removing'!
+
+add: anAssociation
+    	self at: anAssociation key put: anAssociation value
+!
+
+addAll: aDictionary
+    	super addAll: aDictionary associations.
+    	^aDictionary
+!
+
+remove: aKey
+    self removeKey: aKey
+!
+
+removeKey: aKey
+    keys remove: aKey
+! !
+
+!Dictionary methodsFor: 'comparing'!
+
+= aDictionary
+	self class = aDictionary class ifFalse: [^false].
+	self associationsDo: [:assoc |
+	    (aDictionary at: assoc key ifAbsent: [^false]) = assoc value 
+		ifFalse: [^false]].
+	^true
+! !
+
+!Dictionary methodsFor: 'copying'!
+
+, aCollection
+	self shouldNotImplement
+!
+
+copyFrom: anIndex to: anotherIndex
+	self shouldNotImplement
+!
+
+shallowCopy
+	| copy |
+	copy := self class new.
+	self associationsDo: [:each |
+	    copy at: each key  put: each value].
+	^copy
+! !
+
+!Dictionary methodsFor: 'enumerating'!
+
+associationsDo: aBlock
+    	self associations do: aBlock
+!
+
+collect: aBlock
+    	| newDict |
+    	newDict := self class new.
+    	self keysAndValuesDo: [:key :value |
+    	    (aBlock value: value) ifTrue: [newDict at: key put: value]].
+    	^newDict
+!
+
+detect: aBlock ifNone: anotherBlock
+	^self values detect: aBlock ifNone: anotherBlock
+!
+
+do: aBlock
+    	self values do: aBlock
+!
+
+includes: anObject
+	^self values includes: anObject
+!
+
+keysAndValuesDo: aBlock
+    	self associationsDo: [:each |
+    	    aBlock value: each key value: each value]
+!
+
+select: aBlock
+    	| newDict |
+    	newDict := self class new.
+    	self keysAndValuesDo: [:key :value |
+    	    (aBlock value: value) ifTrue: [newDict at: key put: value]].
+    	^newDict
+! !
+
+!Dictionary methodsFor: 'initialization'!
+
+initialize
+    	super initialize.
+    	keys := #()
+! !
+
+
+Object subclass: #ClassBuilder
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!ClassBuilder methodsFor: 'class creation'!
+
+class: aClass instanceVariableNames: aString
+	aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
+	aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).
+	self setupClass: aClass
+!
+
+superclass: aClass subclass: aString
+	self superclass: aClass subclass: aString instanceVariableNames: '' category: nil
+!
+
+superclass: aClass subclass: aString instanceVariableNames: aString2 category: aString3
+	| newClass |
+	newClass := self addSubclassOf: aClass named: aString instanceVariableNames: (self instanceVariableNamesFor: aString2).
+	self setupClass: newClass.
+	newClass category: (aString3 ifNil: ['unclassified'])
+! !
+
+!ClassBuilder methodsFor: 'private'!
+
+addSubclassOf: aClass named: aString instanceVariableNames: aCollection
+	^{'smalltalk.addClass(aString, aClass, aCollection);
+	    return smalltalk[aString]'}
+!
+
+instanceVariableNamesFor: aString
+	^(aString tokenize: ' ') reject: [:each | each isEmpty]
+!
+
+setupClass: aClass
+	{'smalltalk.init(aClass);'}
+! !
+
+
+Object subclass: #ClassCategoryReader
+	instanceVariableNames: 'class category chunkParser'
+	category: 'Kernel'!
+
+
+!ClassCategoryReader methodsFor: 'accessing'!
+
+class: aClass category: aString
+	class := aClass.
+	category := aString
+! !
+
+!ClassCategoryReader methodsFor: 'fileIn'!
+
+scanFrom: aStream
+	| nextChunk |
+	nextChunk := (chunkParser emptyChunk / chunkParser chunk) parse: aStream.
+	nextChunk isEmptyChunk ifFalse: [
+	    self compileMethod: nextChunk contents.
+	    self scanFrom: aStream].
+! !
+
+!ClassCategoryReader methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	chunkParser := ChunkParser new.
+! !
+
+!ClassCategoryReader methodsFor: 'private'!
+
+compileMethod: aString
+	| method |
+	method := Compiler new load: aString forClass: class.
+	method category: category.
+	class addCompiledMethod: method
+! !
+
+
+Object subclass: #ClassCommentReader
+	instanceVariableNames: 'class chunkParser'
+	category: 'Kernel'!
+
+!ClassCommentReader methodsFor: 'accessing'!
+
+class: aClass
+	class := aClass
+! !
+
+!ClassCommentReader methodsFor: 'fileIn'!
+
+scanFrom: aStream
+	| nextChunk |
+	nextChunk := (chunkParser emptyChunk / chunkParser chunk) parse: aStream.
+	nextChunk isEmptyChunk ifFalse: [
+	    self setComment: nextChunk contents].
+! !
+
+!ClassCommentReader methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	chunkParser := ChunkParser new.
+! !
+
+!ClassCommentReader methodsFor: 'private'!
+
+setComment: aString
+    class comment: aString
+! !
+
+
+Object subclass: #Stream
+	instanceVariableNames: 'collection position streamSize'
+	category: 'Kernel'!
+
+
+!Stream class methodsFor: 'instance creation'!
+
+on: aCollection
+	    ^self new 
+		setCollection: aCollection;
+		setStreamSize: aCollection size;
+		yourself
+! !
+
+!Stream methodsFor: 'accessing'!
+
+collection
+	^collection
+!
+
+contents
+	^self collection
+	    copyFrom: 1 
+	    to: self streamSize
+!
+
+position
+	^position ifNil: [position := 0]
+!
+
+position: anInteger
+	position := anInteger
+!
+
+setCollection: aCollection
+	collection := aCollection
+!
+
+setStreamSize: anInteger
+	streamSize := anInteger
+!
+
+size
+	^self streamSize
+!
+
+streamSize
+	^streamSize
+! !
+
+!Stream methodsFor: 'actions'!
+
+close
+!
+
+flush
+!
+
+reset
+	self position: 0
+!
+
+resetContents
+	self reset.
+	self setStreamSize: 0
+! !
+
+!Stream methodsFor: 'enumerating'!
+
+do: aBlock
+	[self atEnd] whileFalse: [aBlock value: self next]
+! !
+
+!Stream methodsFor: 'positioning'!
+
+setToEnd
+	self position: self size
+!
+
+skip: anInteger
+	self position: ((self position + anInteger) min: self size max: 0)
+! !
+
+!Stream methodsFor: 'reading'!
+
+next
+	self position: self position + 1. 
+	^collection at: self position
+!
+
+next: anInteger
+	| tempCollection |
+	tempCollection := self collection class new.
+	anInteger timesRepeat: [
+	    self atEnd ifFalse: [
+		tempCollection add: self next]].
+	^tempCollection
+!
+
+peek
+	^self atEnd ifFalse: [
+	    self collection at: self position + 1]
+! !
+
+!Stream methodsFor: 'testing'!
+
+atEnd
+	^self position = self size
+!
+
+atStart
+	^self position = 0
+!
+
+isEmpty
+	^self size = 0
+! !
+
+!Stream methodsFor: 'writing'!
+
+nextPut: anObject
+	self position: self position + 1.
+	self collection at: self position put: anObject.
+	self setStreamSize: (self streamSize max: self position)
+!
+
+nextPutAll: aCollection
+	aCollection do: [:each |
+	    self nextPut: each]
+! !
+
+
+Stream subclass: #StringStream
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+
+!StringStream methodsFor: 'reading'!
+
+next: anInteger
+	| tempCollection |
+	tempCollection := self collection class new.
+	anInteger timesRepeat: [
+	    self atEnd ifFalse: [
+		tempCollection := tempCollection, self next]].
+	^tempCollection
+! !
+
+!StringStream methodsFor: 'writing'!
+
+nextPut: aString
+	self nextPutAll: aString
+!
+
+nextPutAll: aString
+	self setCollection: 
+	    (self collection copyFrom: 1 to: self position),
+	    aString,
+	    (self collection copyFrom: (self position + 1 + aString size) to: self collection size).
+	self position: self position + aString size.
+	self setStreamSize: (self streamSize max: self position)
+! !
+
+

+ 897 - 0
st/parser.st

@@ -0,0 +1,897 @@
+Object subclass: #PPParser
+	instanceVariableNames: 'memo'
+	category: 'Parser'!
+
+
+!PPParser methodsFor: 'accessing'!
+
+memo
+	^memo
+! !
+
+!PPParser methodsFor: 'error handling'!
+
+onFailure: aBlock
+	^PPFailureActionParser on: self block: aBlock
+! !
+
+!PPParser methodsFor: 'initialization'!
+
+initialize
+	memo := Dictionary new
+! !
+
+!PPParser methodsFor: 'operations'!
+
+, aParser
+	^PPSequenceParser with: self with: aParser
+!
+
+/ aParser
+	^PPChoiceParser with: self with: aParser
+!
+
+==> aBlock
+	^PPActionParser on: self block: aBlock
+!
+
+flatten
+	^PPFlattenParser on: self
+!
+
+memoizedParse: aStream
+	| start end node |
+	start := aStream position.
+	^self memo at: start 
+	    ifPresent: [:value |
+		aStream position: (self memo at: start) second.
+		value first]
+	    ifAbsent: [
+		node := self parse: aStream.
+		end := aStream position.
+		self memo at: start put: (Array with: node with: end).
+		node]
+!
+
+not
+	^PPNotParser on: self
+!
+
+optional
+	^self / PPEpsilonParser new
+!
+
+plus
+	^PPRepeatingParser on: self min: 1
+!
+
+star
+	^PPRepeatingParser on: self min: 0
+!
+
+withSource
+	^PPSourceParser on: self
+! !
+
+!PPParser methodsFor: 'parsing'!
+
+parse: aStream
+	self subclassResponsibility
+!
+
+parseAll: aStream
+	| result |
+	result := (PPSequenceParser with: self with: PPEOFParser new) memoizedParse: aStream.
+	^result isParseFailure 
+	    ifTrue: [self error: (result messageFor: aStream contents)]
+	    ifFalse: [result first]
+! !
+
+
+PPParser subclass: #PPEOFParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!PPEOFParser methodsFor: 'parsing'!
+
+parse: aStream
+	^aStream atEnd 
+	    ifFalse: [
+		PPFailure new reason: 'EOF expected' at: aStream position]
+	    ifTrue: [nil]
+! !
+
+
+PPParser subclass: #PPAnyParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!PPAnyParser methodsFor: 'parsing'!
+
+parse: aStream
+	^aStream atEnd
+	    ifTrue: [PPFailure new
+			 reason: 'did not expect EOF' at: aStream position]
+	    ifFalse: [aStream next]
+! !
+
+
+PPParser subclass: #PPEpsilonParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!PPEpsilonParser methodsFor: 'parsing'!
+
+parse: aStream
+	^nil
+! !
+
+
+PPParser subclass: #PPStringParser
+	instanceVariableNames: 'string'
+	category: 'Parser'!
+
+
+!PPStringParser methodsFor: 'accessing'!
+
+string
+	^string
+!
+
+string: aString
+	string := aString
+! !
+
+!PPStringParser methodsFor: 'parsing'!
+
+parse: aStream
+	| position result |
+	position := aStream position.
+	result := aStream next: self string size.
+	^result = self string
+	    ifTrue: [result]
+	    ifFalse: [
+		aStream position: position.
+		PPFailure new reason: 'Expected ', self string, ' but got ', (result at: position) printString; yourself]
+! !
+
+
+PPParser subclass: #PPCharacterParser
+	instanceVariableNames: 'regexp'
+	category: 'Parser'!
+
+
+!PPCharacterParser methodsFor: 'accessing'!
+
+string: aString
+	regexp := RegularExpression fromString: '[', aString, ']'
+! !
+
+!PPCharacterParser methodsFor: 'parsing'!
+
+parse: aStream
+	^(aStream peek notNil and: [self match: aStream peek])
+	    ifTrue: [aStream next]
+	    ifFalse: [PPFailure new reason: 'Could not match' at: aStream position]
+! !
+
+!PPCharacterParser methodsFor: 'private'!
+
+match: aString
+	^aString match: regexp
+! !
+
+
+PPParser subclass: #PPListParser
+	instanceVariableNames: 'parsers'
+	category: 'Parser'!
+
+
+!PPListParser class methodsFor: 'instance creation'!
+
+with: aParser with: anotherParser
+	    ^self withAll: (Array with: aParser with: anotherParser)
+!
+
+withAll: aCollection
+	    ^self new
+		parsers: aCollection;
+		yourself
+! !
+
+!PPListParser methodsFor: 'accessing'!
+
+parsers
+	^parsers ifNil: [#()]
+!
+
+parsers: aCollection
+	parsers := aCollection
+! !
+
+!PPListParser methodsFor: 'copying'!
+
+copyWith: aParser
+	^self class withAll: (self parsers copyWith: aParser)
+! !
+
+
+PPListParser subclass: #PPSequenceParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!PPSequenceParser methodsFor: 'copying'!
+
+, aRule
+	^self copyWith: aRule
+! !
+
+!PPSequenceParser methodsFor: 'parsing'!
+
+parse: aStream
+	| start elements element |
+	start := aStream position.
+	elements := #().
+	self parsers 
+	    detect: [:each |
+		element := each memoizedParse: aStream.
+		elements add: element.
+		element isParseFailure] 
+	    ifNone: [].
+	^element isParseFailure
+	    ifFalse: [elements]
+	    ifTrue: [aStream position: start. element]
+! !
+
+
+PPListParser subclass: #PPChoiceParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!PPChoiceParser methodsFor: 'copying'!
+
+/ aRule
+	^self copyWith: aRule
+! !
+
+!PPChoiceParser methodsFor: 'parsing'!
+
+parse: aStream
+	| result |
+	self parsers
+    	    detect: [:each |
+		result := each memoizedParse: aStream.
+		result isParseFailure not]
+	    ifNone: [].
+	^result
+! !
+
+
+PPParser subclass: #PPDelegateParser
+	instanceVariableNames: 'parser'
+	category: 'Parser'!
+
+
+!PPDelegateParser class methodsFor: 'instance creation'!
+
+on: aParser
+	    ^self new
+		parser: aParser;
+		yourself
+! !
+
+!PPDelegateParser methodsFor: 'accessing'!
+
+parser
+	^parser
+!
+
+parser: aParser
+	parser := aParser
+! !
+
+!PPDelegateParser methodsFor: 'parsing'!
+
+parse: aStream
+	^self parser memoizedParse: aStream
+! !
+
+
+PPDelegateParser subclass: #PPAndParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!PPAndParser methodsFor: 'parsing'!
+
+basicParse: aStream
+	| element position |
+	position := aStream position.
+	element := self parser memoizedParse: aStream.
+	aStream position: position.
+	^element
+!
+
+parse: aStream
+	^self basicParse: aStream
+! !
+
+
+PPAndParser subclass: #PPNotParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!PPNotParser methodsFor: 'parsing'!
+
+parse: aStream
+	| element |
+	element := self basicParse: aStream.
+	^element isParseFailure 
+	    ifTrue: [nil]
+	    ifFalse: [PPFailure reason: element at: aStream position]
+! !
+
+
+PPDelegateParser subclass: #PPActionParser
+	instanceVariableNames: 'block'
+	category: 'Parser'!
+
+
+!PPActionParser class methodsFor: 'instance creation'!
+
+on: aParser block: aBlock
+	    ^self new
+		parser: aParser;
+		block: aBlock;
+		yourself
+! !
+
+!PPActionParser methodsFor: 'accessing'!
+
+block
+	^block
+!
+
+block: aBlock
+	block := aBlock
+! !
+
+!PPActionParser methodsFor: 'parsing'!
+
+parse: aStream
+	| element |
+	element := self parser memoizedParse: aStream.
+	^element isParseFailure
+	    ifFalse: [self block value: element]
+	    ifTrue: [element]
+! !
+
+
+PPDelegateParser subclass: #PPFlattenParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!PPFlattenParser methodsFor: 'parsing'!
+
+parse: aStream
+	| start element stop |
+	start := aStream position.
+	element := self parser memoizedParse: aStream.
+	^element isParseFailure
+	    ifTrue: [element]
+	    ifFalse: [aStream collection 
+		copyFrom: start + 1 
+		to: aStream position]
+! !
+
+
+PPDelegateParser subclass: #PPSourceParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!PPSourceParser methodsFor: 'parsing'!
+
+parse: aStream
+	| start element stop result |
+	start := aStream position.
+	element := self parser memoizedParse: aStream.
+	^element isParseFailure
+		ifTrue: [element]
+		ifFalse: [result := aStream collection copyFrom: start + 1 to: aStream position.
+			Array with: element with: result].
+! !
+
+
+PPDelegateParser subclass: #PPRepeatingParser
+	instanceVariableNames: 'min'
+	category: 'Parser'!
+
+
+!PPRepeatingParser class methodsFor: 'instance creation'!
+
+on: aParser min: aNumber
+	    ^self new
+		parser: aParser;
+		min: aNumber;
+		yourself
+! !
+
+!PPRepeatingParser methodsFor: 'accessing'!
+
+min
+	^min
+!
+
+min: aNumber
+	min := aNumber
+! !
+
+!PPRepeatingParser methodsFor: 'parsing'!
+
+parse: aStream
+	| start element elements failure |
+	start := aStream position.
+	elements := Array new.
+	[(elements size < self min) and: [failure isNil]] whileTrue: [
+	    element := self parser memoizedParse: aStream.
+	    element isParseFailure
+			ifFalse: [elements addLast: element]
+			ifTrue: [aStream position: start.
+				 failure := element]].
+	^failure ifNil: [
+	    [failure isNil] whileTrue: [
+			element := self parser memoizedParse: aStream.
+	 		element isParseFailure
+				ifTrue: [failure := element]
+				ifFalse: [elements addLast: element]].
+				elements]
+		ifNotNil: [failure].
+! !
+
+
+Object subclass: #PPFailure
+	instanceVariableNames: 'position reason'
+	category: 'Parser'!
+
+
+!PPFailure class methodsFor: 'instance creation'!
+
+reason: aString at: anInteger
+	    ^self new
+		reason: aString at: anInteger;
+		yourself
+! !
+
+!PPFailure methodsFor: 'accessing'!
+
+position
+	^position ifNil: [0]
+!
+
+position: aNumber
+	position := aNumber
+!
+
+reason
+	^reason ifNil: ['']
+!
+
+reason: aString
+	reason := aString
+!
+
+reason: aString at: anInteger
+	self 
+	    reason: aString; 
+	    position: anInteger
+! !
+
+!PPFailure methodsFor: 'testing'!
+
+isParseFailure
+	^true
+! !
+
+
+Object subclass: #SmalltalkParser
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!SmalltalkParser class methodsFor: 'instance creation'!
+
+parse: aStream
+	    ^self new
+		parse: aStream
+! !
+
+!SmalltalkParser methodsFor: 'grammar'!
+
+parser
+	| method expression separator comment ws identifier keyword className string symbol number literalArray variable reference classReference literal ret methodParser expressionParser keyword unarySelector binarySelector keywordPattern unaryPattern binaryPattern assignment temps blockParamList block expression expressions subexpression statements sequence operand unaryMessage unarySend unaryTail binaryMessage binarySend binaryTail keywordMessage keywordSend keywordPair cascade message jsStatement |
+	
+	separator := (String cr, String space, String lf, String tab) asChoiceParser.
+	comment := ('"' asCharacterParser, ('"' asParser not, PPAnyParser new) star, '"' asCharacterParser) flatten.
+
+	ws := (separator / comment) star.
+	
+	identifier := ('a-z' asCharacterParser, 'a-zA-Z0-9' asCharacterParser star) flatten.
+
+	keyword := (identifier, ':' asParser) flatten.
+
+	className := ('A-Z' asCharacterParser, 'a-zA-Z0-9' asCharacterParser star) flatten.
+
+	string := '''' asParser, ('''''' asParser / ('''' asParser not, PPAnyParser new)) star flatten, '''' asParser
+		==> [:node | ValueNode new value: ((node at: 2) replace: '''''' with: '''')].
+
+	symbol := '#' asParser, 'a-zA-Z0-9' asCharacterParser plus flatten
+		==> [:node | ValueNode new value: node second].
+
+	number := ('0-9' asCharacterParser plus, ('.' asParser, '0-9' asCharacterParser plus) optional) flatten
+		==> [:node | ValueNode new value: node asNumber].
+
+	literal := PPDelegateParser new.
+
+	literalArray := '#(' asParser, (ws, literal, ws) star, ')' asParser
+		==> [:node | ValueNode new value: (Array withAll: (node second collect: [:each | each second value]))].
+
+	variable := identifier ==> [:token | VariableNode new value: token].
+
+	classReference := className ==> [:token | ClassReferenceNode new value: token].
+
+	reference := variable / classReference.
+
+	binarySelector := '+*/=><,@%~-' asCharacterParser plus flatten.
+
+	unarySelector := identifier.
+
+	keywordPattern := (ws, keyword, ws, identifier) plus
+		==> [:nodes | Array
+				  with: ((nodes collect: [:each | each at: 2]) join: '')
+				  with: (nodes collect: [:each | each at: 4])].
+
+	binaryPattern := ws, binarySelector, ws, identifier
+		==> [:node | Array with: node second with: (Array with: node fourth)].
+
+	unaryPattern := ws, unarySelector
+		==> [:node | Array with: node second with: Array new].
+	
+	expression := PPDelegateParser new.
+
+	expressions := expression, ((ws, '.' asParser, ws, expression) ==> [:node | node fourth]) star
+		==> [:node || result |
+		    result := Array with: node first.
+		    node second do: [:each | result add: each].
+		    result].
+
+	assignment := reference, ws, ':=' asParser, ws, expression
+		==> [:node | AssignmentNode new left: node first; right: (node at: 5)].
+
+	ret := '^' asParser, ws, expression, ws, '.' asParser optional
+	    ==> [:node | ReturnNode new
+			     addNode: node third;
+			     yourself].
+
+	temps := '|' asParser, (ws, identifier) star, ws, '|' asParser
+		==> [:node | node second collect: [:each | each second]].
+
+	blockParamList := (':' asParser, identifier, ws) plus, '|' asParser
+		==> [:node | node first collect: [:each | each second]].
+
+	subexpression := '(' asParser, ws, expression, ws, ')' asParser
+		==> [:node | node third].
+
+	statements := (ret ==> [:node | Array with: node]) / (expressions, ws, '.' asParser, ws, ret ==> [:node | node first add: (node at: 5); yourself]) / (expressions , '.' asParser optional ==> [:node | node first]).
+
+	sequence := temps optional, ws, statements optional, ws
+		==> [:node | SequenceNode new
+				 temps: node first;
+				 nodes: node third;
+				 yourself].
+
+	block := '[' asParser, ws, blockParamList optional, ws, sequence optional, ws, ']' asParser
+		==> [:node |
+		    BlockNode new
+			parameters: node third;
+			addNode: (node at: 5) asBlockSequenceNode].
+
+	operand := literal / reference / subexpression.
+
+	literal parser: number / string / literalArray / symbol / block.
+
+	unaryMessage := ws, unarySelector, ':' asParser not
+		==> [:node | SendNode new selector: node second].
+
+	unaryTail := PPDelegateParser new.
+	unaryTail parser: (unaryMessage, unaryTail optional
+			       ==> [:node |
+				   node second
+					   ifNil: [node first]
+					   ifNotNil: [node second valueForReceiver: node first]]).
+
+	unarySend := operand, unaryTail optional
+		==> [:node |
+		    node second 
+			ifNil: [node first]
+			ifNotNil: [node second valueForReceiver: node first]].
+
+	binaryMessage := ws, binarySelector, ws, (unarySend / operand)
+		==> [:node |
+		    SendNode new
+			selector: node second;
+			arguments: (Array with: node fourth)].
+
+	binaryTail := PPDelegateParser new.
+	binaryTail parser: (binaryMessage, binaryTail optional
+				    ==> [:node |
+					node second 
+					    ifNil: [node first]
+					    ifNotNil: [ node second valueForReceiver: node first]]).
+
+	binarySend := unarySend, binaryTail optional
+		==> [:node |
+		    node second
+			ifNil: [node first]
+			ifNotNil: [node second valueForReceiver: node first]].
+
+	keywordPair := keyword, ws, binarySend.
+
+	keywordMessage := (ws, keywordPair) plus
+		==> [:nodes |
+		    SendNode new
+			selector: ((nodes collect: [:each | each second first]) join: '');
+			arguments: (nodes collect: [:each | each second third])].
+
+	keywordSend := binarySend, keywordMessage
+		==> [:node |
+		    node second valueForReceiver: node first].
+
+	message := binaryMessage / unaryMessage / keywordMessage.
+
+	cascade := (keywordSend / binarySend), (ws, ';' asParser, message) plus
+		==> [:node |
+		    node first cascadeNodeWithMessages: 
+			(node second collect: [:each | each third])].
+
+	jsStatement := '{' asParser, ws, string, ws, '}' asParser
+	    ==> [:node | JSStatementNode new
+			     source: node third;
+			     yourself].
+
+	expression parser: assignment / cascade / keywordSend / binarySend / jsStatement.
+
+	method := (ws, (keywordPattern / binaryPattern / unaryPattern), ws, sequence optional, ws) withSource
+	    ==> [:node |
+		MethodNode new
+		    selector: node first second first;
+		    arguments: node first second second;
+		    addNode: node first fourth;
+		    source: node second;
+		    yourself].
+	
+	^method, PPEOFParser new ==> [:node | node first]
+! !
+
+!SmalltalkParser methodsFor: 'parsing'!
+
+parse: aStream
+	^self parser parse: aStream
+! !
+
+
+Object subclass: #Chunk
+	instanceVariableNames: 'contents'
+	category: 'Parser'!
+
+
+!Chunk methodsFor: 'accessing'!
+
+contents
+	^contents ifNil: ['']
+!
+
+contents: aString
+	contents := aString
+! !
+
+!Chunk methodsFor: 'testing'!
+
+isEmptyChunk
+	^false
+!
+
+isInstructionChunk
+	^false
+! !
+
+
+Chunk subclass: #InstructionChunk
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!InstructionChunk methodsFor: 'testing'!
+
+isInstructionChunk
+	^true
+! !
+
+
+Chunk subclass: #EmptyChunk
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!EmptyChunk methodsFor: 'testing'!
+
+isEmptyChunk
+	^true
+! !
+
+
+Object subclass: #ChunkParser
+	instanceVariableNames: 'parser separator eof ws chunk emptyChunk instructionChunk'
+	category: 'Parser'!
+
+
+!ChunkParser methodsFor: 'accessing'!
+
+chunk
+	^chunk ifNil: [chunk := self ws, ('!!!!' asParser / ('!!' asParser not, PPAnyParser new)) plus flatten, '!!' asParser ==> [:node | Chunk new contents: (node second replace: '!!!!' with: '!!')]]
+!
+
+emptyChunk
+	^emptyChunk ifNil: [emptyChunk := self separator plus, '!!' asParser, self ws ==> [:node | EmptyChunk new]]
+!
+
+eof
+	^eof ifNil: [eof := self ws, PPEOFParser new ==> [:node | nil]]
+!
+
+parser
+	^parser ifNil: [
+	    parser := self instructionChunk / self emptyChunk / self chunk / self eof]
+!
+
+separator
+	^separator ifNil: [separator := (String cr, String space, String lf, String tab) asChoiceParser]
+!
+
+ws
+	^ws ifNil: [ws := self separator star]
+! !
+
+!ChunkParser methodsFor: nil!
+
+instructionChunk
+	^instructionChunk ifNil: [
+	    instructionChunk := self ws, '!!' asParser, self chunk
+	    ==> [:node | InstructionChunk new contents: node last contents]]
+! !
+
+
+Object subclass: #Importer
+	instanceVariableNames: 'chunkParser'
+	category: 'Parser'!
+
+
+!Importer methodsFor: 'accessing'!
+
+chunkParser
+	^chunkParser ifNil: [chunkParser := ChunkParser new parser]
+! !
+
+!Importer methodsFor: 'fileIn'!
+
+import: aStream
+	aStream atEnd ifFalse: [
+	    | nextChunk |
+	    nextChunk := self chunkParser parse: aStream.
+	    nextChunk ifNotNil: [
+		nextChunk isInstructionChunk 
+		    ifTrue: [(Compiler new loadExpression: nextChunk contents)
+					 scanFrom: aStream]
+		    ifFalse: [Compiler new loadExpression: nextChunk contents].
+		self import: aStream]]
+! !
+
+
+Object subclass: #Exporter
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+
+!Exporter methodsFor: 'fileout'!
+
+exportCategory: aString
+	| stream |
+	stream := '' writeStream.
+	(Smalltalk current classes 
+	    select: [:each | each category = aString])
+	    do: [:each | stream nextPutAll: (self export: each)].
+	^stream contents
+! !
+
+!Exporter methodsFor: 'fileOut'!
+
+export: aClass
+	| stream |
+	stream := '' writeStream.
+	self exportDefinitionOf: aClass on: stream.
+	stream nextPutAll: String cr.
+	self exportMethodsOf: aClass on: stream.
+	stream nextPutAll: String cr.
+	self exportMetaDefinitionOf: aClass on: stream.
+	self exportMethodsOf: aClass class on: stream.
+	stream nextPutAll: String cr.
+	^stream contents
+! !
+
+!Exporter methodsFor: 'private'!
+
+classNameFor: aClass
+	^aClass isMetaclass
+	    ifTrue: [aClass instanceClass name, '.klass']
+	    ifFalse: [
+		aClass isNil
+		    ifTrue: ['nil']
+		    ifFalse: [aClass name]]
+!
+
+exportDefinitionOf: aClass on: aStream
+	aStream 
+	    nextPutAll: 'smalltalk.addClass(';
+	    nextPutAll: '''', (self classNameFor: aClass), ''', ';
+	    nextPutAll: 'smalltalk.', (self classNameFor: aClass superclass);
+	    nextPutAll: ', ['.
+	aClass instVarNames 
+	    do: [:each | aStream nextPutAll: '''', each, '''']
+	    separatedBy: [aStream nextPutAll: ', '].
+	aStream	
+	    nextPutAll: '], ''';
+	    nextPutAll: aClass category, '''';
+	    nextPutAll: ');'.
+	aClass comment notEmpty ifTrue: [
+	    aStream 
+	    	nextPutAll: String cr;
+		nextPutAll: 'smalltalk.';
+		nextPutAll: (self classNameFor: aClass);
+		nextPutAll: '.comment=';
+		nextPutAll: 'unescape(''', aClass comment escaped, ''')']
+!
+
+exportMetaDefinitionOf: aClass on: aStream
+	aClass class instVarNames isEmpty ifFalse: [
+	    aStream 
+		nextPutAll: 'smalltalk.', (self classNameFor: aClass class);
+		nextPutAll: '.iVarNames = ['.
+	    aClass class instVarNames
+		do: [:each | aStream nextPutAll: '''', each, '''']
+		separatedBy: [aStream nextPutAll: ','].
+	    aStream nextPutAll: '];', String cr]
+!
+
+exportMethodsOf: aClass on: aStream
+	aClass methodDictionary keysAndValuesDo: [:key :value |
+	    aStream 
+		nextPutAll: 'smalltalk.addMethod(', String cr;
+		nextPutAll: '''', value selector asSelector, ''',', String cr;
+		nextPutAll: 'smalltalk.method({', String cr;
+		nextPutAll: 'selector: ''', value selector, ''',', String cr;
+		nextPutAll: 'category: ''', value category, ''',', String cr;
+		nextPutAll: 'fn: ', value fn compiledSource, ',', String cr;
+		nextPutAll: 'source: unescape(''', value source escaped, ''')';
+		nextPutAll: '}),', String cr;
+		nextPutAll: 'smalltalk.', (self classNameFor: aClass);
+		nextPutAll: ');', String cr, String cr]
+! !
+
+

+ 399 - 0
website/css/style.css

@@ -0,0 +1,399 @@
+/* CSS Reset */
+
+* {
+	margin: 0;
+	padding: 0;
+}
+
+/* Layout */
+
+.clear {clear:both}
+
+.main {
+    margin: 0 auto;
+    width: 960px;
+}
+
+#header {
+	background: transparent url("../images/background_header.png") top center repeat-x;
+	height: 210px;
+}
+
+#header .main {
+    background: url("../images/balloon_header.png") no-repeat scroll right bottom;
+    height: 210px;
+    width: 973px;
+}
+
+#menu {
+    background: #d0def1;
+    border-top: 1px solid #aaa;
+    border-bottom: 1px solid #aaa;
+    position: absolute;
+    width: 100%;
+    top: 210px;
+}
+
+#menu ul {
+    width: 980px;
+    margin: 0 auto;
+    padding: 5px 0;
+}
+
+#menu li {
+	display: inline;
+	padding: 1px;
+}
+
+#menu a {
+	color: #515a6a;
+	text-decoration: none;
+	padding: 5px 15px;
+}
+
+#menu a:hover {
+	color: #072d5a;
+	text-decoration: underline;
+}
+
+#menu .selected a,
+#menu a:hover {
+	color: #072d5a;
+	text-decoration: none;
+}
+	
+#content .main {
+	width: 980px;
+	margin: 0 auto;
+}
+
+.box {
+    padding: 30px;
+    margin: 40px 0;
+    color: #777;
+    font-size: 14px;
+    box-shadow: 0 0 8px #aaa;
+    -moz-box-shadow: 0 0 8px #aaa;
+    -webkit-box-shadow: 0 0 8px #aaa;
+    border-radius: 10px;
+    -moz-border-radius: 10px;
+    -webkit-border-radius: 10px;
+    background: #fff url('../images/background_box.png') bottom left repeat-x;
+}
+
+.box a {
+    color: #5b9ff2;
+    text-decoration: none; 
+}
+
+.box a:hover {
+    text-decoration: underline;
+}
+
+.box ul, .box ol {
+    padding: 10px 0;
+}
+
+.box li {
+    margin-left: 40px;
+    line-height: 1.5em;
+}
+
+.box h2 {
+	font: 26px Georgia, Times, serif;
+	color: #242424;
+	margin: -30px;
+	margin-bottom: 0px;
+	padding: 15px;
+	background: #eee;
+	border-bottom: 1px solid #ccc;
+	border-top-left-radius: 10px;
+	border-top-right-radius: 10px;
+	-webkit-border-top-left-radius: 10px;
+	-webkit-border-top-right-radius: 10px;
+	-moz-border-radius-topleft: 10px;
+	-moz-border-radius-topright: 10px;
+}
+
+.box.first {
+    padding-top: 0;
+    margin-top: 70px;
+}
+
+.box.first, .box.last {
+    background-image: none;
+}
+
+.box.first h1 {
+	padding-bottom: 15px;
+}
+
+.box.first .content .right img {
+	margin-right: -30px
+}
+
+.box .content .right {
+	float: right;
+}
+
+.box .content .left {
+	float: left;
+	width: 420px;
+}
+
+.doc .content {
+	width: 620px;
+}
+
+.box h1 {
+    text-align: center;
+    margin-top: 0;
+    padding-top: 0;
+}
+
+.doc h3 a {
+    color: #ccc;
+}
+
+.doc h3 a:hover {
+    color: #0088CC;
+}
+
+.box .content p, h3 {
+	font: 16px Georgia, Times, Serif;
+	line-height: 1.6em;
+	padding: 10px 0;
+}
+
+.box .content h3 {
+	font-size: 20px;
+	padding-bottom: 2px;
+	padding-top: 30px;
+	color: #272727;
+}
+
+.box .content h4 {
+	font: 16px Georgia, Times, serif;
+	color: #272727;
+	padding-top: 1em;
+	padding-left: 1.5em;
+}
+
+.box .content pre {
+	background-color: #565656;
+	border-radius: 10px;
+	-moz-border-radius: 10px;
+	-webkit-border-radius: 10px;
+	padding: 1em;
+	color: white;
+	line-height: 1.5em;
+}
+
+.box .content code {
+	font-size: 14px;
+	color: #666;
+	background: none;
+	margin: 0;
+	padding: 0 3px;
+	border: 1px solid #bbb;
+	background: #f1f1f1;
+}
+
+.box .content .tip {
+	border: 1px solid #565656;
+	border-radius: 10px;
+	-moz-border-radius: 10px;
+	-webkit-border-radius: 10px;
+	padding: 1em;
+}
+
+.box .top img {
+	margin: 30px 0 0 70px;
+}
+
+.box.last .content .left {
+    width: 560px;
+}
+
+.box.last .content .left {
+    margin-left: -30px;
+    margin-bottom: -32px
+}
+
+.doc .box.first .content .left p, ul {
+	font-family: Helvetica, Arial, sans;
+	color: #636363;
+}
+
+.doc .box.first .content .left ul {
+	margin-left: 20px;
+	list-style-type: none;
+	line-height: 1.5em;
+}
+
+.box .content .information {
+	background-color: #e4e8ff;
+	padding: 7px 6px 7px 12px;
+	margin-top: 20px;
+	border-radius: 10px;
+	-moz-border-radius: 10px;
+	-webkit-border-radius: 10px;
+}
+
+.box .content .warning {
+	background-color: #f8ccf8;
+	padding: 7px 6px 7px 12px;
+	margin: 20px 0 20px 0;
+	border-radius: 10px;
+	-moz-border-radius: 10px;
+	-webkit-border-radius: 10px;
+}
+
+.box .content .code {
+	background: #565656;
+	border-radius: 10px;
+	-moz-border-radius: 10px;
+	-webkit-border-radius: 10px;
+	padding: 7px;
+}
+
+.box .content .code p {
+	color: white;
+}
+
+.box.first .content .left h2 {
+	font: 30px regular Georgia, Times, serif;
+	color: #272727;
+	margin-top: 10px;
+}
+
+.box.first .content .left ul {
+	padding-left: 10px;
+}
+
+.box.last .content .right {
+    width: 300px;
+}
+
+.doc .box.first .content .right {
+	float: right;
+	width: 230px;
+	margin-top: 20px;
+	padding: 10px;
+	background-color: #ececec;
+	border: 1px solid #e1e1e1;
+	border-radius: 10px;
+	-moz-border-radius: 10px;
+	-webkit-border-radius: 10px;
+}
+
+.doc .box.first .content .right ol, 
+.doc .box.first .content .right ol a {
+	font: 18px Georgia, Time, serif;
+	color: #03388a;
+}
+
+.doc .box.first .content .right ol {
+	padding: 0 0 7px 35px;
+}
+
+.doc .box.first .content .right ol li{
+	padding: 7px 0 7px 0; 
+}
+
+.doc .box.first .content .right ul a {
+	font: 15px Helvetica, Arial, sans;
+	color: black;
+}
+
+.doc .box.first .content .right ul li {
+	list-style-type: none;
+	padding: 2px 0 2px 0;
+}
+
+.trysmalltalk {
+    text-align: right;
+    padding: 10px;
+}
+
+.trysmalltalk textarea {
+    width: 850px;
+    height: 300px;
+    padding: 20px;
+    background-color: #eaeaea;
+    border: 1px solid #d3d3d3;
+    border-radius: 10px;
+    -moz-border-radius: 10px;
+    -webkit-border-radius: 10px;
+    font: 16px monaco, courier, monospace;
+    color: 434343;
+    line-height: 1.6em;
+}
+
+.trysmalltalk button {
+    margin: 20px 0 0 5px;
+    padding: 4px;
+    background: #75aef5;
+    border: 1px solid #7caeed;
+    border-radius: 8px;
+    -moz-border-radius: 8px;
+    -webkit-border-radius: 8px;
+    color: white;
+    cursor: pointer;
+}
+
+.trysmalltalk .print-it {
+	background: #bebebe;
+	border: 1px solid #b2b2b2;
+}
+
+.trysmalltalk button:hover {
+	background: #3180e1;
+	border: 1px solid #518cd6; 
+}
+
+#counters {
+    border: 2px dashed;
+    text-align: center;
+    padding: 10px;
+    margin: 10px;
+    background: #ffffcc;
+}
+
+#counters h1 {
+    margin: 10px;
+    color: #333;
+}
+
+
+.trysmalltalk .print-it:hover {
+	background: #898989;
+	border: 1px solid #919293; 
+}
+
+#footer {
+	height: 160px;
+	background: transparent url("../images/footer.png") bottom repeat-x;
+	margin: 0 auto;
+}
+
+#footer .main {
+	padding-top: 60px;
+}
+
+#footer p {
+	font-size: 12px;
+	text-align: center;
+	line-height: 1.5em;
+	color: #5a5a5a;
+}
+
+#footer a {
+	color: #0f66d2;
+	text-decoration: none;
+}
+
+#footer a:hover {
+	text-decoration: underline;
+}
+

BIN
website/images/background_box.png


BIN
website/images/background_gradient_container2.png


BIN
website/images/background_header.png


BIN
website/images/balloon_header.png


BIN
website/images/code_box.png


BIN
website/images/do-it_button.png


BIN
website/images/footer.png


BIN
website/images/print-it_button.png


BIN
website/images/screen1.png


BIN
website/images/screen2.png


BIN
website/images/text-top.png


BIN
website/images/text_header.png


BIN
website/images/title_container1.png


+ 132 - 0
website/index.html

@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Jtalk Smalltalk</title>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+    <link rel="stylesheet" type="text/css" href='css/style.css' />
+    <script type='text/javascript' src='../js/boot.js'></script>
+    <script type='text/javascript' src='../js/jquery-1.4.4.min.js'></script>
+    <script type='text/javascript' src='../js/jquery-ui-1.8.9.custom.min.js'></script>
+    <script type='text/javascript' src='../js/jquery.textarea.js'></script>
+    <script type='text/javascript' src='../js/kernel.js'></script>
+    <script type='text/javascript' src='../js/parser.js'></script>
+    <script type='text/javascript' src='../js/compiler.js'></script>	
+    <script type='text/javascript' src='../js/jQuery.js'></script>
+    <script type='text/javascript' src='../js/canvas.js'></script>
+    <script type='text/javascript' src='../js/ide.js'></script>
+    <script type='text/javascript' src='../js/init.js'></script>
+    <link rel="stylesheet" type="text/css" href="../css/jtalk.css">
+  </head>
+  <body>
+    <script type="text/javascript">
+      jQuery(window).scroll(function() {
+      	if(jQuery(window).scrollTop() > 210) {
+		jQuery('#menu')
+      			.css('position', 'fixed')
+			.css('top', '0px')
+	} else {
+      		jQuery('#menu')
+			.css('position', 'absolute')
+      			.css('top', '210px')
+      	}
+      });
+    </script>
+
+    <a href="http://github.com/you"><img style="position: absolute; top: 0; left: 0; border: 0;" src="https://assets.github.com/img/bec6c51521dcc8148146135149fe06a9cc737577?repo=&url=http%3A%2F%2Fs3.amazonaws.com%2Fgithub%2Fribbons%2Fforkme_left_darkblue_121621.png&path=" alt="Fork me on GitHub"></a>
+
+    <div id="wrapper">
+      <div id="header">
+	<div class="main">
+	  <img alt="Jtalk, the Smalltalk for web developers" src="images/text_header.png"/>
+	</div>
+      </div>
+      
+      <div id="menu">
+	<ul>
+	  <li><a href="#header">Overview</a></li> · 
+	  <li><a href="#download">Download</a></li> · 
+	  <li><a href="#documentation">Documentation</a></li> · 
+	  <li><a href="#try-it">Try it!</a></li> 
+	</ul>
+      </div>
+
+      <div id="content">
+	<div class="main">
+	  <div class="box first">
+	      <div class="content">
+		<h1><img alt="Jtalk is an implementation of the Smalltalk language that runs on the JavaScript runtime." src="images/title_container1.png"/></h1>
+		<div class="left">
+		  <p>Jtalk is an implementation of the  <a href="http://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a> language that runs on top of the <a href="http://en.wikipedia.org/wiki/Javascript">JavaScript</a> runtime. It is designed to make client-side development faster and easier.</p>
+		  <p>Jtalk is written in itself, including the parser and compiler. Jtalk compiles into efficient JavaScript, mapping one-to-one with the equivalent JavaScript. There is no interpretation at runtime.</p>
+		  <p>Try a <button onClick="smalltalk.Browser._open()"> Class browser</button> right now!</p>
+		</div>
+		<div class="right"><img src="images/screen2.png"/></div>
+		<div class="clear"></div>
+	      </div>
+	  </div>
+
+	  <div class="box">
+	      <h2>Client-side usage</h2>
+	      <div class="content">
+		<p>Load the full Jtalk Smalltalk environment in your page:</p> 
+		<pre>&lt;script&gt; src="jtalk.js" type="text/javascript" &lt;/script&gt;</pre>
+		<p>Or the runtime JavaScript file only (without the Smalltalk source or compiler):</p>
+		<pre>&lt;script&gt; src="jtalk-runtime.js" type="text/javascript" &lt;/script&gt;</pre>
+		<p>Read the <a href="#documentation">documentation</a> to learn more about writing applications in Jtalk.</p>
+	    </div>
+	  </div>
+
+	  <div class="box last doc" id="documentation">
+	    <h2>Documentation</h2>
+	    <div class="content">
+
+	      <h3 id="intro">1. Introduction <a href="#intro">&para;</a></h3>
+
+	      <p class="warning">This documentation is a work in progress.</p>
+
+	      <p class="information">Jtalk is a young piece of code and evolves quickly. Some features are still incomplete and you may very well encounter bugs.</p>
+	      <p>Jtalk is an implementation of the Smalltalk-80 language. It allows developers to write client-side heavy web applications in Smalltalk. Jtalk includes an integrated development environment with a class browser, workspace and transcript.</p>
+	      <p>Jtalk includes the following features:</p>
+	      <ol>
+		<li>It is semantically and syntaxically equivalent to <a href="http://www.pharo-project.org">Pharo Smalltalk</a> (the implementation considered as the reference)</li>
+		<li>It is written in itself and compiles into efficient JavaScript</li>
+		<li>A canvas API similar to <a href="http://www.seaside.st">Seaside</a> to generate HTML</li>
+		<li>A <a href="http://www.jquery.com">jQuery</a> binding</li>
+	      </ol>
+
+	      <h3 id="differences-other-smalltalks">2. Differences with other Smalltalk implementations <a href="#differences-other-smalltalks">&para;</a></h3>
+
+	      <h3 id="counter-example">3. The counter example <a href="#counter-example">&para;</a></h3>
+
+	      <p>The following example is the traditional Seaside-like multi-counter application. The buttons at the bottom of each counter increase or decrease the counter.</p>
+
+	      <div id="counters"></div>
+	      <script type="text/javascript">
+		jQuery(document).ready(function() {'#counters'._asJQuery()._append_(smalltalk.Counter._new())._append_(smalltalk.Counter._new())});
+	      </script>
+
+	      <p>Open a  <button onclick="smalltalk.Browser._openOn_(smalltalk.Counter);">browser</button> on the <code>Counter</code> class in the <code>Canvas</code> class category.
+		<p>Each Jtalk widget is a subclass of <code>Widget</code>. A widget is a graphical component. The <code>#renderOn:</code> method is used to generate HTML using the HTML canvas.</p>
+
+
+		<h3 id="html-canvas">4. The HTML canvas <a href="#html-canvas">&para;</a></h3>
+		<h3 id="widgets">5. Widgets <a href="#widgets">&para;</a></h3>
+		<h3 id="jquery">6. jQuery <a href="#jquery">&para;</a></h3>
+
+	    </div>
+	  </div>
+	</div>
+      </div>
+    </div>
+    
+    <div id="footer">
+      <div class="main">
+	<p>Copyright © 2011 <a href="mailto:petton.nicolas@gmail.com">Nicolas Petton</a>.</p>
+	<p>Jtalk is an opensource project sponsored by <a href="http://www.objectfusion.fr">objectfusion</a>.</p>
+	<p>The design of this website was kindly provided by <a href="mailto:neomie.thirion@gmail.com">Noémie Thirion</a>.</p>
+      </div> 
+    </div>
+    
+  </body>
+</html>
+

Некоторые файлы не были показаны из-за большого количества измененных файлов