Documents at 65%. Display folders and documents, no pagination yet.. Posible to create Folders and upload external files. Working on Download, search
This commit is contained in:
438
gulliver/js/ext/ux.locationbar/Ext.ux.LocationBar.js
Executable file
438
gulliver/js/ext/ux.locationbar/Ext.ux.LocationBar.js
Executable file
@@ -0,0 +1,438 @@
|
||||
/*
|
||||
* Copyright 2008, brainbits GmbH All rights reserved.
|
||||
* Author: Stephan Wentz. swentz[at]brainbits.net
|
||||
*
|
||||
* http://www.brainbits.net/
|
||||
*/
|
||||
|
||||
/**
|
||||
* LocationBar class
|
||||
* Version: 0.1
|
||||
* @class Ext.ux.Locationbar
|
||||
* @extends Ext.Toolbar
|
||||
* Locationbar class.
|
||||
* @constructor
|
||||
* Creates a new LocationBar
|
||||
* @param {Object/Array} config A config object or an array of buttons to add
|
||||
*/
|
||||
Ext.ux.LocationBar = Ext.extend(Ext.Toolbar, {
|
||||
|
||||
/**
|
||||
* @cfg {Number} maxItem Maximum number of items the Locationbar takes before the first items are removed (defaults to 15).
|
||||
* Set to 0 for unlimited items.
|
||||
*/
|
||||
maxItems: 15,
|
||||
|
||||
/**
|
||||
* @cfg {String} emptyText The that is shown if no history is available (defaults to 'No node selected.').
|
||||
*/
|
||||
emptyText: 'No node selected.',
|
||||
|
||||
/**
|
||||
* @cfg {Boolean} noReload If set to true the reload button will not be visible (defaults to false).
|
||||
*/
|
||||
noReload: false,
|
||||
|
||||
/**
|
||||
* @cfg {Function} selectHandler The function to
|
||||
* call when clicked. Arguments passed are:<ul>
|
||||
* <li><b>node</b> : Object<p style="margin-left:1em">The node associated with the clicked item.</p></li>
|
||||
* </ul>
|
||||
*/
|
||||
selectHandler: null,
|
||||
|
||||
/**
|
||||
* @cfg {Function} reloadHandler The function to
|
||||
* call when clicked. Arguments passed are:<ul>
|
||||
* <li><b>node</b> : Object<p style="margin-left:1em">The node associated with the current item.</p></li>
|
||||
* </ul>
|
||||
*/
|
||||
reloadHandler: null,
|
||||
|
||||
/**
|
||||
* @cfg {String} locationItems Initial items (defaults to []).
|
||||
*/
|
||||
locationItems: [],
|
||||
|
||||
/**
|
||||
* @cfg {String} folderIconCls Iconclass for folder icons.
|
||||
*/
|
||||
folderIconCls: 'x-locationbar-folder-icon',
|
||||
|
||||
/**
|
||||
* @cfg {String} folderIconCls Iconclass for the backward icon.
|
||||
*/
|
||||
backwardIconCls: 'x-locationbar-back-icon',
|
||||
|
||||
/**
|
||||
* @cfg {String} folderIconCls Iconclass for the forward icon.
|
||||
*/
|
||||
forwardIconCls: 'x-locationbar-forward-icon',
|
||||
|
||||
/**
|
||||
* @cfg {String} folderIconCls Iconclass for the reload icon.
|
||||
*/
|
||||
reloadIconCls: 'x-locationbar-reload-icon',
|
||||
|
||||
/**
|
||||
* @cfg {Ext.tree.TreePanel} tree The treePanel this Locationbar is associated with.
|
||||
*/
|
||||
tree: null,
|
||||
|
||||
// private
|
||||
historyItemNodes: {},
|
||||
|
||||
// private
|
||||
historyItems: [],
|
||||
|
||||
// private
|
||||
currentItem: false,
|
||||
|
||||
// private
|
||||
historyNext: true,
|
||||
|
||||
// private
|
||||
initComponent: function() {
|
||||
//console.log("initComponent location bar");
|
||||
if(this.tree) {
|
||||
//console.log("tree exists");
|
||||
//console.debug(this.tree);
|
||||
//console.log("adding listener LOAD");
|
||||
this.tree.getLoader().addListener('load',function(tl,node,resp){
|
||||
//console.log("tree get loader LOAD -> "+node);
|
||||
if(node){
|
||||
node.loaded=true;
|
||||
this.setNode(node);
|
||||
}
|
||||
},this);
|
||||
//console.log("complete listener LOAD");
|
||||
//console.log("adding listenr SELECTIONCHANGE");
|
||||
this.tree.getSelectionModel().addListener('selectionchange', function(sm, node) {
|
||||
//console.log("tree get loader SELECTION CHANGE");
|
||||
if( node && node.id ) {
|
||||
//console.log("changing to dir (form location bar) "+node.id);
|
||||
chDir( node.id, true );
|
||||
}
|
||||
if (node.isLeaf()==false && node.childNodes.length==0){
|
||||
//console.log(node.isLeaf(),node.childNodes.length)
|
||||
this.nodeJustLoaded=node;
|
||||
//this.tree.getLoader().load(node);
|
||||
//this.loadNode(node);
|
||||
}else{
|
||||
this.setNode(node);
|
||||
}
|
||||
}, this);
|
||||
//console.log("complete add listener SELECTIONCHANGE");
|
||||
|
||||
}
|
||||
|
||||
//this.addListener('render', this.repaint, this);
|
||||
|
||||
// Ext.ux.LocationBar.superclass.initComponent.call(this);
|
||||
},
|
||||
|
||||
// private
|
||||
autoCreate: {
|
||||
cls:'x-toolbar x-small-editor x-locationbar',
|
||||
html:'<table cellspacing="0"><tr></tr></table>'
|
||||
},
|
||||
|
||||
// private
|
||||
onRender: function(ct, position) {
|
||||
Ext.ux.LocationBar.superclass.onRender.call(this, ct, position);
|
||||
|
||||
this.repaint();
|
||||
},
|
||||
|
||||
// private
|
||||
onClick: function(node) {
|
||||
if (this.selectHandler) {
|
||||
this.selectHandler(node);
|
||||
} else {
|
||||
if(node.parentNode) {
|
||||
node.parentNode.expand(false,true);
|
||||
node.ensureVisible();
|
||||
}
|
||||
node.select();
|
||||
}
|
||||
},
|
||||
|
||||
// private
|
||||
onReload: function(node) {
|
||||
if (this.reloadHandler) {
|
||||
this.reloadHandler(node);
|
||||
} else if(node.reload) {
|
||||
node.reload();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Clears all items from the LocationBar.
|
||||
*/
|
||||
clear: function() {
|
||||
this.locationItems = [];
|
||||
|
||||
this.repaint;
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets the current Treenode
|
||||
* If a tree was provided as a config to this LocationBar, this should
|
||||
* be called automatically.
|
||||
* @param {Ext.ux.TreeNode} node The currently selected TreeNode
|
||||
*/
|
||||
setNode: function(node) {
|
||||
var path = [];
|
||||
var pNode = node;
|
||||
var i;
|
||||
do {
|
||||
var conf = {
|
||||
text: pNode.attributes.text,
|
||||
node: pNode,
|
||||
handler: this.onClick.createDelegate(this, [pNode], false)
|
||||
};
|
||||
if (pNode.childNodes.length) {
|
||||
var childs = [];
|
||||
|
||||
for (i = 0; i < pNode.childNodes.length; i++) {
|
||||
|
||||
childs[i] = {
|
||||
text: pNode.childNodes[i].attributes.text,
|
||||
node: pNode.childNodes[i],
|
||||
iconCls: this.folderIconCls,
|
||||
handler: this.onClick.createDelegate(this, [pNode.childNodes[i]], false)
|
||||
};
|
||||
}
|
||||
conf.xtype = 'tbsplit';
|
||||
conf.menu = childs;
|
||||
}
|
||||
conf.fullPath = pNode.getPath('text').substr(1);
|
||||
path.unshift(conf);
|
||||
} while (pNode.parentNode && (pNode = pNode.parentNode) && pNode.id != 'root');
|
||||
|
||||
this.locationItems = [];
|
||||
|
||||
for(i=0; i<path.length; i++) {
|
||||
this.addPathItemRaw(path[i]);
|
||||
}
|
||||
this.currentItem = path[path.length - 1];
|
||||
|
||||
this.addHistoryItemRaw(this.currentItem);
|
||||
|
||||
this.repaint();
|
||||
},
|
||||
|
||||
// private
|
||||
addHistoryItemRaw: function(item){
|
||||
if(this.historyItems.indexOf(item.text) != -1) {
|
||||
this.historyItems.remove(item.text);
|
||||
delete this.historyItemNodes[item.text];
|
||||
}
|
||||
|
||||
this.historyItems.push(item.text);
|
||||
this.historyItemNodes[item.text] = item;
|
||||
},
|
||||
|
||||
// private
|
||||
addPathItemRaw: function(item){
|
||||
// if number of items > maxItems, remove last
|
||||
if(this.maxItems && this.locationItems.length > this.maxItems) {
|
||||
this.locationItems.pop();
|
||||
}
|
||||
|
||||
// put new item at the end
|
||||
this.locationItems.push(item);
|
||||
},
|
||||
|
||||
// private
|
||||
repaint: function() {
|
||||
if (this.items && this.items.length) {
|
||||
var _doLayout = true;
|
||||
this.items.each(function(item){
|
||||
this.items.remove(item);
|
||||
item.destroy();
|
||||
}, this.items);
|
||||
} else {
|
||||
var _doLayout = false;
|
||||
}
|
||||
try {
|
||||
this.items.each(function(item){
|
||||
this.items.remove(item);
|
||||
item.destroy();
|
||||
}, this.items);
|
||||
} catch(e) {}
|
||||
// back button
|
||||
this.add({
|
||||
cls: 'x-btn-icon',
|
||||
iconCls: this.backwardIconCls,
|
||||
handler: function() {
|
||||
this.historyNext = this.historyItems.pop();
|
||||
var itemKey = this.historyItems.pop();
|
||||
var item = this.historyItemNodes[itemKey];
|
||||
this.onClick(item.node);
|
||||
},
|
||||
scope: this,
|
||||
disabled: this.historyItems.length > 1 ? false : true
|
||||
});
|
||||
|
||||
// forward button
|
||||
// TODO: disabled, FUBAR
|
||||
this.add({
|
||||
cls: 'x-btn-icon',
|
||||
iconCls: this.forwardIconCls,
|
||||
handler: function() {
|
||||
var node = this.historyNext.node;
|
||||
this.historyNext = false;
|
||||
this.onClick(node);
|
||||
},
|
||||
scope: this,
|
||||
disabled: true //this.historyNext ? false : true
|
||||
});
|
||||
|
||||
this.add(' ','-',' ');
|
||||
|
||||
if (this.locationItems.length) {
|
||||
// folder icon
|
||||
this.add({
|
||||
cls: 'x-btn-icon',
|
||||
iconCls: this.folderIconCls,
|
||||
ctCls: 'x-locationbar-location x-locationbar-location-first',
|
||||
disabled: true
|
||||
});
|
||||
|
||||
var text;
|
||||
for (var i = 0; i < this.locationItems.length; i++) {
|
||||
var locationItem = this.locationItems[i];
|
||||
|
||||
var item = {};
|
||||
|
||||
if (typeof locationItem == 'object') {
|
||||
item = locationItem;
|
||||
}
|
||||
else {
|
||||
item.text = locationItem;
|
||||
}
|
||||
|
||||
if(!item.text) {
|
||||
item.text = 'n/a';
|
||||
}
|
||||
|
||||
item.handler = this.onClick.createDelegate(this, [locationItem.node], false);
|
||||
|
||||
item.ctCls = 'x-locationbar-location';
|
||||
|
||||
this.add(item);
|
||||
}
|
||||
|
||||
// spacer
|
||||
this.addItem(
|
||||
{
|
||||
cls: 'x-locationbar-location x-locationbar-location-last',
|
||||
xtype: 'tbfill'
|
||||
});
|
||||
|
||||
menu = [];
|
||||
for(var i=this.historyItems.length-2; i>=0; i--) {
|
||||
menu.push({
|
||||
text: this.historyItemNodes[this.historyItems[i]].fullPath,
|
||||
iconCls: this.folderIconCls,
|
||||
node: this.historyItemNodes[this.historyItems[i]].node,
|
||||
handler: function(item) {
|
||||
this.onClick(item.node);
|
||||
},
|
||||
scope: this
|
||||
});
|
||||
}
|
||||
this.add({
|
||||
cls: 'x-btn-icon',
|
||||
ctCls: 'x-locationbar-location x-locationbar-location-last',
|
||||
menuAlign: 'tr-br?',
|
||||
menu: menu
|
||||
});
|
||||
if(!this.noReload) {
|
||||
this.add(' ');
|
||||
// reload button
|
||||
this.add({
|
||||
cls: 'x-btn-icon',
|
||||
iconCls: this.reloadIconCls,
|
||||
handler: function() {
|
||||
this.onReload(this.currentItem.node);
|
||||
},
|
||||
scope: this
|
||||
});
|
||||
}
|
||||
this.add(' ');
|
||||
} else {
|
||||
this.add({
|
||||
cls: 'x-btn-icon',
|
||||
iconCls: this.folderIconCls,
|
||||
ctCls: 'x-locationbar-location x-locationbar-location-first',
|
||||
disabled: true
|
||||
});
|
||||
|
||||
if(this.emptyText) {
|
||||
this.add({
|
||||
xtype: 'lbtext',
|
||||
text: this.emptyText
|
||||
});
|
||||
}
|
||||
|
||||
this.addItem(new Ext.ux.LocationBar.Fill());
|
||||
|
||||
this.add({
|
||||
cls: 'x-btn-icon',
|
||||
ctCls: 'x-locationbar-location x-locationbar-location-last',
|
||||
menuAlign: 'tr-br?',
|
||||
disabled: true
|
||||
});
|
||||
this.add(' ');
|
||||
this.add({
|
||||
cls: 'x-btn-icon',
|
||||
iconCls: this.reloadIconCls,
|
||||
disabled: true
|
||||
});
|
||||
this.add(' ');
|
||||
}
|
||||
if (_doLayout === true) {
|
||||
this.doLayout();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
Ext.reg('locationbar', Ext.ux.LocationBar);
|
||||
|
||||
Ext.ux.Fill = Ext.extend(Ext.Toolbar.Spacer, {
|
||||
// private
|
||||
render : function(td){
|
||||
|
||||
td.style.width = '100%';
|
||||
Ext.fly(td).addClass('x-locationbar-location');
|
||||
Ext.ux.Fill.superclass.render.call(this, td);
|
||||
}
|
||||
});
|
||||
Ext.reg('tbfill', Ext.ux.Fill);
|
||||
|
||||
Ext.ux.LocationBar.Fill = Ext.extend(Ext.Toolbar.Fill, {
|
||||
// private
|
||||
render : function(td){
|
||||
td.className = 'x-locationbar-location';
|
||||
|
||||
// insert a
|
||||
var data = document.createTextNode('\u00a0');
|
||||
this.el.appendChild(data);
|
||||
|
||||
Ext.ux.LocationBar.Fill.superclass.render.call(this, td);
|
||||
}
|
||||
});
|
||||
Ext.reg('lbfill', Ext.ux.LocationBar.Fill);
|
||||
|
||||
Ext.ux.LocationBar.TextItem = Ext.extend(Ext.Toolbar.TextItem, {
|
||||
// private
|
||||
render : function(td){
|
||||
td.className = 'x-locationbar-location';
|
||||
|
||||
Ext.ux.LocationBar.Fill.superclass.render.call(this, td);
|
||||
}
|
||||
});
|
||||
Ext.reg('lbtext', Ext.ux.LocationBar.TextItem);
|
||||
80
gulliver/js/ext/ux.statusbar/ext-statusbar.js
Executable file
80
gulliver/js/ext/ux.statusbar/ext-statusbar.js
Executable file
@@ -0,0 +1,80 @@
|
||||
Ext.namespace('Ext.ux');
|
||||
|
||||
Ext.ux.StatusBar = Ext.extend(Ext.Toolbar, {
|
||||
textId: '',
|
||||
defaultText: '',
|
||||
autoClear: 5000,
|
||||
task: null,
|
||||
initComponent: function() {
|
||||
this.textId = Ext.id();
|
||||
this.defaultText = this.initialConfig.defaultText || '';
|
||||
var text = this.initialConfig.text || this.defaultText;
|
||||
|
||||
var config = {
|
||||
items: [
|
||||
'<span id="'+this.textId+'">'+text+'</span>', // status text
|
||||
'->' // make it greedy
|
||||
]
|
||||
};
|
||||
if (this.initialConfig.items) {
|
||||
config.items = config.items.concat(this.initialConfig.items);
|
||||
delete this.initialConfig.items;
|
||||
}
|
||||
Ext.apply(this, Ext.apply(this.initialConfig, config));
|
||||
Ext.ux.StatusBar.superclass.initComponent.apply(this, arguments);
|
||||
this.task = new Ext.util.DelayedTask(function() {
|
||||
var el = Ext.get(this.textId);
|
||||
var defaultText = this.defaultText;
|
||||
el.fadeOut({
|
||||
callback: function() {
|
||||
el.update(defaultText);
|
||||
el.show();
|
||||
},
|
||||
duration: 1
|
||||
});
|
||||
}, this);
|
||||
},
|
||||
onRender: function() {
|
||||
Ext.ux.StatusBar.superclass.onRender.apply(this, arguments);
|
||||
},
|
||||
setText: function(text) {
|
||||
var el = Ext.get(this.textId);
|
||||
el.update(text);
|
||||
},
|
||||
setStatus: function(config) {
|
||||
var defaults = {
|
||||
clear: {
|
||||
wait: this.autoClear,
|
||||
anim: true,
|
||||
useDefaults: true
|
||||
}
|
||||
};
|
||||
|
||||
if (config.clear === true) {
|
||||
delete config.clear;
|
||||
}
|
||||
if (!Ext.isArray(config)) {
|
||||
config = {
|
||||
text: config.text || ''
|
||||
}
|
||||
}
|
||||
Ext.apply(config, defaults);
|
||||
var el = Ext.get(this.textId);
|
||||
el.update(config.text);
|
||||
var clear = config.clear;
|
||||
var defaultText = this.defaultText;
|
||||
if (clear.wait) {
|
||||
this.task.delay(clear.wait);
|
||||
}
|
||||
else {
|
||||
this.task.cancel();
|
||||
}
|
||||
},
|
||||
clearStatus: function() {
|
||||
this.setText(this.defaultText);
|
||||
this.task.cancel();
|
||||
},
|
||||
showBusy: function(msg) {
|
||||
// stub for now
|
||||
}
|
||||
});
|
||||
159
gulliver/js/ext/ux.treefilterx/Ext.ux.tree.TreeFilterX.js
Executable file
159
gulliver/js/ext/ux.treefilterx/Ext.ux.tree.TreeFilterX.js
Executable file
@@ -0,0 +1,159 @@
|
||||
// vim: ts=4:sw=4:nu:fdc=4:nospell
|
||||
/* global Ext */
|
||||
/**
|
||||
* @class Ext.ux.tree.TreeFilterX
|
||||
* @extends Ext.tree.TreeFilter
|
||||
*
|
||||
* <p>
|
||||
* Shows also parents of matching nodes as opposed to default TreeFilter. In
|
||||
* other words this filter works "deep way".
|
||||
* </p>
|
||||
*
|
||||
* @author Ing. Jozef Sakáloš
|
||||
* @version 1.0
|
||||
* @date 17. December 2008
|
||||
* @revision $Id: Ext.ux.tree.TreeFilterX.js 589 2009-02-21 23:30:18Z jozo $
|
||||
* @see <a
|
||||
* href="http://extjs.com/forum/showthread.php?p=252709">http://extjs.com/forum/showthread.php?p=252709</a>
|
||||
*
|
||||
* @license Ext.ux.tree.CheckTreePanel is licensed under the terms of the Open
|
||||
* Source LGPL 3.0 license. Commercial use is permitted to the extent
|
||||
* that the code/component(s) do NOT become part of another Open Source
|
||||
* or Commercially licensed development library or toolkit without
|
||||
* explicit permission.
|
||||
*
|
||||
* <p>
|
||||
* License details: <a href="http://www.gnu.org/licenses/lgpl.html"
|
||||
* target="_blank">http://www.gnu.org/licenses/lgpl.html</a>
|
||||
* </p>
|
||||
*
|
||||
* @forum 55489
|
||||
* @demo http://remotetree.extjs.eu
|
||||
*
|
||||
* @donate <form action="https://www.paypal.com/cgi-bin/webscr" method="post"
|
||||
* target="_blank"> <input type="hidden" name="cmd" value="_s-xclick">
|
||||
* <input type="hidden" name="hosted_button_id" value="3430419"> <input
|
||||
* type="image"
|
||||
* src="https://www.paypal.com/en_US/i/btn/x-click-butcc-donate.gif"
|
||||
* border="0" name="submit" alt="PayPal - The safer, easier way to pay
|
||||
* online."> <img alt="" border="0"
|
||||
* src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1"
|
||||
* height="1"> </form>
|
||||
*/
|
||||
|
||||
Ext.ns('Ext.ux.tree');
|
||||
|
||||
/**
|
||||
* Creates new TreeFilterX
|
||||
*
|
||||
* @constructor
|
||||
* @param {Ext.tree.TreePanel}
|
||||
* tree The tree panel to attach this filter to
|
||||
* @param {Object}
|
||||
* config A config object of this filter
|
||||
*/
|
||||
Ext.ux.tree.TreeFilterX = Ext.extend(Ext.tree.TreeFilter, {
|
||||
/**
|
||||
* @cfg {Boolean} expandOnFilter Deeply expands startNode before filtering
|
||||
* (defaults to true)
|
||||
*/
|
||||
expandOnFilter : true
|
||||
|
||||
// {{{
|
||||
/**
|
||||
* Filter the data by a specific attribute.
|
||||
*
|
||||
* @param {String/RegExp}
|
||||
* value Either string that the attribute value should start with
|
||||
* or a RegExp to test against the attribute
|
||||
* @param {String}
|
||||
* attr (optional) The attribute passed in your node's attributes
|
||||
* collection. Defaults to "text".
|
||||
* @param {TreeNode}
|
||||
* startNode (optional) The node to start the filter at.
|
||||
*/
|
||||
,
|
||||
filter : function(value, attr, startNode) {
|
||||
|
||||
// expand start node
|
||||
if (false !== this.expandOnFilter) {
|
||||
startNode = startNode || this.tree.root;
|
||||
var animate = this.tree.animate;
|
||||
this.tree.animate = false;
|
||||
startNode.expand(true, false, function() {
|
||||
|
||||
// call parent after expand
|
||||
Ext.ux.tree.TreeFilterX.superclass.filter.call(this, value,
|
||||
attr, startNode);
|
||||
|
||||
}.createDelegate(this));
|
||||
this.tree.animate = animate;
|
||||
} else {
|
||||
// call parent
|
||||
Ext.ux.tree.TreeFilterX.superclass.filter.apply(this, arguments);
|
||||
}
|
||||
|
||||
} // eo function filter
|
||||
// }}}
|
||||
// {{{
|
||||
/**
|
||||
* Filter by a function. The passed function will be called with each node
|
||||
* in the tree (or from the startNode). If the function returns true, the
|
||||
* node is kept otherwise it is filtered. If a node is filtered, its
|
||||
* children are also filtered. Shows parents of matching nodes.
|
||||
*
|
||||
* @param {Function}
|
||||
* fn The filter function
|
||||
* @param {Object}
|
||||
* scope (optional) The scope of the function (defaults to the
|
||||
* current node)
|
||||
*/
|
||||
,
|
||||
filterBy : function(fn, scope, startNode) {
|
||||
startNode = startNode || this.tree.root;
|
||||
if (this.autoClear) {
|
||||
this.clear();
|
||||
}
|
||||
var af = this.filtered, rv = this.reverse;
|
||||
|
||||
var f = function(n) {
|
||||
if (n === startNode) {
|
||||
return true;
|
||||
}
|
||||
if (af[n.id]) {
|
||||
return false;
|
||||
}
|
||||
var m = fn.call(scope || n, n);
|
||||
if (!m || rv) {
|
||||
af[n.id] = n;
|
||||
n.ui.hide();
|
||||
return true;
|
||||
} else {
|
||||
n.ui.show();
|
||||
var p = n.parentNode;
|
||||
while (p && p !== this.root) {
|
||||
p.ui.show();
|
||||
p = p.parentNode;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
startNode.cascade(f);
|
||||
|
||||
if (this.remove) {
|
||||
for ( var id in af) {
|
||||
if (typeof id != "function") {
|
||||
var n = af[id];
|
||||
if (n && n.parentNode) {
|
||||
n.parentNode.removeChild(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // eo function filterBy
|
||||
// }}}
|
||||
|
||||
}); // eo extend
|
||||
|
||||
// eof
|
||||
Reference in New Issue
Block a user