Update to prototype 1.5.0 and scriptaculous 1.7.0. Fix some AJAXy bits. Props mdawaffe. fixes #3645 #3676 #3519
git-svn-id: http://svn.automattic.com/wordpress/trunk@4813 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
246602968a
commit
15b6168787
|
@ -32,7 +32,9 @@ Object.extend(listMan.prototype, {
|
||||||
var ajaxAdd = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
|
var ajaxAdd = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
|
||||||
if ( ajaxAdd.notInitialized() )
|
if ( ajaxAdd.notInitialized() )
|
||||||
return true;
|
return true;
|
||||||
ajaxAdd.options.parameters += '&action=' + ( update ? 'update-' : 'add-' ) + what + '&' + this.grabInputs( where, ajaxAdd ) + this.inputData;
|
var action = ( update ? 'update-' : 'add-' ) + what;
|
||||||
|
ajaxAdd.options.parameters = $H(ajaxAdd.options.parameters).merge({action: action}).merge(this.inputData.toQueryParams()).merge(this.grabInputs( where, ajaxAdd ).toQueryParams());
|
||||||
|
|
||||||
var tempObj=this;
|
var tempObj=this;
|
||||||
ajaxAdd.addOnComplete( function(transport) {
|
ajaxAdd.addOnComplete( function(transport) {
|
||||||
var newItems = $A(transport.responseXML.getElementsByTagName(what));
|
var newItems = $A(transport.responseXML.getElementsByTagName(what));
|
||||||
|
@ -79,18 +81,19 @@ Object.extend(listMan.prototype, {
|
||||||
if( ajaxDel.notInitialized() )
|
if( ajaxDel.notInitialized() )
|
||||||
return true;
|
return true;
|
||||||
var tempObj = this;
|
var tempObj = this;
|
||||||
var action = 'delete-' + what + '&id=' + id;
|
var action = 'delete-' + what;
|
||||||
|
var actionId = action + '&id=' + id;
|
||||||
var idName = what.replace('-as-spam','') + '-' + id;
|
var idName = what.replace('-as-spam','') + '-' + id;
|
||||||
ajaxDel.addOnComplete( function(transport) {
|
ajaxDel.addOnComplete( function(transport) {
|
||||||
Element.update(ajaxDel.myResponseElement,'');
|
Element.update(ajaxDel.myResponseElement,'');
|
||||||
tempObj.destore(action);
|
tempObj.destore(actionId);
|
||||||
if( tempObj.delComplete && typeof tempObj.delComplete == 'function' )
|
if( tempObj.delComplete && typeof tempObj.delComplete == 'function' )
|
||||||
tempObj.delComplete( what, id, transport );
|
tempObj.delComplete( what, id, transport );
|
||||||
});
|
});
|
||||||
ajaxDel.addOnWPError( function(transport) { tempObj.restore(action, true); });
|
ajaxDel.addOnWPError( function(transport) { tempObj.restore(actionId, true); });
|
||||||
ajaxDel.options.parameters += '&action=' + action + this.inputData;
|
ajaxDel.options.parameters = $H(ajaxDel.options.parameters).merge({action: action, id: id}).merge(this.inputData.toQueryParams());
|
||||||
ajaxDel.request(ajaxDel.url);
|
ajaxDel.request(ajaxDel.url);
|
||||||
this.store(action, idName);
|
this.store(actionId, idName);
|
||||||
tempObj.removeListItem( idName );
|
tempObj.removeListItem( idName );
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
@ -102,18 +105,19 @@ Object.extend(listMan.prototype, {
|
||||||
if ( ajaxDim.notInitialized() )
|
if ( ajaxDim.notInitialized() )
|
||||||
return true;
|
return true;
|
||||||
var tempObj = this;
|
var tempObj = this;
|
||||||
var action = 'dim-' + what + '&id=' + id;
|
var action = 'dim-' + what;
|
||||||
|
var actionId = action + '&id=' + id;
|
||||||
var idName = what + '-' + id;
|
var idName = what + '-' + id;
|
||||||
ajaxDim.addOnComplete( function(transport) {
|
ajaxDim.addOnComplete( function(transport) {
|
||||||
Element.update(ajaxDim.myResponseElement,'');
|
Element.update(ajaxDim.myResponseElement,'');
|
||||||
tempObj.destore(action);
|
tempObj.destore(actionId);
|
||||||
if ( tempObj.dimComplete && typeof tempObj.dimComplete == 'function' )
|
if ( tempObj.dimComplete && typeof tempObj.dimComplete == 'function' )
|
||||||
tempObj.dimComplete( what, id, dimClass, transport );
|
tempObj.dimComplete( what, id, dimClass, transport );
|
||||||
});
|
});
|
||||||
ajaxDim.addOnWPError( function(transport) { tempObj.restore(action, true); });
|
ajaxDim.addOnWPError( function(transport) { tempObj.restore(actionId, true); });
|
||||||
ajaxDim.options.parameters += '&action=' + action + this.inputData;
|
ajaxDim.options.parameters = $H(ajaxDim.options.parameters).merge({action: action, id: id}).merge(this.inputData.toQueryParams());
|
||||||
ajaxDim.request(ajaxDim.url);
|
ajaxDim.request(ajaxDim.url);
|
||||||
this.store(action, idName);
|
this.store(actionId, idName);
|
||||||
this.dimItem( idName, dimClass );
|
this.dimItem( idName, dimClass );
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of this software and associated documentation files (the
|
a copy of this software and associated documentation files (the
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
// script.aculo.us builder.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||||
|
|
||||||
|
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||||
//
|
//
|
||||||
// See scriptaculous.js for full license.
|
// script.aculo.us is freely distributable under the terms of an MIT-style license.
|
||||||
|
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||||
|
|
||||||
var Builder = {
|
var Builder = {
|
||||||
NODEMAP: {
|
NODEMAP: {
|
||||||
|
@ -33,7 +36,7 @@ var Builder = {
|
||||||
var element = parentElement.firstChild || null;
|
var element = parentElement.firstChild || null;
|
||||||
|
|
||||||
// see if browser added wrapping tags
|
// see if browser added wrapping tags
|
||||||
if(element && (element.tagName != elementName))
|
if(element && (element.tagName.toUpperCase() != elementName))
|
||||||
element = element.getElementsByTagName(elementName)[0];
|
element = element.getElementsByTagName(elementName)[0];
|
||||||
|
|
||||||
// fallback to createElement approach
|
// fallback to createElement approach
|
||||||
|
@ -61,7 +64,7 @@ var Builder = {
|
||||||
for(attr in arguments[1])
|
for(attr in arguments[1])
|
||||||
element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
|
element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
|
||||||
}
|
}
|
||||||
if(element.tagName != elementName)
|
if(element.tagName.toUpperCase() != elementName)
|
||||||
element = parentElement.getElementsByTagName(elementName)[0];
|
element = parentElement.getElementsByTagName(elementName)[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,10 +78,16 @@ var Builder = {
|
||||||
_text: function(text) {
|
_text: function(text) {
|
||||||
return document.createTextNode(text);
|
return document.createTextNode(text);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
ATTR_MAP: {
|
||||||
|
'className': 'class',
|
||||||
|
'htmlFor': 'for'
|
||||||
|
},
|
||||||
|
|
||||||
_attributes: function(attributes) {
|
_attributes: function(attributes) {
|
||||||
var attrs = [];
|
var attrs = [];
|
||||||
for(attribute in attributes)
|
for(attribute in attributes)
|
||||||
attrs.push((attribute=='className' ? 'class' : attribute) +
|
attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
|
||||||
'="' + attributes[attribute].toString().escapeHTML() + '"');
|
'="' + attributes[attribute].toString().escapeHTML() + '"');
|
||||||
return attrs.join(" ");
|
return attrs.join(" ");
|
||||||
},
|
},
|
||||||
|
@ -97,5 +106,26 @@ var Builder = {
|
||||||
},
|
},
|
||||||
_isStringOrNumber: function(param) {
|
_isStringOrNumber: function(param) {
|
||||||
return(typeof param=='string' || typeof param=='number');
|
return(typeof param=='string' || typeof param=='number');
|
||||||
|
},
|
||||||
|
build: function(html) {
|
||||||
|
var element = this.node('div');
|
||||||
|
$(element).update(html.strip());
|
||||||
|
return element.down();
|
||||||
|
},
|
||||||
|
dump: function(scope) {
|
||||||
|
if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
|
||||||
|
|
||||||
|
var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
|
||||||
|
"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
|
||||||
|
"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
|
||||||
|
"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
|
||||||
|
"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
|
||||||
|
"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
|
||||||
|
|
||||||
|
tags.each( function(tag){
|
||||||
|
scope[tag] = function() {
|
||||||
|
return Builder.node.apply(Builder, [tag].concat($A(arguments)));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,12 +1,15 @@
|
||||||
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
// script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||||
// (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
|
|
||||||
// (c) 2005 Jon Tirsen (http://www.tirsen.com)
|
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||||
|
// (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
|
||||||
|
// (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
|
||||||
// Contributors:
|
// Contributors:
|
||||||
// Richard Livsey
|
// Richard Livsey
|
||||||
// Rahul Bhargava
|
// Rahul Bhargava
|
||||||
// Rob Wills
|
// Rob Wills
|
||||||
//
|
//
|
||||||
// See scriptaculous.js for full license.
|
// script.aculo.us is freely distributable under the terms of an MIT-style license.
|
||||||
|
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||||
|
|
||||||
// Autocompleter.Base handles all the autocompletion functionality
|
// Autocompleter.Base handles all the autocompletion functionality
|
||||||
// that's independent of the data source for autocompletion. This
|
// that's independent of the data source for autocompletion. This
|
||||||
|
@ -33,6 +36,9 @@
|
||||||
// useful when one of the tokens is \n (a newline), as it
|
// useful when one of the tokens is \n (a newline), as it
|
||||||
// allows smart autocompletion after linebreaks.
|
// allows smart autocompletion after linebreaks.
|
||||||
|
|
||||||
|
if(typeof Effect == 'undefined')
|
||||||
|
throw("controls.js requires including script.aculo.us' effects.js library");
|
||||||
|
|
||||||
var Autocompleter = {}
|
var Autocompleter = {}
|
||||||
Autocompleter.Base = function() {};
|
Autocompleter.Base = function() {};
|
||||||
Autocompleter.Base.prototype = {
|
Autocompleter.Base.prototype = {
|
||||||
|
@ -45,7 +51,7 @@ Autocompleter.Base.prototype = {
|
||||||
this.index = 0;
|
this.index = 0;
|
||||||
this.entryCount = 0;
|
this.entryCount = 0;
|
||||||
|
|
||||||
if (this.setOptions)
|
if(this.setOptions)
|
||||||
this.setOptions(options);
|
this.setOptions(options);
|
||||||
else
|
else
|
||||||
this.options = options || {};
|
this.options = options || {};
|
||||||
|
@ -55,17 +61,20 @@ Autocompleter.Base.prototype = {
|
||||||
this.options.frequency = this.options.frequency || 0.4;
|
this.options.frequency = this.options.frequency || 0.4;
|
||||||
this.options.minChars = this.options.minChars || 1;
|
this.options.minChars = this.options.minChars || 1;
|
||||||
this.options.onShow = this.options.onShow ||
|
this.options.onShow = this.options.onShow ||
|
||||||
function(element, update){
|
function(element, update){
|
||||||
if(!update.style.position || update.style.position=='absolute') {
|
if(!update.style.position || update.style.position=='absolute') {
|
||||||
update.style.position = 'absolute';
|
update.style.position = 'absolute';
|
||||||
Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight});
|
Position.clone(element, update, {
|
||||||
}
|
setHeight: false,
|
||||||
Effect.Appear(update,{duration:0.15});
|
offsetTop: element.offsetHeight
|
||||||
};
|
});
|
||||||
|
}
|
||||||
|
Effect.Appear(update,{duration:0.15});
|
||||||
|
};
|
||||||
this.options.onHide = this.options.onHide ||
|
this.options.onHide = this.options.onHide ||
|
||||||
function(element, update){ new Effect.Fade(update,{duration:0.15}) };
|
function(element, update){ new Effect.Fade(update,{duration:0.15}) };
|
||||||
|
|
||||||
if (typeof(this.options.tokens) == 'string')
|
if(typeof(this.options.tokens) == 'string')
|
||||||
this.options.tokens = new Array(this.options.tokens);
|
this.options.tokens = new Array(this.options.tokens);
|
||||||
|
|
||||||
this.observer = null;
|
this.observer = null;
|
||||||
|
@ -94,7 +103,7 @@ Autocompleter.Base.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
fixIEOverlapping: function() {
|
fixIEOverlapping: function() {
|
||||||
Position.clone(this.update, this.iefix);
|
Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
|
||||||
this.iefix.style.zIndex = 1;
|
this.iefix.style.zIndex = 1;
|
||||||
this.update.style.zIndex = 2;
|
this.update.style.zIndex = 2;
|
||||||
Element.show(this.iefix);
|
Element.show(this.iefix);
|
||||||
|
@ -202,11 +211,13 @@ Autocompleter.Base.prototype = {
|
||||||
markPrevious: function() {
|
markPrevious: function() {
|
||||||
if(this.index > 0) this.index--
|
if(this.index > 0) this.index--
|
||||||
else this.index = this.entryCount-1;
|
else this.index = this.entryCount-1;
|
||||||
|
this.getEntry(this.index).scrollIntoView(true);
|
||||||
},
|
},
|
||||||
|
|
||||||
markNext: function() {
|
markNext: function() {
|
||||||
if(this.index < this.entryCount-1) this.index++
|
if(this.index < this.entryCount-1) this.index++
|
||||||
else this.index = 0;
|
else this.index = 0;
|
||||||
|
this.getEntry(this.index).scrollIntoView(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
getEntry: function(index) {
|
getEntry: function(index) {
|
||||||
|
@ -254,11 +265,11 @@ Autocompleter.Base.prototype = {
|
||||||
if(!this.changed && this.hasFocus) {
|
if(!this.changed && this.hasFocus) {
|
||||||
this.update.innerHTML = choices;
|
this.update.innerHTML = choices;
|
||||||
Element.cleanWhitespace(this.update);
|
Element.cleanWhitespace(this.update);
|
||||||
Element.cleanWhitespace(this.update.firstChild);
|
Element.cleanWhitespace(this.update.down());
|
||||||
|
|
||||||
if(this.update.firstChild && this.update.firstChild.childNodes) {
|
if(this.update.firstChild && this.update.down().childNodes) {
|
||||||
this.entryCount =
|
this.entryCount =
|
||||||
this.update.firstChild.childNodes.length;
|
this.update.down().childNodes.length;
|
||||||
for (var i = 0; i < this.entryCount; i++) {
|
for (var i = 0; i < this.entryCount; i++) {
|
||||||
var entry = this.getEntry(i);
|
var entry = this.getEntry(i);
|
||||||
entry.autocompleteIndex = i;
|
entry.autocompleteIndex = i;
|
||||||
|
@ -269,9 +280,14 @@ Autocompleter.Base.prototype = {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.stopIndicator();
|
this.stopIndicator();
|
||||||
|
|
||||||
this.index = 0;
|
this.index = 0;
|
||||||
this.render();
|
|
||||||
|
if(this.entryCount==1 && this.options.autoSelect) {
|
||||||
|
this.selectEntry();
|
||||||
|
this.hide();
|
||||||
|
} else {
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -459,6 +475,7 @@ Ajax.InPlaceEditor.prototype = {
|
||||||
this.element = $(element);
|
this.element = $(element);
|
||||||
|
|
||||||
this.options = Object.extend({
|
this.options = Object.extend({
|
||||||
|
paramName: "value",
|
||||||
okButton: true,
|
okButton: true,
|
||||||
okText: "ok",
|
okText: "ok",
|
||||||
cancelLink: true,
|
cancelLink: true,
|
||||||
|
@ -531,7 +548,7 @@ Ajax.InPlaceEditor.prototype = {
|
||||||
Element.hide(this.element);
|
Element.hide(this.element);
|
||||||
this.createForm();
|
this.createForm();
|
||||||
this.element.parentNode.insertBefore(this.form, this.element);
|
this.element.parentNode.insertBefore(this.form, this.element);
|
||||||
Field.scrollFreeActivate(this.editField);
|
if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
|
||||||
// stop the event to avoid a page refresh in Safari
|
// stop the event to avoid a page refresh in Safari
|
||||||
if (evt) {
|
if (evt) {
|
||||||
Event.stop(evt);
|
Event.stop(evt);
|
||||||
|
@ -590,7 +607,7 @@ Ajax.InPlaceEditor.prototype = {
|
||||||
var textField = document.createElement("input");
|
var textField = document.createElement("input");
|
||||||
textField.obj = this;
|
textField.obj = this;
|
||||||
textField.type = "text";
|
textField.type = "text";
|
||||||
textField.name = "value";
|
textField.name = this.options.paramName;
|
||||||
textField.value = text;
|
textField.value = text;
|
||||||
textField.style.backgroundColor = this.options.highlightcolor;
|
textField.style.backgroundColor = this.options.highlightcolor;
|
||||||
textField.className = 'editor_field';
|
textField.className = 'editor_field';
|
||||||
|
@ -603,7 +620,7 @@ Ajax.InPlaceEditor.prototype = {
|
||||||
this.options.textarea = true;
|
this.options.textarea = true;
|
||||||
var textArea = document.createElement("textarea");
|
var textArea = document.createElement("textarea");
|
||||||
textArea.obj = this;
|
textArea.obj = this;
|
||||||
textArea.name = "value";
|
textArea.name = this.options.paramName;
|
||||||
textArea.value = this.convertHTMLLineBreaks(text);
|
textArea.value = this.convertHTMLLineBreaks(text);
|
||||||
textArea.rows = this.options.rows;
|
textArea.rows = this.options.rows;
|
||||||
textArea.cols = this.options.cols || 40;
|
textArea.cols = this.options.cols || 40;
|
||||||
|
@ -636,6 +653,7 @@ Ajax.InPlaceEditor.prototype = {
|
||||||
Element.removeClassName(this.form, this.options.loadingClassName);
|
Element.removeClassName(this.form, this.options.loadingClassName);
|
||||||
this.editField.disabled = false;
|
this.editField.disabled = false;
|
||||||
this.editField.value = transport.responseText.stripTags();
|
this.editField.value = transport.responseText.stripTags();
|
||||||
|
Field.scrollFreeActivate(this.editField);
|
||||||
},
|
},
|
||||||
onclickCancel: function() {
|
onclickCancel: function() {
|
||||||
this.onComplete();
|
this.onComplete();
|
||||||
|
@ -772,6 +790,8 @@ Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
|
||||||
collection.each(function(e,i) {
|
collection.each(function(e,i) {
|
||||||
optionTag = document.createElement("option");
|
optionTag = document.createElement("option");
|
||||||
optionTag.value = (e instanceof Array) ? e[0] : e;
|
optionTag.value = (e instanceof Array) ? e[0] : e;
|
||||||
|
if((typeof this.options.value == 'undefined') &&
|
||||||
|
((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
|
||||||
if(this.options.value==optionTag.value) optionTag.selected = true;
|
if(this.options.value==optionTag.value) optionTag.selected = true;
|
||||||
optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
|
optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
|
||||||
selectTag.appendChild(optionTag);
|
selectTag.appendChild(optionTag);
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
// script.aculo.us dragdrop.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||||
// (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
|
|
||||||
//
|
|
||||||
// See scriptaculous.js for full license.
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||||
|
// (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
|
||||||
|
//
|
||||||
|
// script.aculo.us is freely distributable under the terms of an MIT-style license.
|
||||||
|
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||||
|
|
||||||
|
if(typeof Effect == 'undefined')
|
||||||
|
throw("dragdrop.js requires including script.aculo.us' effects.js library");
|
||||||
|
|
||||||
var Droppables = {
|
var Droppables = {
|
||||||
drops: [],
|
drops: [],
|
||||||
|
@ -145,8 +149,16 @@ var Draggables = {
|
||||||
},
|
},
|
||||||
|
|
||||||
activate: function(draggable) {
|
activate: function(draggable) {
|
||||||
window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
|
if(draggable.options.delay) {
|
||||||
this.activeDraggable = draggable;
|
this._timeout = setTimeout(function() {
|
||||||
|
Draggables._timeout = null;
|
||||||
|
window.focus();
|
||||||
|
Draggables.activeDraggable = draggable;
|
||||||
|
}.bind(this), draggable.options.delay);
|
||||||
|
} else {
|
||||||
|
window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
|
||||||
|
this.activeDraggable = draggable;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
deactivate: function() {
|
deactivate: function() {
|
||||||
|
@ -160,10 +172,15 @@ var Draggables = {
|
||||||
// the same coordinates, prevent needless redrawing (moz bug?)
|
// the same coordinates, prevent needless redrawing (moz bug?)
|
||||||
if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
|
if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
|
||||||
this._lastPointer = pointer;
|
this._lastPointer = pointer;
|
||||||
|
|
||||||
this.activeDraggable.updateDrag(event, pointer);
|
this.activeDraggable.updateDrag(event, pointer);
|
||||||
},
|
},
|
||||||
|
|
||||||
endDrag: function(event) {
|
endDrag: function(event) {
|
||||||
|
if(this._timeout) {
|
||||||
|
clearTimeout(this._timeout);
|
||||||
|
this._timeout = null;
|
||||||
|
}
|
||||||
if(!this.activeDraggable) return;
|
if(!this.activeDraggable) return;
|
||||||
this._lastPointer = null;
|
this._lastPointer = null;
|
||||||
this.activeDraggable.endDrag(event);
|
this.activeDraggable.endDrag(event);
|
||||||
|
@ -190,6 +207,7 @@ var Draggables = {
|
||||||
this.observers.each( function(o) {
|
this.observers.each( function(o) {
|
||||||
if(o[eventName]) o[eventName](eventName, draggable, event);
|
if(o[eventName]) o[eventName](eventName, draggable, event);
|
||||||
});
|
});
|
||||||
|
if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
|
||||||
},
|
},
|
||||||
|
|
||||||
_cacheObserverCallbacks: function() {
|
_cacheObserverCallbacks: function() {
|
||||||
|
@ -204,41 +222,59 @@ var Draggables = {
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
var Draggable = Class.create();
|
var Draggable = Class.create();
|
||||||
|
Draggable._dragging = {};
|
||||||
|
|
||||||
Draggable.prototype = {
|
Draggable.prototype = {
|
||||||
initialize: function(element) {
|
initialize: function(element) {
|
||||||
var options = Object.extend({
|
var defaults = {
|
||||||
handle: false,
|
handle: false,
|
||||||
starteffect: function(element) {
|
|
||||||
element._opacity = Element.getOpacity(element);
|
|
||||||
new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
|
|
||||||
},
|
|
||||||
reverteffect: function(element, top_offset, left_offset) {
|
reverteffect: function(element, top_offset, left_offset) {
|
||||||
var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
|
var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
|
||||||
element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur});
|
new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
|
||||||
|
queue: {scope:'_draggable', position:'end'}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
endeffect: function(element) {
|
endeffect: function(element) {
|
||||||
var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0
|
var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
|
||||||
new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity});
|
new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
|
||||||
|
queue: {scope:'_draggable', position:'end'},
|
||||||
|
afterFinish: function(){
|
||||||
|
Draggable._dragging[element] = false
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
zindex: 1000,
|
zindex: 1000,
|
||||||
revert: false,
|
revert: false,
|
||||||
scroll: false,
|
scroll: false,
|
||||||
scrollSensitivity: 20,
|
scrollSensitivity: 20,
|
||||||
scrollSpeed: 15,
|
scrollSpeed: 15,
|
||||||
snap: false // false, or xy or [x,y] or function(x,y){ return [x,y] }
|
snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
|
||||||
}, arguments[1] || {});
|
delay: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!arguments[1] || typeof arguments[1].endeffect == 'undefined')
|
||||||
|
Object.extend(defaults, {
|
||||||
|
starteffect: function(element) {
|
||||||
|
element._opacity = Element.getOpacity(element);
|
||||||
|
Draggable._dragging[element] = true;
|
||||||
|
new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var options = Object.extend(defaults, arguments[1] || {});
|
||||||
|
|
||||||
this.element = $(element);
|
this.element = $(element);
|
||||||
|
|
||||||
if(options.handle && (typeof options.handle == 'string')) {
|
if(options.handle && (typeof options.handle == 'string'))
|
||||||
var h = Element.childrenWithClassName(this.element, options.handle, true);
|
this.handle = this.element.down('.'+options.handle, 0);
|
||||||
if(h.length>0) this.handle = h[0];
|
|
||||||
}
|
|
||||||
if(!this.handle) this.handle = $(options.handle);
|
if(!this.handle) this.handle = $(options.handle);
|
||||||
if(!this.handle) this.handle = this.element;
|
if(!this.handle) this.handle = this.element;
|
||||||
|
|
||||||
if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML)
|
if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
|
||||||
options.scroll = $(options.scroll);
|
options.scroll = $(options.scroll);
|
||||||
|
this._isScrollChild = Element.childOf(this.element, options.scroll);
|
||||||
|
}
|
||||||
|
|
||||||
Element.makePositioned(this.element); // fix IE
|
Element.makePositioned(this.element); // fix IE
|
||||||
|
|
||||||
|
@ -264,20 +300,17 @@ Draggable.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
initDrag: function(event) {
|
initDrag: function(event) {
|
||||||
|
if(typeof Draggable._dragging[this.element] != 'undefined' &&
|
||||||
|
Draggable._dragging[this.element]) return;
|
||||||
if(Event.isLeftClick(event)) {
|
if(Event.isLeftClick(event)) {
|
||||||
// abort on form elements, fixes a Firefox issue
|
// abort on form elements, fixes a Firefox issue
|
||||||
var src = Event.element(event);
|
var src = Event.element(event);
|
||||||
if(src.tagName && (
|
if((tag_name = src.tagName.toUpperCase()) && (
|
||||||
src.tagName=='INPUT' ||
|
tag_name=='INPUT' ||
|
||||||
src.tagName=='SELECT' ||
|
tag_name=='SELECT' ||
|
||||||
src.tagName=='OPTION' ||
|
tag_name=='OPTION' ||
|
||||||
src.tagName=='BUTTON' ||
|
tag_name=='BUTTON' ||
|
||||||
src.tagName=='TEXTAREA')) return;
|
tag_name=='TEXTAREA')) return;
|
||||||
|
|
||||||
if(this.element._revert) {
|
|
||||||
this.element._revert.cancel();
|
|
||||||
this.element._revert = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||||
var pos = Position.cumulativeOffset(this.element);
|
var pos = Position.cumulativeOffset(this.element);
|
||||||
|
@ -314,6 +347,7 @@ Draggable.prototype = {
|
||||||
}
|
}
|
||||||
|
|
||||||
Draggables.notify('onStart', this, event);
|
Draggables.notify('onStart', this, event);
|
||||||
|
|
||||||
if(this.options.starteffect) this.options.starteffect(this.element);
|
if(this.options.starteffect) this.options.starteffect(this.element);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -322,6 +356,7 @@ Draggable.prototype = {
|
||||||
Position.prepare();
|
Position.prepare();
|
||||||
Droppables.show(pointer, this.element);
|
Droppables.show(pointer, this.element);
|
||||||
Draggables.notify('onDrag', this, event);
|
Draggables.notify('onDrag', this, event);
|
||||||
|
|
||||||
this.draw(pointer);
|
this.draw(pointer);
|
||||||
if(this.options.change) this.options.change(this);
|
if(this.options.change) this.options.change(this);
|
||||||
|
|
||||||
|
@ -333,8 +368,8 @@ Draggable.prototype = {
|
||||||
with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
|
with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
|
||||||
} else {
|
} else {
|
||||||
p = Position.page(this.options.scroll);
|
p = Position.page(this.options.scroll);
|
||||||
p[0] += this.options.scroll.scrollLeft;
|
p[0] += this.options.scroll.scrollLeft + Position.deltaX;
|
||||||
p[1] += this.options.scroll.scrollTop;
|
p[1] += this.options.scroll.scrollTop + Position.deltaY;
|
||||||
p.push(p[0]+this.options.scroll.offsetWidth);
|
p.push(p[0]+this.options.scroll.offsetWidth);
|
||||||
p.push(p[1]+this.options.scroll.offsetHeight);
|
p.push(p[1]+this.options.scroll.offsetHeight);
|
||||||
}
|
}
|
||||||
|
@ -400,10 +435,15 @@ Draggable.prototype = {
|
||||||
|
|
||||||
draw: function(point) {
|
draw: function(point) {
|
||||||
var pos = Position.cumulativeOffset(this.element);
|
var pos = Position.cumulativeOffset(this.element);
|
||||||
|
if(this.options.ghosting) {
|
||||||
|
var r = Position.realOffset(this.element);
|
||||||
|
pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
|
||||||
|
}
|
||||||
|
|
||||||
var d = this.currentDelta();
|
var d = this.currentDelta();
|
||||||
pos[0] -= d[0]; pos[1] -= d[1];
|
pos[0] -= d[0]; pos[1] -= d[1];
|
||||||
|
|
||||||
if(this.options.scroll && (this.options.scroll != window)) {
|
if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
|
||||||
pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
|
pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
|
||||||
pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
|
pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
|
||||||
}
|
}
|
||||||
|
@ -430,6 +470,7 @@ Draggable.prototype = {
|
||||||
style.left = p[0] + "px";
|
style.left = p[0] + "px";
|
||||||
if((!this.options.constraint) || (this.options.constraint=='vertical'))
|
if((!this.options.constraint) || (this.options.constraint=='vertical'))
|
||||||
style.top = p[1] + "px";
|
style.top = p[1] + "px";
|
||||||
|
|
||||||
if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
|
if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -442,6 +483,7 @@ Draggable.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
startScrolling: function(speed) {
|
startScrolling: function(speed) {
|
||||||
|
if(!(speed[0] || speed[1])) return;
|
||||||
this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
|
this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
|
||||||
this.lastScrolled = new Date();
|
this.lastScrolled = new Date();
|
||||||
this.scrollInterval = setInterval(this.scroll.bind(this), 10);
|
this.scrollInterval = setInterval(this.scroll.bind(this), 10);
|
||||||
|
@ -466,14 +508,16 @@ Draggable.prototype = {
|
||||||
Position.prepare();
|
Position.prepare();
|
||||||
Droppables.show(Draggables._lastPointer, this.element);
|
Droppables.show(Draggables._lastPointer, this.element);
|
||||||
Draggables.notify('onDrag', this);
|
Draggables.notify('onDrag', this);
|
||||||
Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
|
if (this._isScrollChild) {
|
||||||
Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
|
Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
|
||||||
Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
|
Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
|
||||||
if (Draggables._lastScrollPointer[0] < 0)
|
Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
|
||||||
Draggables._lastScrollPointer[0] = 0;
|
if (Draggables._lastScrollPointer[0] < 0)
|
||||||
if (Draggables._lastScrollPointer[1] < 0)
|
Draggables._lastScrollPointer[0] = 0;
|
||||||
Draggables._lastScrollPointer[1] = 0;
|
if (Draggables._lastScrollPointer[1] < 0)
|
||||||
this.draw(Draggables._lastScrollPointer);
|
Draggables._lastScrollPointer[1] = 0;
|
||||||
|
this.draw(Draggables._lastScrollPointer);
|
||||||
|
}
|
||||||
|
|
||||||
if(this.options.change) this.options.change(this);
|
if(this.options.change) this.options.change(this);
|
||||||
},
|
},
|
||||||
|
@ -525,10 +569,12 @@ SortableObserver.prototype = {
|
||||||
}
|
}
|
||||||
|
|
||||||
var Sortable = {
|
var Sortable = {
|
||||||
|
SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
|
||||||
|
|
||||||
sortables: {},
|
sortables: {},
|
||||||
|
|
||||||
_findRootElement: function(element) {
|
_findRootElement: function(element) {
|
||||||
while (element.tagName != "BODY") {
|
while (element.tagName.toUpperCase() != "BODY") {
|
||||||
if(element.id && Sortable.sortables[element.id]) return element;
|
if(element.id && Sortable.sortables[element.id]) return element;
|
||||||
element = element.parentNode;
|
element = element.parentNode;
|
||||||
}
|
}
|
||||||
|
@ -565,12 +611,13 @@ var Sortable = {
|
||||||
containment: element, // also takes array of elements (or id's); or false
|
containment: element, // also takes array of elements (or id's); or false
|
||||||
handle: false, // or a CSS class
|
handle: false, // or a CSS class
|
||||||
only: false,
|
only: false,
|
||||||
|
delay: 0,
|
||||||
hoverclass: null,
|
hoverclass: null,
|
||||||
ghosting: false,
|
ghosting: false,
|
||||||
scroll: false,
|
scroll: false,
|
||||||
scrollSensitivity: 20,
|
scrollSensitivity: 20,
|
||||||
scrollSpeed: 15,
|
scrollSpeed: 15,
|
||||||
format: /^[^_]*_(.*)$/,
|
format: this.SERIALIZE_RULE,
|
||||||
onChange: Prototype.emptyFunction,
|
onChange: Prototype.emptyFunction,
|
||||||
onUpdate: Prototype.emptyFunction
|
onUpdate: Prototype.emptyFunction
|
||||||
}, arguments[1] || {});
|
}, arguments[1] || {});
|
||||||
|
@ -584,6 +631,7 @@ var Sortable = {
|
||||||
scroll: options.scroll,
|
scroll: options.scroll,
|
||||||
scrollSpeed: options.scrollSpeed,
|
scrollSpeed: options.scrollSpeed,
|
||||||
scrollSensitivity: options.scrollSensitivity,
|
scrollSensitivity: options.scrollSensitivity,
|
||||||
|
delay: options.delay,
|
||||||
ghosting: options.ghosting,
|
ghosting: options.ghosting,
|
||||||
constraint: options.constraint,
|
constraint: options.constraint,
|
||||||
handle: options.handle };
|
handle: options.handle };
|
||||||
|
@ -612,7 +660,6 @@ var Sortable = {
|
||||||
tree: options.tree,
|
tree: options.tree,
|
||||||
hoverclass: options.hoverclass,
|
hoverclass: options.hoverclass,
|
||||||
onHover: Sortable.onHover
|
onHover: Sortable.onHover
|
||||||
//greedy: !options.dropOnEmpty
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var options_for_tree = {
|
var options_for_tree = {
|
||||||
|
@ -637,7 +684,7 @@ var Sortable = {
|
||||||
(this.findElements(element, options) || []).each( function(e) {
|
(this.findElements(element, options) || []).each( function(e) {
|
||||||
// handles are per-draggable
|
// handles are per-draggable
|
||||||
var handle = options.handle ?
|
var handle = options.handle ?
|
||||||
Element.childrenWithClassName(e, options.handle)[0] : e;
|
$(e).down('.'+options.handle,0) : e;
|
||||||
options.draggables.push(
|
options.draggables.push(
|
||||||
new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
|
new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
|
||||||
Droppables.add(e, options_for_droppable);
|
Droppables.add(e, options_for_droppable);
|
||||||
|
@ -708,7 +755,7 @@ var Sortable = {
|
||||||
if(!Element.isParent(dropon, element)) {
|
if(!Element.isParent(dropon, element)) {
|
||||||
var index;
|
var index;
|
||||||
|
|
||||||
var children = Sortable.findElements(dropon, {tag: droponOptions.tag});
|
var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
|
||||||
var child = null;
|
var child = null;
|
||||||
|
|
||||||
if(children) {
|
if(children) {
|
||||||
|
@ -735,7 +782,7 @@ var Sortable = {
|
||||||
},
|
},
|
||||||
|
|
||||||
unmark: function() {
|
unmark: function() {
|
||||||
if(Sortable._marker) Element.hide(Sortable._marker);
|
if(Sortable._marker) Sortable._marker.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
mark: function(dropon, position) {
|
mark: function(dropon, position) {
|
||||||
|
@ -744,23 +791,21 @@ var Sortable = {
|
||||||
if(sortable && !sortable.ghosting) return;
|
if(sortable && !sortable.ghosting) return;
|
||||||
|
|
||||||
if(!Sortable._marker) {
|
if(!Sortable._marker) {
|
||||||
Sortable._marker = $('dropmarker') || document.createElement('DIV');
|
Sortable._marker =
|
||||||
Element.hide(Sortable._marker);
|
($('dropmarker') || Element.extend(document.createElement('DIV'))).
|
||||||
Element.addClassName(Sortable._marker, 'dropmarker');
|
hide().addClassName('dropmarker').setStyle({position:'absolute'});
|
||||||
Sortable._marker.style.position = 'absolute';
|
|
||||||
document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
|
document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
|
||||||
}
|
}
|
||||||
var offsets = Position.cumulativeOffset(dropon);
|
var offsets = Position.cumulativeOffset(dropon);
|
||||||
Sortable._marker.style.left = offsets[0] + 'px';
|
Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
|
||||||
Sortable._marker.style.top = offsets[1] + 'px';
|
|
||||||
|
|
||||||
if(position=='after')
|
if(position=='after')
|
||||||
if(sortable.overlap == 'horizontal')
|
if(sortable.overlap == 'horizontal')
|
||||||
Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
|
Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
|
||||||
else
|
else
|
||||||
Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
|
Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
|
||||||
|
|
||||||
Element.show(Sortable._marker);
|
Sortable._marker.show();
|
||||||
},
|
},
|
||||||
|
|
||||||
_tree: function(element, options, parent) {
|
_tree: function(element, options, parent) {
|
||||||
|
@ -775,9 +820,9 @@ var Sortable = {
|
||||||
id: encodeURIComponent(match ? match[1] : null),
|
id: encodeURIComponent(match ? match[1] : null),
|
||||||
element: element,
|
element: element,
|
||||||
parent: parent,
|
parent: parent,
|
||||||
children: new Array,
|
children: [],
|
||||||
position: parent.children.length,
|
position: parent.children.length,
|
||||||
container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())
|
container: $(children[i]).down(options.treeTag)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the element containing the children and recurse over it */
|
/* Get the element containing the children and recurse over it */
|
||||||
|
@ -790,17 +835,6 @@ var Sortable = {
|
||||||
return parent;
|
return parent;
|
||||||
},
|
},
|
||||||
|
|
||||||
/* Finds the first element of the given tag type within a parent element.
|
|
||||||
Used for finding the first LI[ST] within a L[IST]I[TEM].*/
|
|
||||||
_findChildrenElement: function (element, containerTag) {
|
|
||||||
if (element && element.hasChildNodes)
|
|
||||||
for (var i = 0; i < element.childNodes.length; ++i)
|
|
||||||
if (element.childNodes[i].tagName == containerTag)
|
|
||||||
return element.childNodes[i];
|
|
||||||
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
|
|
||||||
tree: function(element) {
|
tree: function(element) {
|
||||||
element = $(element);
|
element = $(element);
|
||||||
var sortableOptions = this.options(element);
|
var sortableOptions = this.options(element);
|
||||||
|
@ -815,12 +849,12 @@ var Sortable = {
|
||||||
var root = {
|
var root = {
|
||||||
id: null,
|
id: null,
|
||||||
parent: null,
|
parent: null,
|
||||||
children: new Array,
|
children: [],
|
||||||
container: element,
|
container: element,
|
||||||
position: 0
|
position: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
return Sortable._tree (element, options, root);
|
return Sortable._tree(element, options, root);
|
||||||
},
|
},
|
||||||
|
|
||||||
/* Construct a [i] index for a particular node */
|
/* Construct a [i] index for a particular node */
|
||||||
|
@ -869,7 +903,7 @@ var Sortable = {
|
||||||
|
|
||||||
if (options.tree) {
|
if (options.tree) {
|
||||||
return Sortable.tree(element, arguments[1]).children.map( function (item) {
|
return Sortable.tree(element, arguments[1]).children.map( function (item) {
|
||||||
return [name + Sortable._constructIndex(item) + "=" +
|
return [name + Sortable._constructIndex(item) + "[id]=" +
|
||||||
encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
|
encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
|
||||||
}).flatten().join('&');
|
}).flatten().join('&');
|
||||||
} else {
|
} else {
|
||||||
|
@ -880,12 +914,10 @@ var Sortable = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns true if child is contained within element */
|
// Returns true if child is contained within element
|
||||||
Element.isParent = function(child, element) {
|
Element.isParent = function(child, element) {
|
||||||
if (!child.parentNode || child == element) return false;
|
if (!child.parentNode || child == element) return false;
|
||||||
|
|
||||||
if (child.parentNode == element) return true;
|
if (child.parentNode == element) return true;
|
||||||
|
|
||||||
return Element.isParent(child.parentNode, element);
|
return Element.isParent(child.parentNode, element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -908,8 +940,5 @@ Element.findChildren = function(element, only, recursive, tagName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Element.offsetSize = function (element, type) {
|
Element.offsetSize = function (element, type) {
|
||||||
if (type == 'vertical' || type == 'height')
|
return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
|
||||||
return element.offsetHeight;
|
|
||||||
else
|
|
||||||
return element.offsetWidth;
|
|
||||||
}
|
}
|
|
@ -1,10 +1,13 @@
|
||||||
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||||
|
|
||||||
|
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||||
// Contributors:
|
// Contributors:
|
||||||
// Justin Palmer (http://encytemedia.com/)
|
// Justin Palmer (http://encytemedia.com/)
|
||||||
// Mark Pilgrim (http://diveintomark.org/)
|
// Mark Pilgrim (http://diveintomark.org/)
|
||||||
// Martin Bialasinki
|
// Martin Bialasinki
|
||||||
//
|
//
|
||||||
// See scriptaculous.js for full license.
|
// script.aculo.us is freely distributable under the terms of an MIT-style license.
|
||||||
|
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||||
|
|
||||||
// converts rgb() and #xxx to #xxxxxx format,
|
// converts rgb() and #xxx to #xxxxxx format,
|
||||||
// returns self (or first argument) if not convertable
|
// returns self (or first argument) if not convertable
|
||||||
|
@ -41,50 +44,23 @@ Element.collectTextNodesIgnoreClass = function(element, className) {
|
||||||
|
|
||||||
Element.setContentZoom = function(element, percent) {
|
Element.setContentZoom = function(element, percent) {
|
||||||
element = $(element);
|
element = $(element);
|
||||||
Element.setStyle(element, {fontSize: (percent/100) + 'em'});
|
element.setStyle({fontSize: (percent/100) + 'em'});
|
||||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
||||||
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
Element.getOpacity = function(element){
|
Element.getOpacity = function(element){
|
||||||
var opacity;
|
return $(element).getStyle('opacity');
|
||||||
if (opacity = Element.getStyle(element, 'opacity'))
|
|
||||||
return parseFloat(opacity);
|
|
||||||
if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))
|
|
||||||
if(opacity[1]) return parseFloat(opacity[1]) / 100;
|
|
||||||
return 1.0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Element.setOpacity = function(element, value){
|
Element.setOpacity = function(element, value){
|
||||||
element= $(element);
|
return $(element).setStyle({opacity:value});
|
||||||
if (value == 1){
|
|
||||||
Element.setStyle(element, { opacity:
|
|
||||||
(/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?
|
|
||||||
0.999999 : null });
|
|
||||||
if(/MSIE/.test(navigator.userAgent))
|
|
||||||
Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});
|
|
||||||
} else {
|
|
||||||
if(value < 0.00001) value = 0;
|
|
||||||
Element.setStyle(element, {opacity: value});
|
|
||||||
if(/MSIE/.test(navigator.userAgent))
|
|
||||||
Element.setStyle(element,
|
|
||||||
{ filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
|
|
||||||
'alpha(opacity='+value*100+')' });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Element.getInlineOpacity = function(element){
|
Element.getInlineOpacity = function(element){
|
||||||
return $(element).style.opacity || '';
|
return $(element).style.opacity || '';
|
||||||
}
|
}
|
||||||
|
|
||||||
Element.childrenWithClassName = function(element, className, findFirst) {
|
|
||||||
var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
|
|
||||||
var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) {
|
|
||||||
return (c.className && c.className.match(classNameRegExp));
|
|
||||||
});
|
|
||||||
if(!results) results = [];
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
Element.forceRerendering = function(element) {
|
Element.forceRerendering = function(element) {
|
||||||
try {
|
try {
|
||||||
element = $(element);
|
element = $(element);
|
||||||
|
@ -104,9 +80,17 @@ Array.prototype.call = function() {
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
var Effect = {
|
var Effect = {
|
||||||
|
_elementDoesNotExistError: {
|
||||||
|
name: 'ElementDoesNotExistError',
|
||||||
|
message: 'The specified DOM element does not exist, but is required for this effect to operate'
|
||||||
|
},
|
||||||
tagifyText: function(element) {
|
tagifyText: function(element) {
|
||||||
|
if(typeof Builder == 'undefined')
|
||||||
|
throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
|
||||||
|
|
||||||
var tagifyStyle = 'position:relative';
|
var tagifyStyle = 'position:relative';
|
||||||
if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1';
|
if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
|
||||||
|
|
||||||
element = $(element);
|
element = $(element);
|
||||||
$A(element.childNodes).each( function(child) {
|
$A(element.childNodes).each( function(child) {
|
||||||
if(child.nodeType==3) {
|
if(child.nodeType==3) {
|
||||||
|
@ -159,33 +143,35 @@ var Effect2 = Effect; // deprecated
|
||||||
|
|
||||||
/* ------------- transitions ------------- */
|
/* ------------- transitions ------------- */
|
||||||
|
|
||||||
Effect.Transitions = {}
|
Effect.Transitions = {
|
||||||
|
linear: Prototype.K,
|
||||||
Effect.Transitions.linear = function(pos) {
|
sinoidal: function(pos) {
|
||||||
return pos;
|
return (-Math.cos(pos*Math.PI)/2) + 0.5;
|
||||||
}
|
},
|
||||||
Effect.Transitions.sinoidal = function(pos) {
|
reverse: function(pos) {
|
||||||
return (-Math.cos(pos*Math.PI)/2) + 0.5;
|
return 1-pos;
|
||||||
}
|
},
|
||||||
Effect.Transitions.reverse = function(pos) {
|
flicker: function(pos) {
|
||||||
return 1-pos;
|
return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
|
||||||
}
|
},
|
||||||
Effect.Transitions.flicker = function(pos) {
|
wobble: function(pos) {
|
||||||
return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
|
return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
|
||||||
}
|
},
|
||||||
Effect.Transitions.wobble = function(pos) {
|
pulse: function(pos, pulses) {
|
||||||
return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
|
pulses = pulses || 5;
|
||||||
}
|
return (
|
||||||
Effect.Transitions.pulse = function(pos) {
|
Math.round((pos % (1/pulses)) * pulses) == 0 ?
|
||||||
return (Math.floor(pos*10) % 2 == 0 ?
|
((pos * pulses * 2) - Math.floor(pos * pulses * 2)) :
|
||||||
(pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
|
1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
|
||||||
}
|
);
|
||||||
Effect.Transitions.none = function(pos) {
|
},
|
||||||
return 0;
|
none: function(pos) {
|
||||||
}
|
return 0;
|
||||||
Effect.Transitions.full = function(pos) {
|
},
|
||||||
return 1;
|
full: function(pos) {
|
||||||
}
|
return 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/* ------------- core effects ------------- */
|
/* ------------- core effects ------------- */
|
||||||
|
|
||||||
|
@ -212,6 +198,9 @@ Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
|
||||||
e.finishOn += effect.finishOn;
|
e.finishOn += effect.finishOn;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case 'with-last':
|
||||||
|
timestamp = this.effects.pluck('startOn').max() || timestamp;
|
||||||
|
break;
|
||||||
case 'end':
|
case 'end':
|
||||||
// start effect after last queued effect has finished
|
// start effect after last queued effect has finished
|
||||||
timestamp = this.effects.pluck('finishOn').max() || timestamp;
|
timestamp = this.effects.pluck('finishOn').max() || timestamp;
|
||||||
|
@ -225,7 +214,7 @@ Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
|
||||||
this.effects.push(effect);
|
this.effects.push(effect);
|
||||||
|
|
||||||
if(!this.interval)
|
if(!this.interval)
|
||||||
this.interval = setInterval(this.loop.bind(this), 40);
|
this.interval = setInterval(this.loop.bind(this), 15);
|
||||||
},
|
},
|
||||||
remove: function(effect) {
|
remove: function(effect) {
|
||||||
this.effects = this.effects.reject(function(e) { return e==effect });
|
this.effects = this.effects.reject(function(e) { return e==effect });
|
||||||
|
@ -236,7 +225,8 @@ Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
|
||||||
},
|
},
|
||||||
loop: function() {
|
loop: function() {
|
||||||
var timePos = new Date().getTime();
|
var timePos = new Date().getTime();
|
||||||
this.effects.invoke('loop', timePos);
|
for(var i=0, len=this.effects.length;i<len;i++)
|
||||||
|
if(this.effects[i]) this.effects[i].loop(timePos);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -256,7 +246,7 @@ Effect.Queue = Effect.Queues.get('global');
|
||||||
Effect.DefaultOptions = {
|
Effect.DefaultOptions = {
|
||||||
transition: Effect.Transitions.sinoidal,
|
transition: Effect.Transitions.sinoidal,
|
||||||
duration: 1.0, // seconds
|
duration: 1.0, // seconds
|
||||||
fps: 25.0, // max. 25fps due to Effect.Queue implementation
|
fps: 60.0, // max. 60fps due to Effect.Queue implementation
|
||||||
sync: false, // true for combining
|
sync: false, // true for combining
|
||||||
from: 0.0,
|
from: 0.0,
|
||||||
to: 1.0,
|
to: 1.0,
|
||||||
|
@ -324,7 +314,10 @@ Effect.Base.prototype = {
|
||||||
if(this.options[eventName]) this.options[eventName](this);
|
if(this.options[eventName]) this.options[eventName](this);
|
||||||
},
|
},
|
||||||
inspect: function() {
|
inspect: function() {
|
||||||
return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
|
var data = $H();
|
||||||
|
for(property in this)
|
||||||
|
if(typeof this[property] != 'function') data[property] = this[property];
|
||||||
|
return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,12 +341,24 @@ Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Effect.Event = Class.create();
|
||||||
|
Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
|
||||||
|
initialize: function() {
|
||||||
|
var options = Object.extend({
|
||||||
|
duration: 0
|
||||||
|
}, arguments[0] || {});
|
||||||
|
this.start(options);
|
||||||
|
},
|
||||||
|
update: Prototype.emptyFunction
|
||||||
|
});
|
||||||
|
|
||||||
Effect.Opacity = Class.create();
|
Effect.Opacity = Class.create();
|
||||||
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
|
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
|
||||||
initialize: function(element) {
|
initialize: function(element) {
|
||||||
this.element = $(element);
|
this.element = $(element);
|
||||||
|
if(!this.element) throw(Effect._elementDoesNotExistError);
|
||||||
// make this work on IE on elements without 'layout'
|
// make this work on IE on elements without 'layout'
|
||||||
if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
|
if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
|
||||||
this.element.setStyle({zoom: 1});
|
this.element.setStyle({zoom: 1});
|
||||||
var options = Object.extend({
|
var options = Object.extend({
|
||||||
from: this.element.getOpacity() || 0.0,
|
from: this.element.getOpacity() || 0.0,
|
||||||
|
@ -370,6 +375,7 @@ Effect.Move = Class.create();
|
||||||
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
|
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
|
||||||
initialize: function(element) {
|
initialize: function(element) {
|
||||||
this.element = $(element);
|
this.element = $(element);
|
||||||
|
if(!this.element) throw(Effect._elementDoesNotExistError);
|
||||||
var options = Object.extend({
|
var options = Object.extend({
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
|
@ -393,8 +399,8 @@ Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
|
||||||
},
|
},
|
||||||
update: function(position) {
|
update: function(position) {
|
||||||
this.element.setStyle({
|
this.element.setStyle({
|
||||||
left: this.options.x * position + this.originalLeft + 'px',
|
left: Math.round(this.options.x * position + this.originalLeft) + 'px',
|
||||||
top: this.options.y * position + this.originalTop + 'px'
|
top: Math.round(this.options.y * position + this.originalTop) + 'px'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -408,7 +414,8 @@ Effect.MoveBy = function(element, toTop, toLeft) {
|
||||||
Effect.Scale = Class.create();
|
Effect.Scale = Class.create();
|
||||||
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
|
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
|
||||||
initialize: function(element, percent) {
|
initialize: function(element, percent) {
|
||||||
this.element = $(element)
|
this.element = $(element);
|
||||||
|
if(!this.element) throw(Effect._elementDoesNotExistError);
|
||||||
var options = Object.extend({
|
var options = Object.extend({
|
||||||
scaleX: true,
|
scaleX: true,
|
||||||
scaleY: true,
|
scaleY: true,
|
||||||
|
@ -433,7 +440,7 @@ Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
|
||||||
this.originalLeft = this.element.offsetLeft;
|
this.originalLeft = this.element.offsetLeft;
|
||||||
|
|
||||||
var fontSize = this.element.getStyle('font-size') || '100%';
|
var fontSize = this.element.getStyle('font-size') || '100%';
|
||||||
['em','px','%'].each( function(fontSizeType) {
|
['em','px','%','pt'].each( function(fontSizeType) {
|
||||||
if(fontSize.indexOf(fontSizeType)>0) {
|
if(fontSize.indexOf(fontSizeType)>0) {
|
||||||
this.fontSize = parseFloat(fontSize);
|
this.fontSize = parseFloat(fontSize);
|
||||||
this.fontSizeType = fontSizeType;
|
this.fontSizeType = fontSizeType;
|
||||||
|
@ -458,12 +465,12 @@ Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
|
||||||
this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
|
this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
|
||||||
},
|
},
|
||||||
finish: function(position) {
|
finish: function(position) {
|
||||||
if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
|
if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
|
||||||
},
|
},
|
||||||
setDimensions: function(height, width) {
|
setDimensions: function(height, width) {
|
||||||
var d = {};
|
var d = {};
|
||||||
if(this.options.scaleX) d.width = width + 'px';
|
if(this.options.scaleX) d.width = Math.round(width) + 'px';
|
||||||
if(this.options.scaleY) d.height = height + 'px';
|
if(this.options.scaleY) d.height = Math.round(height) + 'px';
|
||||||
if(this.options.scaleFromCenter) {
|
if(this.options.scaleFromCenter) {
|
||||||
var topd = (height - this.dims[0])/2;
|
var topd = (height - this.dims[0])/2;
|
||||||
var leftd = (width - this.dims[1])/2;
|
var leftd = (width - this.dims[1])/2;
|
||||||
|
@ -483,6 +490,7 @@ Effect.Highlight = Class.create();
|
||||||
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
|
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
|
||||||
initialize: function(element) {
|
initialize: function(element) {
|
||||||
this.element = $(element);
|
this.element = $(element);
|
||||||
|
if(!this.element) throw(Effect._elementDoesNotExistError);
|
||||||
var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
|
var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
|
||||||
this.start(options);
|
this.start(options);
|
||||||
},
|
},
|
||||||
|
@ -490,9 +498,11 @@ Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype),
|
||||||
// Prevent executing on elements not in the layout flow
|
// Prevent executing on elements not in the layout flow
|
||||||
if(this.element.getStyle('display')=='none') { this.cancel(); return; }
|
if(this.element.getStyle('display')=='none') { this.cancel(); return; }
|
||||||
// Disable background image during the effect
|
// Disable background image during the effect
|
||||||
this.oldStyle = {
|
this.oldStyle = {};
|
||||||
backgroundImage: this.element.getStyle('background-image') };
|
if (!this.options.keepBackgroundImage) {
|
||||||
this.element.setStyle({backgroundImage: 'none'});
|
this.oldStyle.backgroundImage = this.element.getStyle('background-image');
|
||||||
|
this.element.setStyle({backgroundImage: 'none'});
|
||||||
|
}
|
||||||
if(!this.options.endcolor)
|
if(!this.options.endcolor)
|
||||||
this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
|
this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
|
||||||
if(!this.options.restorecolor)
|
if(!this.options.restorecolor)
|
||||||
|
@ -547,8 +557,7 @@ Effect.Fade = function(element) {
|
||||||
to: 0.0,
|
to: 0.0,
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
if(effect.options.to!=0) return;
|
if(effect.options.to!=0) return;
|
||||||
effect.element.hide();
|
effect.element.hide().setStyle({opacity: oldOpacity});
|
||||||
effect.element.setStyle({opacity: oldOpacity});
|
|
||||||
}}, arguments[1] || {});
|
}}, arguments[1] || {});
|
||||||
return new Effect.Opacity(element,options);
|
return new Effect.Opacity(element,options);
|
||||||
}
|
}
|
||||||
|
@ -563,25 +572,31 @@ Effect.Appear = function(element) {
|
||||||
effect.element.forceRerendering();
|
effect.element.forceRerendering();
|
||||||
},
|
},
|
||||||
beforeSetup: function(effect) {
|
beforeSetup: function(effect) {
|
||||||
effect.element.setOpacity(effect.options.from);
|
effect.element.setOpacity(effect.options.from).show();
|
||||||
effect.element.show();
|
|
||||||
}}, arguments[1] || {});
|
}}, arguments[1] || {});
|
||||||
return new Effect.Opacity(element,options);
|
return new Effect.Opacity(element,options);
|
||||||
}
|
}
|
||||||
|
|
||||||
Effect.Puff = function(element) {
|
Effect.Puff = function(element) {
|
||||||
element = $(element);
|
element = $(element);
|
||||||
var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') };
|
var oldStyle = {
|
||||||
|
opacity: element.getInlineOpacity(),
|
||||||
|
position: element.getStyle('position'),
|
||||||
|
top: element.style.top,
|
||||||
|
left: element.style.left,
|
||||||
|
width: element.style.width,
|
||||||
|
height: element.style.height
|
||||||
|
};
|
||||||
return new Effect.Parallel(
|
return new Effect.Parallel(
|
||||||
[ new Effect.Scale(element, 200,
|
[ new Effect.Scale(element, 200,
|
||||||
{ sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
|
{ sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
|
||||||
new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
|
new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
|
||||||
Object.extend({ duration: 1.0,
|
Object.extend({ duration: 1.0,
|
||||||
beforeSetupInternal: function(effect) {
|
beforeSetupInternal: function(effect) {
|
||||||
effect.effects[0].element.setStyle({position: 'absolute'}); },
|
Position.absolutize(effect.effects[0].element)
|
||||||
|
},
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
effect.effects[0].element.hide();
|
effect.effects[0].element.hide().setStyle(oldStyle); }
|
||||||
effect.effects[0].element.setStyle(oldStyle); }
|
|
||||||
}, arguments[1] || {})
|
}, arguments[1] || {})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -594,8 +609,7 @@ Effect.BlindUp = function(element) {
|
||||||
scaleX: false,
|
scaleX: false,
|
||||||
restoreAfterFinish: true,
|
restoreAfterFinish: true,
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
effect.element.hide();
|
effect.element.hide().undoClipping();
|
||||||
effect.element.undoClipping();
|
|
||||||
}
|
}
|
||||||
}, arguments[1] || {})
|
}, arguments[1] || {})
|
||||||
);
|
);
|
||||||
|
@ -604,28 +618,25 @@ Effect.BlindUp = function(element) {
|
||||||
Effect.BlindDown = function(element) {
|
Effect.BlindDown = function(element) {
|
||||||
element = $(element);
|
element = $(element);
|
||||||
var elementDimensions = element.getDimensions();
|
var elementDimensions = element.getDimensions();
|
||||||
return new Effect.Scale(element, 100,
|
return new Effect.Scale(element, 100, Object.extend({
|
||||||
Object.extend({ scaleContent: false,
|
scaleContent: false,
|
||||||
scaleX: false,
|
scaleX: false,
|
||||||
scaleFrom: 0,
|
scaleFrom: 0,
|
||||||
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
|
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
|
||||||
restoreAfterFinish: true,
|
restoreAfterFinish: true,
|
||||||
afterSetup: function(effect) {
|
afterSetup: function(effect) {
|
||||||
effect.element.makeClipping();
|
effect.element.makeClipping().setStyle({height: '0px'}).show();
|
||||||
effect.element.setStyle({height: '0px'});
|
},
|
||||||
effect.element.show();
|
afterFinishInternal: function(effect) {
|
||||||
},
|
effect.element.undoClipping();
|
||||||
afterFinishInternal: function(effect) {
|
}
|
||||||
effect.element.undoClipping();
|
}, arguments[1] || {}));
|
||||||
}
|
|
||||||
}, arguments[1] || {})
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Effect.SwitchOff = function(element) {
|
Effect.SwitchOff = function(element) {
|
||||||
element = $(element);
|
element = $(element);
|
||||||
var oldOpacity = element.getInlineOpacity();
|
var oldOpacity = element.getInlineOpacity();
|
||||||
return new Effect.Appear(element, {
|
return new Effect.Appear(element, Object.extend({
|
||||||
duration: 0.4,
|
duration: 0.4,
|
||||||
from: 0,
|
from: 0,
|
||||||
transition: Effect.Transitions.flicker,
|
transition: Effect.Transitions.flicker,
|
||||||
|
@ -634,18 +645,14 @@ Effect.SwitchOff = function(element) {
|
||||||
duration: 0.3, scaleFromCenter: true,
|
duration: 0.3, scaleFromCenter: true,
|
||||||
scaleX: false, scaleContent: false, restoreAfterFinish: true,
|
scaleX: false, scaleContent: false, restoreAfterFinish: true,
|
||||||
beforeSetup: function(effect) {
|
beforeSetup: function(effect) {
|
||||||
effect.element.makePositioned();
|
effect.element.makePositioned().makeClipping();
|
||||||
effect.element.makeClipping();
|
|
||||||
},
|
},
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
effect.element.hide();
|
effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
|
||||||
effect.element.undoClipping();
|
|
||||||
effect.element.undoPositioned();
|
|
||||||
effect.element.setStyle({opacity: oldOpacity});
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
});
|
}, arguments[1] || {}));
|
||||||
}
|
}
|
||||||
|
|
||||||
Effect.DropOut = function(element) {
|
Effect.DropOut = function(element) {
|
||||||
|
@ -663,9 +670,7 @@ Effect.DropOut = function(element) {
|
||||||
effect.effects[0].element.makePositioned();
|
effect.effects[0].element.makePositioned();
|
||||||
},
|
},
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
effect.effects[0].element.hide();
|
effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
|
||||||
effect.effects[0].element.undoPositioned();
|
|
||||||
effect.effects[0].element.setStyle(oldStyle);
|
|
||||||
}
|
}
|
||||||
}, arguments[1] || {}));
|
}, arguments[1] || {}));
|
||||||
}
|
}
|
||||||
|
@ -687,16 +692,14 @@ Effect.Shake = function(element) {
|
||||||
{ x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
|
{ x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
|
||||||
new Effect.Move(effect.element,
|
new Effect.Move(effect.element,
|
||||||
{ x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
|
{ x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
|
||||||
effect.element.undoPositioned();
|
effect.element.undoPositioned().setStyle(oldStyle);
|
||||||
effect.element.setStyle(oldStyle);
|
|
||||||
}}) }}) }}) }}) }}) }});
|
}}) }}) }}) }}) }}) }});
|
||||||
}
|
}
|
||||||
|
|
||||||
Effect.SlideDown = function(element) {
|
Effect.SlideDown = function(element) {
|
||||||
element = $(element);
|
element = $(element).cleanWhitespace();
|
||||||
element.cleanWhitespace();
|
|
||||||
// SlideDown need to have the content of the element wrapped in a container element with fixed height!
|
// SlideDown need to have the content of the element wrapped in a container element with fixed height!
|
||||||
var oldInnerBottom = $(element.firstChild).getStyle('bottom');
|
var oldInnerBottom = element.down().getStyle('bottom');
|
||||||
var elementDimensions = element.getDimensions();
|
var elementDimensions = element.getDimensions();
|
||||||
return new Effect.Scale(element, 100, Object.extend({
|
return new Effect.Scale(element, 100, Object.extend({
|
||||||
scaleContent: false,
|
scaleContent: false,
|
||||||
|
@ -706,34 +709,24 @@ Effect.SlideDown = function(element) {
|
||||||
restoreAfterFinish: true,
|
restoreAfterFinish: true,
|
||||||
afterSetup: function(effect) {
|
afterSetup: function(effect) {
|
||||||
effect.element.makePositioned();
|
effect.element.makePositioned();
|
||||||
effect.element.firstChild.makePositioned();
|
effect.element.down().makePositioned();
|
||||||
if(window.opera) effect.element.setStyle({top: ''});
|
if(window.opera) effect.element.setStyle({top: ''});
|
||||||
effect.element.makeClipping();
|
effect.element.makeClipping().setStyle({height: '0px'}).show();
|
||||||
effect.element.setStyle({height: '0px'});
|
},
|
||||||
effect.element.show(); },
|
|
||||||
afterUpdateInternal: function(effect) {
|
afterUpdateInternal: function(effect) {
|
||||||
effect.element.firstChild.setStyle({bottom:
|
effect.element.down().setStyle({bottom:
|
||||||
(effect.dims[0] - effect.element.clientHeight) + 'px' });
|
(effect.dims[0] - effect.element.clientHeight) + 'px' });
|
||||||
},
|
},
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
effect.element.undoClipping();
|
effect.element.undoClipping().undoPositioned();
|
||||||
// IE will crash if child is undoPositioned first
|
effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
|
||||||
if(/MSIE/.test(navigator.userAgent)){
|
|
||||||
effect.element.undoPositioned();
|
|
||||||
effect.element.firstChild.undoPositioned();
|
|
||||||
}else{
|
|
||||||
effect.element.firstChild.undoPositioned();
|
|
||||||
effect.element.undoPositioned();
|
|
||||||
}
|
|
||||||
effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
|
|
||||||
}, arguments[1] || {})
|
}, arguments[1] || {})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Effect.SlideUp = function(element) {
|
Effect.SlideUp = function(element) {
|
||||||
element = $(element);
|
element = $(element).cleanWhitespace();
|
||||||
element.cleanWhitespace();
|
var oldInnerBottom = element.down().getStyle('bottom');
|
||||||
var oldInnerBottom = $(element.firstChild).getStyle('bottom');
|
|
||||||
return new Effect.Scale(element, window.opera ? 0 : 1,
|
return new Effect.Scale(element, window.opera ? 0 : 1,
|
||||||
Object.extend({ scaleContent: false,
|
Object.extend({ scaleContent: false,
|
||||||
scaleX: false,
|
scaleX: false,
|
||||||
|
@ -742,32 +735,32 @@ Effect.SlideUp = function(element) {
|
||||||
restoreAfterFinish: true,
|
restoreAfterFinish: true,
|
||||||
beforeStartInternal: function(effect) {
|
beforeStartInternal: function(effect) {
|
||||||
effect.element.makePositioned();
|
effect.element.makePositioned();
|
||||||
effect.element.firstChild.makePositioned();
|
effect.element.down().makePositioned();
|
||||||
if(window.opera) effect.element.setStyle({top: ''});
|
if(window.opera) effect.element.setStyle({top: ''});
|
||||||
effect.element.makeClipping();
|
effect.element.makeClipping().show();
|
||||||
effect.element.show(); },
|
},
|
||||||
afterUpdateInternal: function(effect) {
|
afterUpdateInternal: function(effect) {
|
||||||
effect.element.firstChild.setStyle({bottom:
|
effect.element.down().setStyle({bottom:
|
||||||
(effect.dims[0] - effect.element.clientHeight) + 'px' }); },
|
(effect.dims[0] - effect.element.clientHeight) + 'px' });
|
||||||
|
},
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
effect.element.hide();
|
effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
|
||||||
effect.element.undoClipping();
|
effect.element.down().undoPositioned();
|
||||||
effect.element.firstChild.undoPositioned();
|
}
|
||||||
effect.element.undoPositioned();
|
|
||||||
effect.element.setStyle({bottom: oldInnerBottom}); }
|
|
||||||
}, arguments[1] || {})
|
}, arguments[1] || {})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bug in opera makes the TD containing this element expand for a instance after finish
|
// Bug in opera makes the TD containing this element expand for a instance after finish
|
||||||
Effect.Squish = function(element) {
|
Effect.Squish = function(element) {
|
||||||
return new Effect.Scale(element, window.opera ? 1 : 0,
|
return new Effect.Scale(element, window.opera ? 1 : 0, {
|
||||||
{ restoreAfterFinish: true,
|
restoreAfterFinish: true,
|
||||||
beforeSetup: function(effect) {
|
beforeSetup: function(effect) {
|
||||||
effect.element.makeClipping(effect.element); },
|
effect.element.makeClipping();
|
||||||
afterFinishInternal: function(effect) {
|
},
|
||||||
effect.element.hide(effect.element);
|
afterFinishInternal: function(effect) {
|
||||||
effect.element.undoClipping(effect.element); }
|
effect.element.hide().undoClipping();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -823,9 +816,7 @@ Effect.Grow = function(element) {
|
||||||
y: initialMoveY,
|
y: initialMoveY,
|
||||||
duration: 0.01,
|
duration: 0.01,
|
||||||
beforeSetup: function(effect) {
|
beforeSetup: function(effect) {
|
||||||
effect.element.hide();
|
effect.element.hide().makeClipping().makePositioned();
|
||||||
effect.element.makeClipping();
|
|
||||||
effect.element.makePositioned();
|
|
||||||
},
|
},
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
new Effect.Parallel(
|
new Effect.Parallel(
|
||||||
|
@ -836,13 +827,10 @@ Effect.Grow = function(element) {
|
||||||
sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
|
sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
|
||||||
], Object.extend({
|
], Object.extend({
|
||||||
beforeSetup: function(effect) {
|
beforeSetup: function(effect) {
|
||||||
effect.effects[0].element.setStyle({height: '0px'});
|
effect.effects[0].element.setStyle({height: '0px'}).show();
|
||||||
effect.effects[0].element.show();
|
|
||||||
},
|
},
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
effect.effects[0].element.undoClipping();
|
effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
|
||||||
effect.effects[0].element.undoPositioned();
|
|
||||||
effect.effects[0].element.setStyle(oldStyle);
|
|
||||||
}
|
}
|
||||||
}, options)
|
}, options)
|
||||||
)
|
)
|
||||||
|
@ -896,13 +884,10 @@ Effect.Shrink = function(element) {
|
||||||
new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
|
new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
|
||||||
], Object.extend({
|
], Object.extend({
|
||||||
beforeStartInternal: function(effect) {
|
beforeStartInternal: function(effect) {
|
||||||
effect.effects[0].element.makePositioned();
|
effect.effects[0].element.makePositioned().makeClipping();
|
||||||
effect.effects[0].element.makeClipping(); },
|
},
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
effect.effects[0].element.hide();
|
effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
|
||||||
effect.effects[0].element.undoClipping();
|
|
||||||
effect.effects[0].element.undoPositioned();
|
|
||||||
effect.effects[0].element.setStyle(oldStyle); }
|
|
||||||
}, options)
|
}, options)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -912,10 +897,10 @@ Effect.Pulsate = function(element) {
|
||||||
var options = arguments[1] || {};
|
var options = arguments[1] || {};
|
||||||
var oldOpacity = element.getInlineOpacity();
|
var oldOpacity = element.getInlineOpacity();
|
||||||
var transition = options.transition || Effect.Transitions.sinoidal;
|
var transition = options.transition || Effect.Transitions.sinoidal;
|
||||||
var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
|
var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
|
||||||
reverser.bind(transition);
|
reverser.bind(transition);
|
||||||
return new Effect.Opacity(element,
|
return new Effect.Opacity(element,
|
||||||
Object.extend(Object.extend({ duration: 3.0, from: 0,
|
Object.extend(Object.extend({ duration: 2.0, from: 0,
|
||||||
afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
|
afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
|
||||||
}, options), {transition: reverser}));
|
}, options), {transition: reverser}));
|
||||||
}
|
}
|
||||||
|
@ -927,7 +912,7 @@ Effect.Fold = function(element) {
|
||||||
left: element.style.left,
|
left: element.style.left,
|
||||||
width: element.style.width,
|
width: element.style.width,
|
||||||
height: element.style.height };
|
height: element.style.height };
|
||||||
Element.makeClipping(element);
|
element.makeClipping();
|
||||||
return new Effect.Scale(element, 5, Object.extend({
|
return new Effect.Scale(element, 5, Object.extend({
|
||||||
scaleContent: false,
|
scaleContent: false,
|
||||||
scaleX: false,
|
scaleX: false,
|
||||||
|
@ -936,15 +921,162 @@ Effect.Fold = function(element) {
|
||||||
scaleContent: false,
|
scaleContent: false,
|
||||||
scaleY: false,
|
scaleY: false,
|
||||||
afterFinishInternal: function(effect) {
|
afterFinishInternal: function(effect) {
|
||||||
effect.element.hide();
|
effect.element.hide().undoClipping().setStyle(oldStyle);
|
||||||
effect.element.undoClipping();
|
|
||||||
effect.element.setStyle(oldStyle);
|
|
||||||
} });
|
} });
|
||||||
}}, arguments[1] || {}));
|
}}, arguments[1] || {}));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Effect.Morph = Class.create();
|
||||||
|
Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
|
||||||
|
initialize: function(element) {
|
||||||
|
this.element = $(element);
|
||||||
|
if(!this.element) throw(Effect._elementDoesNotExistError);
|
||||||
|
var options = Object.extend({
|
||||||
|
style: {}
|
||||||
|
}, arguments[1] || {});
|
||||||
|
if (typeof options.style == 'string') {
|
||||||
|
if(options.style.indexOf(':') == -1) {
|
||||||
|
var cssText = '', selector = '.' + options.style;
|
||||||
|
$A(document.styleSheets).reverse().each(function(styleSheet) {
|
||||||
|
if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
|
||||||
|
else if (styleSheet.rules) cssRules = styleSheet.rules;
|
||||||
|
$A(cssRules).reverse().each(function(rule) {
|
||||||
|
if (selector == rule.selectorText) {
|
||||||
|
cssText = rule.style.cssText;
|
||||||
|
throw $break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (cssText) throw $break;
|
||||||
|
});
|
||||||
|
this.style = cssText.parseStyle();
|
||||||
|
options.afterFinishInternal = function(effect){
|
||||||
|
effect.element.addClassName(effect.options.style);
|
||||||
|
effect.transforms.each(function(transform) {
|
||||||
|
if(transform.style != 'opacity')
|
||||||
|
effect.element.style[transform.style.camelize()] = '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else this.style = options.style.parseStyle();
|
||||||
|
} else this.style = $H(options.style)
|
||||||
|
this.start(options);
|
||||||
|
},
|
||||||
|
setup: function(){
|
||||||
|
function parseColor(color){
|
||||||
|
if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
|
||||||
|
color = color.parseColor();
|
||||||
|
return $R(0,2).map(function(i){
|
||||||
|
return parseInt( color.slice(i*2+1,i*2+3), 16 )
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.transforms = this.style.map(function(pair){
|
||||||
|
var property = pair[0].underscore().dasherize(), value = pair[1], unit = null;
|
||||||
|
|
||||||
|
if(value.parseColor('#zzzzzz') != '#zzzzzz') {
|
||||||
|
value = value.parseColor();
|
||||||
|
unit = 'color';
|
||||||
|
} else if(property == 'opacity') {
|
||||||
|
value = parseFloat(value);
|
||||||
|
if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
|
||||||
|
this.element.setStyle({zoom: 1});
|
||||||
|
} else if(Element.CSS_LENGTH.test(value))
|
||||||
|
var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/),
|
||||||
|
value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;
|
||||||
|
|
||||||
|
var originalValue = this.element.getStyle(property);
|
||||||
|
return $H({
|
||||||
|
style: property,
|
||||||
|
originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
|
||||||
|
targetValue: unit=='color' ? parseColor(value) : value,
|
||||||
|
unit: unit
|
||||||
|
});
|
||||||
|
}.bind(this)).reject(function(transform){
|
||||||
|
return (
|
||||||
|
(transform.originalValue == transform.targetValue) ||
|
||||||
|
(
|
||||||
|
transform.unit != 'color' &&
|
||||||
|
(isNaN(transform.originalValue) || isNaN(transform.targetValue))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
});
|
||||||
|
},
|
||||||
|
update: function(position) {
|
||||||
|
var style = $H(), value = null;
|
||||||
|
this.transforms.each(function(transform){
|
||||||
|
value = transform.unit=='color' ?
|
||||||
|
$R(0,2).inject('#',function(m,v,i){
|
||||||
|
return m+(Math.round(transform.originalValue[i]+
|
||||||
|
(transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) :
|
||||||
|
transform.originalValue + Math.round(
|
||||||
|
((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
|
||||||
|
style[transform.style] = value;
|
||||||
|
});
|
||||||
|
this.element.setStyle(style);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Effect.Transform = Class.create();
|
||||||
|
Object.extend(Effect.Transform.prototype, {
|
||||||
|
initialize: function(tracks){
|
||||||
|
this.tracks = [];
|
||||||
|
this.options = arguments[1] || {};
|
||||||
|
this.addTracks(tracks);
|
||||||
|
},
|
||||||
|
addTracks: function(tracks){
|
||||||
|
tracks.each(function(track){
|
||||||
|
var data = $H(track).values().first();
|
||||||
|
this.tracks.push($H({
|
||||||
|
ids: $H(track).keys().first(),
|
||||||
|
effect: Effect.Morph,
|
||||||
|
options: { style: data }
|
||||||
|
}));
|
||||||
|
}.bind(this));
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
play: function(){
|
||||||
|
return new Effect.Parallel(
|
||||||
|
this.tracks.map(function(track){
|
||||||
|
var elements = [$(track.ids) || $$(track.ids)].flatten();
|
||||||
|
return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
|
||||||
|
}).flatten(),
|
||||||
|
this.options
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Element.CSS_PROPERTIES = $w(
|
||||||
|
'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
|
||||||
|
'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
|
||||||
|
'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
|
||||||
|
'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
|
||||||
|
'fontSize fontWeight height left letterSpacing lineHeight ' +
|
||||||
|
'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
|
||||||
|
'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
|
||||||
|
'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
|
||||||
|
'right textIndent top width wordSpacing zIndex');
|
||||||
|
|
||||||
|
Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
|
||||||
|
|
||||||
|
String.prototype.parseStyle = function(){
|
||||||
|
var element = Element.extend(document.createElement('div'));
|
||||||
|
element.innerHTML = '<div style="' + this + '"></div>';
|
||||||
|
var style = element.down().style, styleRules = $H();
|
||||||
|
|
||||||
|
Element.CSS_PROPERTIES.each(function(property){
|
||||||
|
if(style[property]) styleRules[property] = style[property];
|
||||||
|
});
|
||||||
|
if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) {
|
||||||
|
styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
|
||||||
|
}
|
||||||
|
return styleRules;
|
||||||
|
};
|
||||||
|
|
||||||
|
Element.morph = function(element, style) {
|
||||||
|
new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
|
||||||
|
return element;
|
||||||
|
};
|
||||||
|
|
||||||
['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
|
['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
|
||||||
'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(
|
'collectTextNodes','collectTextNodesIgnoreClass','morph'].each(
|
||||||
function(f) { Element.Methods[f] = Element[f]; }
|
function(f) { Element.Methods[f] = Element[f]; }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +1,6 @@
|
||||||
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
// script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||||
|
|
||||||
|
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||||
//
|
//
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining
|
// Permission is hereby granted, free of charge, to any person obtaining
|
||||||
// a copy of this software and associated documentation files (the
|
// a copy of this software and associated documentation files (the
|
||||||
|
@ -18,9 +20,11 @@
|
||||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||||
|
|
||||||
var Scriptaculous = {
|
var Scriptaculous = {
|
||||||
Version: '1.6.1',
|
Version: '1.7.0',
|
||||||
require: function(libraryName) {
|
require: function(libraryName) {
|
||||||
// inserting via DOM fails in Safari 2.0, so brute force approach
|
// inserting via DOM fails in Safari 2.0, so brute force approach
|
||||||
document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
|
document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
|
||||||
|
|
|
@ -1,25 +1,9 @@
|
||||||
// Copyright (c) 2005 Marty Haught, Thomas Fuchs
|
// script.aculo.us slider.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||||
|
|
||||||
|
// Copyright (c) 2005, 2006 Marty Haught, Thomas Fuchs
|
||||||
//
|
//
|
||||||
// See http://script.aculo.us for more info
|
// script.aculo.us is freely distributable under the terms of an MIT-style license.
|
||||||
//
|
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
// a copy of this software and associated documentation files (the
|
|
||||||
// "Software"), to deal in the Software without restriction, including
|
|
||||||
// without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
// permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
// the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be
|
|
||||||
// included in all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
if(!Control) var Control = {};
|
if(!Control) var Control = {};
|
||||||
Control.Slider = Class.create();
|
Control.Slider = Class.create();
|
||||||
|
@ -64,7 +48,12 @@ Control.Slider.prototype = {
|
||||||
this.alignY = parseInt(this.options.alignY || '0');
|
this.alignY = parseInt(this.options.alignY || '0');
|
||||||
|
|
||||||
this.trackLength = this.maximumOffset() - this.minimumOffset();
|
this.trackLength = this.maximumOffset() - this.minimumOffset();
|
||||||
this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth;
|
|
||||||
|
this.handleLength = this.isVertical() ?
|
||||||
|
(this.handles[0].offsetHeight != 0 ?
|
||||||
|
this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
|
||||||
|
(this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
|
||||||
|
this.handles[0].style.width.replace(/px$/,""));
|
||||||
|
|
||||||
this.active = false;
|
this.active = false;
|
||||||
this.dragging = false;
|
this.dragging = false;
|
||||||
|
@ -137,8 +126,8 @@ Control.Slider.prototype = {
|
||||||
},
|
},
|
||||||
setValue: function(sliderValue, handleIdx){
|
setValue: function(sliderValue, handleIdx){
|
||||||
if(!this.active) {
|
if(!this.active) {
|
||||||
this.activeHandle = this.handles[handleIdx];
|
this.activeHandleIdx = handleIdx || 0;
|
||||||
this.activeHandleIdx = handleIdx;
|
this.activeHandle = this.handles[this.activeHandleIdx];
|
||||||
this.updateStyles();
|
this.updateStyles();
|
||||||
}
|
}
|
||||||
handleIdx = handleIdx || this.activeHandleIdx || 0;
|
handleIdx = handleIdx || this.activeHandleIdx || 0;
|
||||||
|
@ -181,7 +170,10 @@ Control.Slider.prototype = {
|
||||||
},
|
},
|
||||||
maximumOffset: function(){
|
maximumOffset: function(){
|
||||||
return(this.isVertical() ?
|
return(this.isVertical() ?
|
||||||
this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX);
|
(this.track.offsetHeight != 0 ? this.track.offsetHeight :
|
||||||
|
this.track.style.height.replace(/px$/,"")) - this.alignY :
|
||||||
|
(this.track.offsetWidth != 0 ? this.track.offsetWidth :
|
||||||
|
this.track.style.width.replace(/px$/,"")) - this.alignY);
|
||||||
},
|
},
|
||||||
isVertical: function(){
|
isVertical: function(){
|
||||||
return (this.axis == 'vertical');
|
return (this.axis == 'vertical');
|
||||||
|
@ -217,7 +209,8 @@ Control.Slider.prototype = {
|
||||||
|
|
||||||
var handle = Event.element(event);
|
var handle = Event.element(event);
|
||||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||||
if(handle==this.track) {
|
var track = handle;
|
||||||
|
if(track==this.track) {
|
||||||
var offsets = Position.cumulativeOffset(this.track);
|
var offsets = Position.cumulativeOffset(this.track);
|
||||||
this.event = event;
|
this.event = event;
|
||||||
this.setValue(this.translateToValue(
|
this.setValue(this.translateToValue(
|
||||||
|
@ -231,13 +224,15 @@ Control.Slider.prototype = {
|
||||||
while((this.handles.indexOf(handle) == -1) && handle.parentNode)
|
while((this.handles.indexOf(handle) == -1) && handle.parentNode)
|
||||||
handle = handle.parentNode;
|
handle = handle.parentNode;
|
||||||
|
|
||||||
this.activeHandle = handle;
|
if(this.handles.indexOf(handle)!=-1) {
|
||||||
this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
|
this.activeHandle = handle;
|
||||||
this.updateStyles();
|
this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
|
||||||
|
this.updateStyles();
|
||||||
|
|
||||||
var offsets = Position.cumulativeOffset(this.activeHandle);
|
var offsets = Position.cumulativeOffset(this.activeHandle);
|
||||||
this.offsetX = (pointer[0] - offsets[0]);
|
this.offsetX = (pointer[0] - offsets[0]);
|
||||||
this.offsetY = (pointer[1] - offsets[1]);
|
this.offsetY = (pointer[1] - offsets[1]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event.stop(event);
|
Event.stop(event);
|
||||||
|
|
|
@ -1,38 +1,27 @@
|
||||||
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
// script.aculo.us unittest.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||||
// (c) 2005 Jon Tirsen (http://www.tirsen.com)
|
|
||||||
// (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
// a copy of this software and associated documentation files (the
|
|
||||||
// "Software"), to deal in the Software without restriction, including
|
|
||||||
// without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
// permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
// the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be
|
|
||||||
// included in all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
|
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||||
|
// (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
|
||||||
|
// (c) 2005, 2006 Michael Schuerig (http://www.schuerig.de/michael/)
|
||||||
|
//
|
||||||
|
// script.aculo.us is freely distributable under the terms of an MIT-style license.
|
||||||
|
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||||
|
|
||||||
// experimental, Firefox-only
|
// experimental, Firefox-only
|
||||||
Event.simulateMouse = function(element, eventName) {
|
Event.simulateMouse = function(element, eventName) {
|
||||||
var options = Object.extend({
|
var options = Object.extend({
|
||||||
pointerX: 0,
|
pointerX: 0,
|
||||||
pointerY: 0,
|
pointerY: 0,
|
||||||
buttons: 0
|
buttons: 0,
|
||||||
|
ctrlKey: false,
|
||||||
|
altKey: false,
|
||||||
|
shiftKey: false,
|
||||||
|
metaKey: false
|
||||||
}, arguments[2] || {});
|
}, arguments[2] || {});
|
||||||
var oEvent = document.createEvent("MouseEvents");
|
var oEvent = document.createEvent("MouseEvents");
|
||||||
oEvent.initMouseEvent(eventName, true, true, document.defaultView,
|
oEvent.initMouseEvent(eventName, true, true, document.defaultView,
|
||||||
options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
|
options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
|
||||||
false, false, false, false, 0, $(element));
|
options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element));
|
||||||
|
|
||||||
if(this.mark) Element.remove(this.mark);
|
if(this.mark) Element.remove(this.mark);
|
||||||
this.mark = document.createElement('div');
|
this.mark = document.createElement('div');
|
||||||
|
@ -98,6 +87,7 @@ Test.Unit.Logger.prototype = {
|
||||||
this.lastLogLine = document.createElement('tr');
|
this.lastLogLine = document.createElement('tr');
|
||||||
this.statusCell = document.createElement('td');
|
this.statusCell = document.createElement('td');
|
||||||
this.nameCell = document.createElement('td');
|
this.nameCell = document.createElement('td');
|
||||||
|
this.nameCell.className = "nameCell";
|
||||||
this.nameCell.appendChild(document.createTextNode(testName));
|
this.nameCell.appendChild(document.createTextNode(testName));
|
||||||
this.messageCell = document.createElement('td');
|
this.messageCell = document.createElement('td');
|
||||||
this.lastLogLine.appendChild(this.statusCell);
|
this.lastLogLine.appendChild(this.statusCell);
|
||||||
|
@ -110,6 +100,7 @@ Test.Unit.Logger.prototype = {
|
||||||
this.lastLogLine.className = status;
|
this.lastLogLine.className = status;
|
||||||
this.statusCell.innerHTML = status;
|
this.statusCell.innerHTML = status;
|
||||||
this.messageCell.innerHTML = this._toHTML(summary);
|
this.messageCell.innerHTML = this._toHTML(summary);
|
||||||
|
this.addLinksToResults();
|
||||||
},
|
},
|
||||||
message: function(message) {
|
message: function(message) {
|
||||||
if (!this.log) return;
|
if (!this.log) return;
|
||||||
|
@ -131,6 +122,16 @@ Test.Unit.Logger.prototype = {
|
||||||
},
|
},
|
||||||
_toHTML: function(txt) {
|
_toHTML: function(txt) {
|
||||||
return txt.escapeHTML().replace(/\n/g,"<br/>");
|
return txt.escapeHTML().replace(/\n/g,"<br/>");
|
||||||
|
},
|
||||||
|
addLinksToResults: function(){
|
||||||
|
$$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log
|
||||||
|
td.title = "Run only this test"
|
||||||
|
Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;});
|
||||||
|
});
|
||||||
|
$$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log
|
||||||
|
td.title = "Run all tests"
|
||||||
|
Event.observe(td, 'click', function(){ window.location.search = "";});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,6 +142,7 @@ Test.Unit.Runner.prototype = {
|
||||||
testLog: 'testlog'
|
testLog: 'testlog'
|
||||||
}, arguments[1] || {});
|
}, arguments[1] || {});
|
||||||
this.options.resultsURL = this.parseResultsURLQueryParameter();
|
this.options.resultsURL = this.parseResultsURLQueryParameter();
|
||||||
|
this.options.tests = this.parseTestsQueryParameter();
|
||||||
if (this.options.testLog) {
|
if (this.options.testLog) {
|
||||||
this.options.testLog = $(this.options.testLog) || null;
|
this.options.testLog = $(this.options.testLog) || null;
|
||||||
}
|
}
|
||||||
|
@ -158,7 +160,11 @@ Test.Unit.Runner.prototype = {
|
||||||
this.tests = [];
|
this.tests = [];
|
||||||
for(var testcase in testcases) {
|
for(var testcase in testcases) {
|
||||||
if(/^test/.test(testcase)) {
|
if(/^test/.test(testcase)) {
|
||||||
this.tests.push(new Test.Unit.Testcase(testcase, testcases[testcase], testcases["setup"], testcases["teardown"]));
|
this.tests.push(
|
||||||
|
new Test.Unit.Testcase(
|
||||||
|
this.options.context ? ' -> ' + this.options.titles[testcase] : testcase,
|
||||||
|
testcases[testcase], testcases["setup"], testcases["teardown"]
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -170,6 +176,11 @@ Test.Unit.Runner.prototype = {
|
||||||
parseResultsURLQueryParameter: function() {
|
parseResultsURLQueryParameter: function() {
|
||||||
return window.location.search.parseQuery()["resultsURL"];
|
return window.location.search.parseQuery()["resultsURL"];
|
||||||
},
|
},
|
||||||
|
parseTestsQueryParameter: function(){
|
||||||
|
if (window.location.search.parseQuery()["tests"]){
|
||||||
|
return window.location.search.parseQuery()["tests"].split(',');
|
||||||
|
};
|
||||||
|
},
|
||||||
// Returns:
|
// Returns:
|
||||||
// "ERROR" if there was an error,
|
// "ERROR" if there was an error,
|
||||||
// "FAILURE" if there was a failure, or
|
// "FAILURE" if there was a failure, or
|
||||||
|
@ -229,6 +240,7 @@ Test.Unit.Runner.prototype = {
|
||||||
errors += this.tests[i].errors;
|
errors += this.tests[i].errors;
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
|
(this.options.context ? this.options.context + ': ': '') +
|
||||||
this.tests.length + " tests, " +
|
this.tests.length + " tests, " +
|
||||||
assertions + " assertions, " +
|
assertions + " assertions, " +
|
||||||
failures + " failures, " +
|
failures + " failures, " +
|
||||||
|
@ -283,6 +295,13 @@ Test.Unit.Assertions.prototype = {
|
||||||
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||||
catch(e) { this.error(e); }
|
catch(e) { this.error(e); }
|
||||||
},
|
},
|
||||||
|
assertInspect: function(expected, actual) {
|
||||||
|
var message = arguments[2] || "assertInspect";
|
||||||
|
try { (expected == actual.inspect()) ? this.pass() :
|
||||||
|
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||||
|
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||||
|
catch(e) { this.error(e); }
|
||||||
|
},
|
||||||
assertEnumEqual: function(expected, actual) {
|
assertEnumEqual: function(expected, actual) {
|
||||||
var message = arguments[2] || "assertEnumEqual";
|
var message = arguments[2] || "assertEnumEqual";
|
||||||
try { $A(expected).length == $A(actual).length &&
|
try { $A(expected).length == $A(actual).length &&
|
||||||
|
@ -297,12 +316,33 @@ Test.Unit.Assertions.prototype = {
|
||||||
this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
|
this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
|
||||||
catch(e) { this.error(e); }
|
catch(e) { this.error(e); }
|
||||||
},
|
},
|
||||||
|
assertIdentical: function(expected, actual) {
|
||||||
|
var message = arguments[2] || "assertIdentical";
|
||||||
|
try { (expected === actual) ? this.pass() :
|
||||||
|
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||||
|
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||||
|
catch(e) { this.error(e); }
|
||||||
|
},
|
||||||
|
assertNotIdentical: function(expected, actual) {
|
||||||
|
var message = arguments[2] || "assertNotIdentical";
|
||||||
|
try { !(expected === actual) ? this.pass() :
|
||||||
|
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||||
|
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||||
|
catch(e) { this.error(e); }
|
||||||
|
},
|
||||||
assertNull: function(obj) {
|
assertNull: function(obj) {
|
||||||
var message = arguments[1] || 'assertNull'
|
var message = arguments[1] || 'assertNull'
|
||||||
try { (obj==null) ? this.pass() :
|
try { (obj==null) ? this.pass() :
|
||||||
this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
|
this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
|
||||||
catch(e) { this.error(e); }
|
catch(e) { this.error(e); }
|
||||||
},
|
},
|
||||||
|
assertMatch: function(expected, actual) {
|
||||||
|
var message = arguments[2] || 'assertMatch';
|
||||||
|
var regex = new RegExp(expected);
|
||||||
|
try { (regex.exec(actual)) ? this.pass() :
|
||||||
|
this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
|
||||||
|
catch(e) { this.error(e); }
|
||||||
|
},
|
||||||
assertHidden: function(element) {
|
assertHidden: function(element) {
|
||||||
var message = arguments[1] || 'assertHidden';
|
var message = arguments[1] || 'assertHidden';
|
||||||
this.assertEqual("none", element.style.display, message);
|
this.assertEqual("none", element.style.display, message);
|
||||||
|
@ -311,6 +351,22 @@ Test.Unit.Assertions.prototype = {
|
||||||
var message = arguments[1] || 'assertNotNull';
|
var message = arguments[1] || 'assertNotNull';
|
||||||
this.assert(object != null, message);
|
this.assert(object != null, message);
|
||||||
},
|
},
|
||||||
|
assertType: function(expected, actual) {
|
||||||
|
var message = arguments[2] || 'assertType';
|
||||||
|
try {
|
||||||
|
(actual.constructor == expected) ? this.pass() :
|
||||||
|
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||||
|
'", actual "' + (actual.constructor) + '"'); }
|
||||||
|
catch(e) { this.error(e); }
|
||||||
|
},
|
||||||
|
assertNotOfType: function(expected, actual) {
|
||||||
|
var message = arguments[2] || 'assertNotOfType';
|
||||||
|
try {
|
||||||
|
(actual.constructor != expected) ? this.pass() :
|
||||||
|
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||||
|
'", actual "' + (actual.constructor) + '"'); }
|
||||||
|
catch(e) { this.error(e); }
|
||||||
|
},
|
||||||
assertInstanceOf: function(expected, actual) {
|
assertInstanceOf: function(expected, actual) {
|
||||||
var message = arguments[2] || 'assertInstanceOf';
|
var message = arguments[2] || 'assertInstanceOf';
|
||||||
try {
|
try {
|
||||||
|
@ -325,6 +381,63 @@ Test.Unit.Assertions.prototype = {
|
||||||
this.fail(message + ": object was an instance of the not expected type"); }
|
this.fail(message + ": object was an instance of the not expected type"); }
|
||||||
catch(e) { this.error(e); }
|
catch(e) { this.error(e); }
|
||||||
},
|
},
|
||||||
|
assertRespondsTo: function(method, obj) {
|
||||||
|
var message = arguments[2] || 'assertRespondsTo';
|
||||||
|
try {
|
||||||
|
(obj[method] && typeof obj[method] == 'function') ? this.pass() :
|
||||||
|
this.fail(message + ": object doesn't respond to [" + method + "]"); }
|
||||||
|
catch(e) { this.error(e); }
|
||||||
|
},
|
||||||
|
assertReturnsTrue: function(method, obj) {
|
||||||
|
var message = arguments[2] || 'assertReturnsTrue';
|
||||||
|
try {
|
||||||
|
var m = obj[method];
|
||||||
|
if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
|
||||||
|
m() ? this.pass() :
|
||||||
|
this.fail(message + ": method returned false"); }
|
||||||
|
catch(e) { this.error(e); }
|
||||||
|
},
|
||||||
|
assertReturnsFalse: function(method, obj) {
|
||||||
|
var message = arguments[2] || 'assertReturnsFalse';
|
||||||
|
try {
|
||||||
|
var m = obj[method];
|
||||||
|
if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
|
||||||
|
!m() ? this.pass() :
|
||||||
|
this.fail(message + ": method returned true"); }
|
||||||
|
catch(e) { this.error(e); }
|
||||||
|
},
|
||||||
|
assertRaise: function(exceptionName, method) {
|
||||||
|
var message = arguments[2] || 'assertRaise';
|
||||||
|
try {
|
||||||
|
method();
|
||||||
|
this.fail(message + ": exception expected but none was raised"); }
|
||||||
|
catch(e) {
|
||||||
|
((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
assertElementsMatch: function() {
|
||||||
|
var expressions = $A(arguments), elements = $A(expressions.shift());
|
||||||
|
if (elements.length != expressions.length) {
|
||||||
|
this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
elements.zip(expressions).all(function(pair, index) {
|
||||||
|
var element = $(pair.first()), expression = pair.last();
|
||||||
|
if (element.match(expression)) return true;
|
||||||
|
this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
|
||||||
|
}.bind(this)) && this.pass();
|
||||||
|
},
|
||||||
|
assertElementMatches: function(element, expression) {
|
||||||
|
this.assertElementsMatch([element], expression);
|
||||||
|
},
|
||||||
|
benchmark: function(operation, iterations) {
|
||||||
|
var startAt = new Date();
|
||||||
|
(iterations || 1).times(operation);
|
||||||
|
var timeTaken = ((new Date())-startAt);
|
||||||
|
this.info((arguments[2] || 'Operation') + ' finished ' +
|
||||||
|
iterations + ' iterations in ' + (timeTaken/1000)+'s' );
|
||||||
|
return timeTaken;
|
||||||
|
},
|
||||||
_isVisible: function(element) {
|
_isVisible: function(element) {
|
||||||
element = $(element);
|
element = $(element);
|
||||||
if(!element.parentNode) return true;
|
if(!element.parentNode) return true;
|
||||||
|
@ -355,7 +468,17 @@ Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.p
|
||||||
initialize: function(name, test, setup, teardown) {
|
initialize: function(name, test, setup, teardown) {
|
||||||
Test.Unit.Assertions.prototype.initialize.bind(this)();
|
Test.Unit.Assertions.prototype.initialize.bind(this)();
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.test = test || function() {};
|
|
||||||
|
if(typeof test == 'string') {
|
||||||
|
test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
|
||||||
|
test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
|
||||||
|
this.test = function() {
|
||||||
|
eval('with(this){'+test+'}');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.test = test || function() {};
|
||||||
|
}
|
||||||
|
|
||||||
this.setup = setup || function() {};
|
this.setup = setup || function() {};
|
||||||
this.teardown = teardown || function() {};
|
this.teardown = teardown || function() {};
|
||||||
this.isWaiting = false;
|
this.isWaiting = false;
|
||||||
|
@ -381,3 +504,61 @@ Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.p
|
||||||
catch(e) { this.error(e); }
|
catch(e) { this.error(e); }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// *EXPERIMENTAL* BDD-style testing to please non-technical folk
|
||||||
|
// This draws many ideas from RSpec http://rspec.rubyforge.org/
|
||||||
|
|
||||||
|
Test.setupBDDExtensionMethods = function(){
|
||||||
|
var METHODMAP = {
|
||||||
|
shouldEqual: 'assertEqual',
|
||||||
|
shouldNotEqual: 'assertNotEqual',
|
||||||
|
shouldEqualEnum: 'assertEnumEqual',
|
||||||
|
shouldBeA: 'assertType',
|
||||||
|
shouldNotBeA: 'assertNotOfType',
|
||||||
|
shouldBeAn: 'assertType',
|
||||||
|
shouldNotBeAn: 'assertNotOfType',
|
||||||
|
shouldBeNull: 'assertNull',
|
||||||
|
shouldNotBeNull: 'assertNotNull',
|
||||||
|
|
||||||
|
shouldBe: 'assertReturnsTrue',
|
||||||
|
shouldNotBe: 'assertReturnsFalse',
|
||||||
|
shouldRespondTo: 'assertRespondsTo'
|
||||||
|
};
|
||||||
|
Test.BDDMethods = {};
|
||||||
|
for(m in METHODMAP) {
|
||||||
|
Test.BDDMethods[m] = eval(
|
||||||
|
'function(){'+
|
||||||
|
'var args = $A(arguments);'+
|
||||||
|
'var scope = args.shift();'+
|
||||||
|
'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');
|
||||||
|
}
|
||||||
|
[Array.prototype, String.prototype, Number.prototype].each(
|
||||||
|
function(p){ Object.extend(p, Test.BDDMethods) }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test.context = function(name, spec, log){
|
||||||
|
Test.setupBDDExtensionMethods();
|
||||||
|
|
||||||
|
var compiledSpec = {};
|
||||||
|
var titles = {};
|
||||||
|
for(specName in spec) {
|
||||||
|
switch(specName){
|
||||||
|
case "setup":
|
||||||
|
case "teardown":
|
||||||
|
compiledSpec[specName] = spec[specName];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
|
||||||
|
var body = spec[specName].toString().split('\n').slice(1);
|
||||||
|
if(/^\{/.test(body[0])) body = body.slice(1);
|
||||||
|
body.pop();
|
||||||
|
body = body.map(function(statement){
|
||||||
|
return statement.strip()
|
||||||
|
});
|
||||||
|
compiledSpec[testName] = body.join('\n');
|
||||||
|
titles[testName] = specName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
|
||||||
|
};
|
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
// a copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
// permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
// the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be
|
||||||
|
// included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
var Scriptaculous = {
|
||||||
|
Version: '1.7.0',
|
||||||
|
require: function(libraryName) {
|
||||||
|
// inserting via DOM fails in Safari 2.0, so brute force approach
|
||||||
|
document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
|
||||||
|
},
|
||||||
|
load: function() {
|
||||||
|
if((typeof Prototype=='undefined') ||
|
||||||
|
(typeof Element == 'undefined') ||
|
||||||
|
(typeof Element.Methods=='undefined') ||
|
||||||
|
parseFloat(Prototype.Version.split(".")[0] + "." +
|
||||||
|
Prototype.Version.split(".")[1]) < 1.5)
|
||||||
|
throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
|
||||||
|
|
||||||
|
$A(document.getElementsByTagName("script")).findAll( function(s) {
|
||||||
|
return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
|
||||||
|
}).each( function(s) {
|
||||||
|
var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
|
||||||
|
var includes = s.src.match(/\?.*load=([a-z,]*)/);
|
||||||
|
if ( includes )
|
||||||
|
includes[1].split(',').each(
|
||||||
|
function(include) { Scriptaculous.require(path+include+'.js') });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Scriptaculous.load();
|
|
@ -23,11 +23,9 @@ Object.extend(WPAjax.prototype, {
|
||||||
this.getResponseElement(responseEl);
|
this.getResponseElement(responseEl);
|
||||||
},
|
},
|
||||||
addArg: function(key, value) {
|
addArg: function(key, value) {
|
||||||
var a = $H(this.options.parameters.parseQuery());
|
var a = [];
|
||||||
a[encodeURIComponent(key)] = encodeURIComponent(value);
|
a[encodeURIComponent(key)] = encodeURIComponent(value);
|
||||||
this.options.parameters = a.map(function(pair) {
|
this.options.parameters = $H(this.options.parameters).merge($H(a));
|
||||||
return pair.join('=');
|
|
||||||
}).join('&');
|
|
||||||
},
|
},
|
||||||
getResponseElement: function(r) {
|
getResponseElement: function(r) {
|
||||||
var p = $(r + '-p');
|
var p = $(r + '-p');
|
||||||
|
|
|
@ -18,17 +18,17 @@ class WP_Scripts {
|
||||||
$this->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_gzip.php', false, '20070124' );
|
$this->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_gzip.php', false, '20070124' );
|
||||||
$mce_config = apply_filters('tiny_mce_config_url', '/wp-includes/js/tinymce/tiny_mce_config.php');
|
$mce_config = apply_filters('tiny_mce_config_url', '/wp-includes/js/tinymce/tiny_mce_config.php');
|
||||||
$this->add( 'wp_tiny_mce', $mce_config, array('tiny_mce'), '20070124' );
|
$this->add( 'wp_tiny_mce', $mce_config, array('tiny_mce'), '20070124' );
|
||||||
$this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.5.0');
|
$this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.5.0-0');
|
||||||
$this->add( 'autosave', '/wp-includes/js/autosave-js.php', array('prototype', 'sack'), '20070116');
|
$this->add( 'autosave', '/wp-includes/js/autosave-js.php', array('prototype', 'sack'), '20070116');
|
||||||
$this->add( 'wp-ajax', '/wp-includes/js/wp-ajax-js.php', array('prototype'), '20070118');
|
$this->add( 'wp-ajax', '/wp-includes/js/wp-ajax-js.php', array('prototype'), '20070118');
|
||||||
$this->add( 'listman', '/wp-includes/js/list-manipulation-js.php', array('wp-ajax', 'fat'), '20070118');
|
$this->add( 'listman', '/wp-includes/js/list-manipulation-js.php', array('wp-ajax', 'fat'), '20070118');
|
||||||
$this->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/wp-scriptaculous.js', array('prototype'), '1.6.1');
|
$this->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/wp-scriptaculous.js', array('prototype'), '1.7.0');
|
||||||
$this->add( 'scriptaculous-builder', '/wp-includes/js/scriptaculous/builder.js', array('scriptaculous-root'), '1.6.1');
|
$this->add( 'scriptaculous-builder', '/wp-includes/js/scriptaculous/builder.js', array('scriptaculous-root'), '1.7.0');
|
||||||
$this->add( 'scriptaculous-dragdrop', '/wp-includes/js/scriptaculous/dragdrop.js', array('scriptaculous-builder'), '1.6.1');
|
$this->add( 'scriptaculous-dragdrop', '/wp-includes/js/scriptaculous/dragdrop.js', array('scriptaculous-builder', 'scriptaculous-effects'), '1.7.0');
|
||||||
$this->add( 'scriptaculous-effects', '/wp-includes/js/scriptaculous/effects.js', array('scriptaculous-root'), '1.6.1');
|
$this->add( 'scriptaculous-effects', '/wp-includes/js/scriptaculous/effects.js', array('scriptaculous-root'), '1.7.0');
|
||||||
$this->add( 'scriptaculous-slider', '/wp-includes/js/scriptaculous/slider.js', array('scriptaculous-effects'), '1.6.1');
|
$this->add( 'scriptaculous-slider', '/wp-includes/js/scriptaculous/slider.js', array('scriptaculous-effects'), '1.7.0');
|
||||||
$this->add( 'scriptaculous-controls', '/wp-includes/js/scriptaculous/controls.js', array('scriptaculous-root'), '1.6.1');
|
$this->add( 'scriptaculous-controls', '/wp-includes/js/scriptaculous/controls.js', array('scriptaculous-root'), '1.7.0');
|
||||||
$this->add( 'scriptaculous', '', array('scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls'), '1.6.1');
|
$this->add( 'scriptaculous', '', array('scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls'), '1.7.0');
|
||||||
$this->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop'), '20070118');
|
$this->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop'), '20070118');
|
||||||
if ( is_admin() ) {
|
if ( is_admin() ) {
|
||||||
$this->add( 'dbx-admin-key', '/wp-admin/dbx-admin-key-js.php', array('dbx'), '3651' );
|
$this->add( 'dbx-admin-key', '/wp-admin/dbx-admin-key-js.php', array('dbx'), '3651' );
|
||||||
|
|
Loading…
Reference in New Issue