var Ariel = {}
Element.extend({
    setHTML: function(){
        Garbage.trash(this.getElementsByTagName('*')); 
        this.innerHTML = $A(arguments).join('');
        return this;
    },
    empty: function(){
        return this.setHTML('');
    },
    hide: function() {
        this.setStyle('display','none');
        return this;
    },
    show: function() {
        this.setStyle('display','');
        return this;
    },
    toggle: function() {
        if (this.getStyle('display')=='none') {
            this.show();
        }
        else {
            this.hide();
        }
    },
    adoptAll: function(element) {
        while ( element.hasChildNodes() )
            this.appendChild( element.firstChild );
        return this;
    },
    loadContent: function(url,options) {
        new Ajax(url,Object.extend({
            update:this
        },options || {})).request();
    }
    ,
    effectChain: function(property,options) {
        var fx = new Fx.Style(this,property,options);
        var start = arguments[2] || this.getStyle(property);
        fx.chain(fx.start.pass([start,arguments[3]],fx));
        for (var i=4,l=arguments.length; i<l; i++) {
            fx.chain(fx.start.pass(arguments[i] || start,fx));
        }
        if (options && options.onChainComplete) {
            fx.chain(options.onChainComplete.pass(this,10));
        }
        return fx;
    },
    effectsChain: function(options) {
        var fx = new Fx.Styles(this,options);
        for (var i=1,l=arguments.length; i<l; i++) {
            fx.chain(fx.start.pass(arguments[i],fx));
        }
        if (options && options.onChainComplete) {
            fx.chain(options.onChainComplete.pass(this,10));
        }
        return fx;
    },
    highlight: function(options){
        var color = new Color(this.getStyle('background-color'));
        if (!color) return;
        color = color.setBrightness(100);
        this.effectChain('background-color',options,null,color.rgbToHex(),null).callChain();
    },
    disapear:function(options) {
        options = options || {};
        options.onComplete = function(element) {element.setStyle('display','none')};
        this.effects(options).start({'height':1,'width':1,'opacity':0});
    },
    loadOptions: function(url, options) {
        if (this.getTag() != 'select') return;
        this.loadingOptions = true;
        this.options.length = 0;
        options = Object.extend({
            onComplete :function(response){
                var data = response.data;
                for (var i=0,l=data.length; i<l; i++) {
                    var option = data[i];
                    this.options[this.options.length] = new Option(option.text,option.value,option.defaultSelected,option.selected);
                }
            this.loadingOptions = null;
            if (options.onAfterLoad) options.onAfterLoad.call(this,response);
            if (this.onchange && options.cascade) this.onchange();
        }.bind(this)},options || {});
        if(options.onBeforeLoad) options.onBeforeLoad.call(this)
        new Json.Remote(url,options).send(); 
    },
    surroundWith:function(tagName,options) {
        var tag = new Element(tagName,options);
        this.replaceWith(tag);
        tag.adopt(this);
        return this;
    }
});
String.extend({
    stripTags: function() {
        return this.replace(/<[^>]>/g,'');
    }
}); 
Garbage.empty = function(){
    //var start = $time();
    Garbage.collect(window);
    Garbage.collect(document);
    //var proto=[];
    //for (var d in Element.prototype) proto.push(d); 
    for (var i = 0, els = Garbage.elements, j = els.length, el; i < j; i++){
        el = els[i];
        if (el.$events) el.fireEvent('trash').removeEvents();
        for (var p in el.$tmp) el.$tmp[p] = null;
        //for (var d in proto) el[d] = null;
        //for (var a=0, b=proto.length; a<b; a++) el[proto[a]]=null;
        els[i] = el.htmlElement = el.$tmp = el.$events = el = null;
    }
    els.length = 0;
    //console.log('start',$time()-start); 
    //alert('end: '+($time() - start)+'ms');
        //Garbage.trash(Garbage.elements);
    }


