679 lines
21 KiB
JavaScript
679 lines
21 KiB
JavaScript
|
function $(element) {
|
||
|
if (arguments.length > 1) {
|
||
|
for (var i = 0, elements = [], length = arguments.length; i < length; i++)
|
||
|
elements.push($(arguments[i]));
|
||
|
return elements;
|
||
|
}
|
||
|
if (typeof element == 'string')
|
||
|
element = document.getElementById(element);
|
||
|
return Element.extend(element);
|
||
|
}
|
||
|
|
||
|
if (Prototype.BrowserFeatures.XPath) {
|
||
|
document._getElementsByXPath = function(expression, parentElement) {
|
||
|
var results = [];
|
||
|
var query = document.evaluate(expression, $(parentElement) || document,
|
||
|
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
|
||
|
for (var i = 0, length = query.snapshotLength; i < length; i++)
|
||
|
results.push(query.snapshotItem(i));
|
||
|
return results;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
document.getElementsByClassName = function(className, parentElement) {
|
||
|
if (Prototype.BrowserFeatures.XPath) {
|
||
|
var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
|
||
|
return document._getElementsByXPath(q, parentElement);
|
||
|
} else {
|
||
|
var children = ($(parentElement) || document.body).getElementsByTagName('*');
|
||
|
var elements = [], child;
|
||
|
for (var i = 0, length = children.length; i < length; i++) {
|
||
|
child = children[i];
|
||
|
if (Element.hasClassName(child, className))
|
||
|
elements.push(Element.extend(child));
|
||
|
}
|
||
|
return elements;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
if (!window.Element)
|
||
|
var Element = new Object();
|
||
|
|
||
|
Element.extend = function(element) {
|
||
|
if (!element || _nativeExtensions || element.nodeType == 3) return element;
|
||
|
|
||
|
if (!element._extended && element.tagName && element != window) {
|
||
|
var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
|
||
|
|
||
|
if (element.tagName == 'FORM')
|
||
|
Object.extend(methods, Form.Methods);
|
||
|
if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
|
||
|
Object.extend(methods, Form.Element.Methods);
|
||
|
|
||
|
Object.extend(methods, Element.Methods.Simulated);
|
||
|
|
||
|
for (var property in methods) {
|
||
|
var value = methods[property];
|
||
|
if (typeof value == 'function' && !(property in element))
|
||
|
element[property] = cache.findOrStore(value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
element._extended = true;
|
||
|
return element;
|
||
|
};
|
||
|
|
||
|
Element.extend.cache = {
|
||
|
findOrStore: function(value) {
|
||
|
return this[value] = this[value] || function() {
|
||
|
return value.apply(null, [this].concat($A(arguments)));
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Element.Methods = {
|
||
|
visible: function(element) {
|
||
|
return $(element).style.display != 'none';
|
||
|
},
|
||
|
|
||
|
toggle: function(element) {
|
||
|
element = $(element);
|
||
|
Element[Element.visible(element) ? 'hide' : 'show'](element);
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
hide: function(element) {
|
||
|
$(element).style.display = 'none';
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
show: function(element) {
|
||
|
$(element).style.display = '';
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
remove: function(element) {
|
||
|
element = $(element);
|
||
|
element.parentNode.removeChild(element);
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
update: function(element, html) {
|
||
|
html = typeof html == 'undefined' ? '' : html.toString();
|
||
|
$(element).innerHTML = html.stripScripts();
|
||
|
setTimeout(function() {html.evalScripts()}, 10);
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
replace: function(element, html) {
|
||
|
element = $(element);
|
||
|
html = typeof html == 'undefined' ? '' : html.toString();
|
||
|
if (element.outerHTML) {
|
||
|
element.outerHTML = html.stripScripts();
|
||
|
} else {
|
||
|
var range = element.ownerDocument.createRange();
|
||
|
range.selectNodeContents(element);
|
||
|
element.parentNode.replaceChild(
|
||
|
range.createContextualFragment(html.stripScripts()), element);
|
||
|
}
|
||
|
setTimeout(function() {html.evalScripts()}, 10);
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
inspect: function(element) {
|
||
|
element = $(element);
|
||
|
var result = '<' + element.tagName.toLowerCase();
|
||
|
$H({'id': 'id', 'className': 'class'}).each(function(pair) {
|
||
|
var property = pair.first(), attribute = pair.last();
|
||
|
var value = (element[property] || '').toString();
|
||
|
if (value) result += ' ' + attribute + '=' + value.inspect(true);
|
||
|
});
|
||
|
return result + '>';
|
||
|
},
|
||
|
|
||
|
recursivelyCollect: function(element, property) {
|
||
|
element = $(element);
|
||
|
var elements = [];
|
||
|
while (element = element[property])
|
||
|
if (element.nodeType == 1)
|
||
|
elements.push(Element.extend(element));
|
||
|
return elements;
|
||
|
},
|
||
|
|
||
|
ancestors: function(element) {
|
||
|
return $(element).recursivelyCollect('parentNode');
|
||
|
},
|
||
|
|
||
|
descendants: function(element) {
|
||
|
return $A($(element).getElementsByTagName('*'));
|
||
|
},
|
||
|
|
||
|
immediateDescendants: function(element) {
|
||
|
if (!(element = $(element).firstChild)) return [];
|
||
|
while (element && element.nodeType != 1) element = element.nextSibling;
|
||
|
if (element) return [element].concat($(element).nextSiblings());
|
||
|
return [];
|
||
|
},
|
||
|
|
||
|
previousSiblings: function(element) {
|
||
|
return $(element).recursivelyCollect('previousSibling');
|
||
|
},
|
||
|
|
||
|
nextSiblings: function(element) {
|
||
|
return $(element).recursivelyCollect('nextSibling');
|
||
|
},
|
||
|
|
||
|
siblings: function(element) {
|
||
|
element = $(element);
|
||
|
return element.previousSiblings().reverse().concat(element.nextSiblings());
|
||
|
},
|
||
|
|
||
|
match: function(element, selector) {
|
||
|
if (typeof selector == 'string')
|
||
|
selector = new Selector(selector);
|
||
|
return selector.match($(element));
|
||
|
},
|
||
|
|
||
|
up: function(element, expression, index) {
|
||
|
return Selector.findElement($(element).ancestors(), expression, index);
|
||
|
},
|
||
|
|
||
|
down: function(element, expression, index) {
|
||
|
return Selector.findElement($(element).descendants(), expression, index);
|
||
|
},
|
||
|
|
||
|
previous: function(element, expression, index) {
|
||
|
return Selector.findElement($(element).previousSiblings(), expression, index);
|
||
|
},
|
||
|
|
||
|
next: function(element, expression, index) {
|
||
|
return Selector.findElement($(element).nextSiblings(), expression, index);
|
||
|
},
|
||
|
|
||
|
getElementsBySelector: function() {
|
||
|
var args = $A(arguments), element = $(args.shift());
|
||
|
return Selector.findChildElements(element, args);
|
||
|
},
|
||
|
|
||
|
getElementsByClassName: function(element, className) {
|
||
|
return document.getElementsByClassName(className, element);
|
||
|
},
|
||
|
|
||
|
readAttribute: function(element, name) {
|
||
|
element = $(element);
|
||
|
if (document.all && !window.opera) {
|
||
|
var t = Element._attributeTranslations;
|
||
|
if (t.values[name]) return t.values[name](element, name);
|
||
|
if (t.names[name]) name = t.names[name];
|
||
|
var attribute = element.attributes[name];
|
||
|
if(attribute) return attribute.nodeValue;
|
||
|
}
|
||
|
return element.getAttribute(name);
|
||
|
},
|
||
|
|
||
|
getHeight: function(element) {
|
||
|
return $(element).getDimensions().height;
|
||
|
},
|
||
|
|
||
|
getWidth: function(element) {
|
||
|
return $(element).getDimensions().width;
|
||
|
},
|
||
|
|
||
|
classNames: function(element) {
|
||
|
return new Element.ClassNames(element);
|
||
|
},
|
||
|
|
||
|
hasClassName: function(element, className) {
|
||
|
if (!(element = $(element))) return;
|
||
|
var elementClassName = element.className;
|
||
|
if (elementClassName.length == 0) return false;
|
||
|
if (elementClassName == className ||
|
||
|
elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
|
||
|
return true;
|
||
|
return false;
|
||
|
},
|
||
|
|
||
|
addClassName: function(element, className) {
|
||
|
if (!(element = $(element))) return;
|
||
|
Element.classNames(element).add(className);
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
removeClassName: function(element, className) {
|
||
|
if (!(element = $(element))) return;
|
||
|
Element.classNames(element).remove(className);
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
toggleClassName: function(element, className) {
|
||
|
if (!(element = $(element))) return;
|
||
|
Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
observe: function() {
|
||
|
Event.observe.apply(Event, arguments);
|
||
|
return $A(arguments).first();
|
||
|
},
|
||
|
|
||
|
stopObserving: function() {
|
||
|
Event.stopObserving.apply(Event, arguments);
|
||
|
return $A(arguments).first();
|
||
|
},
|
||
|
|
||
|
// removes whitespace-only text node children
|
||
|
cleanWhitespace: function(element) {
|
||
|
element = $(element);
|
||
|
var node = element.firstChild;
|
||
|
while (node) {
|
||
|
var nextNode = node.nextSibling;
|
||
|
if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
|
||
|
element.removeChild(node);
|
||
|
node = nextNode;
|
||
|
}
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
empty: function(element) {
|
||
|
return $(element).innerHTML.match(/^\s*$/);
|
||
|
},
|
||
|
|
||
|
descendantOf: function(element, ancestor) {
|
||
|
element = $(element), ancestor = $(ancestor);
|
||
|
while (element = element.parentNode)
|
||
|
if (element == ancestor) return true;
|
||
|
return false;
|
||
|
},
|
||
|
|
||
|
scrollTo: function(element) {
|
||
|
element = $(element);
|
||
|
var pos = Position.cumulativeOffset(element);
|
||
|
window.scrollTo(pos[0], pos[1]);
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
getStyle: function(element, style) {
|
||
|
element = $(element);
|
||
|
if (['float','cssFloat'].include(style))
|
||
|
style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
|
||
|
style = style.camelize();
|
||
|
var value = element.style[style];
|
||
|
if (!value) {
|
||
|
if (document.defaultView && document.defaultView.getComputedStyle) {
|
||
|
var css = document.defaultView.getComputedStyle(element, null);
|
||
|
value = css ? css[style] : null;
|
||
|
} else if (element.currentStyle) {
|
||
|
value = element.currentStyle[style];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
|
||
|
value = element['offset'+style.capitalize()] + 'px';
|
||
|
|
||
|
if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
|
||
|
if (Element.getStyle(element, 'position') == 'static') value = 'auto';
|
||
|
if(style == 'opacity') {
|
||
|
if(value) return parseFloat(value);
|
||
|
if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
|
||
|
if(value[1]) return parseFloat(value[1]) / 100;
|
||
|
return 1.0;
|
||
|
}
|
||
|
return value == 'auto' ? null : value;
|
||
|
},
|
||
|
|
||
|
setStyle: function(element, style) {
|
||
|
element = $(element);
|
||
|
for (var name in style) {
|
||
|
var value = style[name];
|
||
|
if(name == 'opacity') {
|
||
|
if (value == 1) {
|
||
|
value = (/Gecko/.test(navigator.userAgent) &&
|
||
|
!/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
|
||
|
if(/MSIE/.test(navigator.userAgent) && !window.opera)
|
||
|
element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
|
||
|
} else if(value == '') {
|
||
|
if(/MSIE/.test(navigator.userAgent) && !window.opera)
|
||
|
element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
|
||
|
} else {
|
||
|
if(value < 0.00001) value = 0;
|
||
|
if(/MSIE/.test(navigator.userAgent) && !window.opera)
|
||
|
element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
|
||
|
'alpha(opacity='+value*100+')';
|
||
|
}
|
||
|
} else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
|
||
|
element.style[name.camelize()] = value;
|
||
|
}
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
getDimensions: function(element) {
|
||
|
element = $(element);
|
||
|
var display = $(element).getStyle('display');
|
||
|
if (display != 'none' && display != null) // Safari bug
|
||
|
return {width: element.offsetWidth, height: element.offsetHeight};
|
||
|
|
||
|
// All *Width and *Height properties give 0 on elements with display none,
|
||
|
// so enable the element temporarily
|
||
|
var els = element.style;
|
||
|
var originalVisibility = els.visibility;
|
||
|
var originalPosition = els.position;
|
||
|
var originalDisplay = els.display;
|
||
|
els.visibility = 'hidden';
|
||
|
els.position = 'absolute';
|
||
|
els.display = 'block';
|
||
|
var originalWidth = element.clientWidth;
|
||
|
var originalHeight = element.clientHeight;
|
||
|
els.display = originalDisplay;
|
||
|
els.position = originalPosition;
|
||
|
els.visibility = originalVisibility;
|
||
|
return {width: originalWidth, height: originalHeight};
|
||
|
},
|
||
|
|
||
|
makePositioned: function(element) {
|
||
|
element = $(element);
|
||
|
var pos = Element.getStyle(element, 'position');
|
||
|
if (pos == 'static' || !pos) {
|
||
|
element._madePositioned = true;
|
||
|
element.style.position = 'relative';
|
||
|
// Opera returns the offset relative to the positioning context, when an
|
||
|
// element is position relative but top and left have not been defined
|
||
|
if (window.opera) {
|
||
|
element.style.top = 0;
|
||
|
element.style.left = 0;
|
||
|
}
|
||
|
}
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
undoPositioned: function(element) {
|
||
|
element = $(element);
|
||
|
if (element._madePositioned) {
|
||
|
element._madePositioned = undefined;
|
||
|
element.style.position =
|
||
|
element.style.top =
|
||
|
element.style.left =
|
||
|
element.style.bottom =
|
||
|
element.style.right = '';
|
||
|
}
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
makeClipping: function(element) {
|
||
|
element = $(element);
|
||
|
if (element._overflow) return element;
|
||
|
element._overflow = element.style.overflow || 'auto';
|
||
|
if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
|
||
|
element.style.overflow = 'hidden';
|
||
|
return element;
|
||
|
},
|
||
|
|
||
|
undoClipping: function(element) {
|
||
|
element = $(element);
|
||
|
if (!element._overflow) return element;
|
||
|
element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
|
||
|
element._overflow = null;
|
||
|
return element;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
|
||
|
|
||
|
Element._attributeTranslations = {};
|
||
|
|
||
|
Element._attributeTranslations.names = {
|
||
|
colspan: "colSpan",
|
||
|
rowspan: "rowSpan",
|
||
|
valign: "vAlign",
|
||
|
datetime: "dateTime",
|
||
|
accesskey: "accessKey",
|
||
|
tabindex: "tabIndex",
|
||
|
enctype: "encType",
|
||
|
maxlength: "maxLength",
|
||
|
readonly: "readOnly",
|
||
|
longdesc: "longDesc"
|
||
|
};
|
||
|
|
||
|
Element._attributeTranslations.values = {
|
||
|
_getAttr: function(element, attribute) {
|
||
|
return element.getAttribute(attribute, 2);
|
||
|
},
|
||
|
|
||
|
_flag: function(element, attribute) {
|
||
|
return $(element).hasAttribute(attribute) ? attribute : null;
|
||
|
},
|
||
|
|
||
|
style: function(element) {
|
||
|
return element.style.cssText.toLowerCase();
|
||
|
},
|
||
|
|
||
|
title: function(element) {
|
||
|
var node = element.getAttributeNode('title');
|
||
|
return node.specified ? node.nodeValue : null;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Object.extend(Element._attributeTranslations.values, {
|
||
|
href: Element._attributeTranslations.values._getAttr,
|
||
|
src: Element._attributeTranslations.values._getAttr,
|
||
|
disabled: Element._attributeTranslations.values._flag,
|
||
|
checked: Element._attributeTranslations.values._flag,
|
||
|
readonly: Element._attributeTranslations.values._flag,
|
||
|
multiple: Element._attributeTranslations.values._flag
|
||
|
});
|
||
|
|
||
|
Element.Methods.Simulated = {
|
||
|
hasAttribute: function(element, attribute) {
|
||
|
var t = Element._attributeTranslations;
|
||
|
attribute = t.names[attribute] || attribute;
|
||
|
return $(element).getAttributeNode(attribute).specified;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// IE is missing .innerHTML support for TABLE-related elements
|
||
|
if (document.all && !window.opera){
|
||
|
Element.Methods.update = function(element, html) {
|
||
|
element = $(element);
|
||
|
html = typeof html == 'undefined' ? '' : html.toString();
|
||
|
var tagName = element.tagName.toUpperCase();
|
||
|
if (['THEAD','TBODY','TR','TD'].include(tagName)) {
|
||
|
var div = document.createElement('div');
|
||
|
switch (tagName) {
|
||
|
case 'THEAD':
|
||
|
case 'TBODY':
|
||
|
div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>';
|
||
|
depth = 2;
|
||
|
break;
|
||
|
case 'TR':
|
||
|
div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>';
|
||
|
depth = 3;
|
||
|
break;
|
||
|
case 'TD':
|
||
|
div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>';
|
||
|
depth = 4;
|
||
|
}
|
||
|
$A(element.childNodes).each(function(node){
|
||
|
element.removeChild(node)
|
||
|
});
|
||
|
depth.times(function(){ div = div.firstChild });
|
||
|
|
||
|
$A(div.childNodes).each(
|
||
|
function(node){ element.appendChild(node) });
|
||
|
} else {
|
||
|
element.innerHTML = html.stripScripts();
|
||
|
}
|
||
|
setTimeout(function() {html.evalScripts()}, 10);
|
||
|
return element;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Object.extend(Element, Element.Methods);
|
||
|
|
||
|
var _nativeExtensions = false;
|
||
|
|
||
|
if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
|
||
|
['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
|
||
|
var className = 'HTML' + tag + 'Element';
|
||
|
if(window[className]) return;
|
||
|
var klass = window[className] = {};
|
||
|
klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
|
||
|
});
|
||
|
|
||
|
Element.addMethods = function(methods) {
|
||
|
Object.extend(Element.Methods, methods || {});
|
||
|
|
||
|
function copy(methods, destination, onlyIfAbsent) {
|
||
|
onlyIfAbsent = onlyIfAbsent || false;
|
||
|
var cache = Element.extend.cache;
|
||
|
for (var property in methods) {
|
||
|
var value = methods[property];
|
||
|
if (!onlyIfAbsent || !(property in destination))
|
||
|
destination[property] = cache.findOrStore(value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (typeof HTMLElement != 'undefined') {
|
||
|
copy(Element.Methods, HTMLElement.prototype);
|
||
|
copy(Element.Methods.Simulated, HTMLElement.prototype, true);
|
||
|
copy(Form.Methods, HTMLFormElement.prototype);
|
||
|
[HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
|
||
|
copy(Form.Element.Methods, klass.prototype);
|
||
|
});
|
||
|
_nativeExtensions = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var Toggle = new Object();
|
||
|
Toggle.display = Element.toggle;
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
Abstract.Insertion = function(adjacency) {
|
||
|
this.adjacency = adjacency;
|
||
|
}
|
||
|
|
||
|
Abstract.Insertion.prototype = {
|
||
|
initialize: function(element, content) {
|
||
|
this.element = $(element);
|
||
|
this.content = content.stripScripts();
|
||
|
|
||
|
if (this.adjacency && this.element.insertAdjacentHTML) {
|
||
|
try {
|
||
|
this.element.insertAdjacentHTML(this.adjacency, this.content);
|
||
|
} catch (e) {
|
||
|
var tagName = this.element.tagName.toUpperCase();
|
||
|
if (['TBODY', 'TR'].include(tagName)) {
|
||
|
this.insertContent(this.contentFromAnonymousTable());
|
||
|
} else {
|
||
|
throw e;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
this.range = this.element.ownerDocument.createRange();
|
||
|
if (this.initializeRange) this.initializeRange();
|
||
|
this.insertContent([this.range.createContextualFragment(this.content)]);
|
||
|
}
|
||
|
|
||
|
setTimeout(function() {content.evalScripts()}, 10);
|
||
|
},
|
||
|
|
||
|
contentFromAnonymousTable: function() {
|
||
|
var div = document.createElement('div');
|
||
|
div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
|
||
|
return $A(div.childNodes[0].childNodes[0].childNodes);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var Insertion = new Object();
|
||
|
|
||
|
Insertion.Before = Class.create();
|
||
|
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
|
||
|
initializeRange: function() {
|
||
|
this.range.setStartBefore(this.element);
|
||
|
},
|
||
|
|
||
|
insertContent: function(fragments) {
|
||
|
fragments.each((function(fragment) {
|
||
|
this.element.parentNode.insertBefore(fragment, this.element);
|
||
|
}).bind(this));
|
||
|
}
|
||
|
});
|
||
|
|
||
|
Insertion.Top = Class.create();
|
||
|
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
|
||
|
initializeRange: function() {
|
||
|
this.range.selectNodeContents(this.element);
|
||
|
this.range.collapse(true);
|
||
|
},
|
||
|
|
||
|
insertContent: function(fragments) {
|
||
|
fragments.reverse(false).each((function(fragment) {
|
||
|
this.element.insertBefore(fragment, this.element.firstChild);
|
||
|
}).bind(this));
|
||
|
}
|
||
|
});
|
||
|
|
||
|
Insertion.Bottom = Class.create();
|
||
|
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
|
||
|
initializeRange: function() {
|
||
|
this.range.selectNodeContents(this.element);
|
||
|
this.range.collapse(this.element);
|
||
|
},
|
||
|
|
||
|
insertContent: function(fragments) {
|
||
|
fragments.each((function(fragment) {
|
||
|
this.element.appendChild(fragment);
|
||
|
}).bind(this));
|
||
|
}
|
||
|
});
|
||
|
|
||
|
Insertion.After = Class.create();
|
||
|
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
|
||
|
initializeRange: function() {
|
||
|
this.range.setStartAfter(this.element);
|
||
|
},
|
||
|
|
||
|
insertContent: function(fragments) {
|
||
|
fragments.each((function(fragment) {
|
||
|
this.element.parentNode.insertBefore(fragment,
|
||
|
this.element.nextSibling);
|
||
|
}).bind(this));
|
||
|
}
|
||
|
});
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
Element.ClassNames = Class.create();
|
||
|
Element.ClassNames.prototype = {
|
||
|
initialize: function(element) {
|
||
|
this.element = $(element);
|
||
|
},
|
||
|
|
||
|
_each: function(iterator) {
|
||
|
this.element.className.split(/\s+/).select(function(name) {
|
||
|
return name.length > 0;
|
||
|
})._each(iterator);
|
||
|
},
|
||
|
|
||
|
set: function(className) {
|
||
|
this.element.className = className;
|
||
|
},
|
||
|
|
||
|
add: function(classNameToAdd) {
|
||
|
if (this.include(classNameToAdd)) return;
|
||
|
this.set($A(this).concat(classNameToAdd).join(' '));
|
||
|
},
|
||
|
|
||
|
remove: function(classNameToRemove) {
|
||
|
if (!this.include(classNameToRemove)) return;
|
||
|
this.set($A(this).without(classNameToRemove).join(' '));
|
||
|
},
|
||
|
|
||
|
toString: function() {
|
||
|
return $A(this).join(' ');
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Object.extend(Element.ClassNames.prototype, Enumerable);
|