YAHOO.namespace('BEBO');

YAHOO.BEBO.ajaxNess = function(el, consumers) {
    var method, uri, event, form;
    var self = {};
    var events = {};
    var fire = function(evt, data) {
        if (events.hasOwnProperty(evt)) {
            events[evt].fire(data);
        }
    };
    var success = function(o) {

        var data;
        try {
            data = YAHOO.lang.JSON.parse(o.responseText);
            data = data.data;
        } catch(e) {
            data = o.responseText;
        }
        if (typeof data === 'object') {
            for (var evt in data) {
                if (data.hasOwnProperty(evt)) {
                    fire(evt, data[evt]);
                }
            }
        }
        if (!data.success) {
            fire('success', data);
        }
        fire('done', data);
    };
    var failure = function(o) {
        var data;
        try {
            data = YAHOO.lang.JSON.parse(o.responseText);
            data = data.data;
        } catch(e) {
            data = o.responseText;
        }
        fire('failure', data);
        fire('done', data);
    };
    var trigger = function(e) {
        fire('before',e);
       
        if (e) {
            YAHOO.util.Event.preventDefault(e);
        }
        var url = this.action + document.location.search || document.location;

        if(this.setURL){
            url = this.setURL;
        }

        if(this.setSearch){
            url =  url + this.setSearch;
        }
        
        if (form) {
            YAHOO.util.Connect.setForm(form);
        }
        
        YAHOO.util.Connect.asyncRequest(method, url, {
            success: success,
            failure: failure
        });
        
        fire('trigger', e);
    };


    var init = function() {
        var match;
        el = YAHOO.util.Dom.get(el);
        self.el = el;

        if (el.tagName.toLowerCase() === 'form') {
            method = el.method || 'GET';
            action = el.action;
            form = el;
            event = 'submit';
        } else if(el.tagName.toLowerCase() === 'button') {
             method = el.method || 'GET';
             action = el.href;
             event = 'click';
        }

        for (var evt in consumers) {
            if (consumers.hasOwnProperty(evt)) {
                self.subscribe(evt, consumers[evt]);
            }
        }
        YAHOO.util.Event.addListener(el, event, trigger);
    };
    self.trigger = trigger;
    self.subscribe = function(evt, consumer) {
        if (!events.hasOwnProperty(evt)) {
            events[evt] = new YAHOO.util.CustomEvent(evt, self);
        }
        if (typeof consumer === 'object' && consumer.length) {
            consumer = YAHOO.BEBO.ajaxNess.eventConsumers[consumer[0]].apply(self, consumer.slice(1));
        }
        if (typeof consumer === 'function') {
            events[evt].subscribe(consumer);
        } else {}
    };


    //If the element is in the Dom, init, otherwise onAvailable
    if (YAHOO.util.Dom.inDocument(el) || typeof el === 'object') {
        init();
    } else {
        YAHOO.util.Event.onAvailable(el, init);
    }
    return self;
};

YAHOO.BEBO.ajaxNess.eventConsumers = {
 
    progresslabel: function(label) {
        return function(evt, args) {
            var e = args[0];
            var el = YAHOO.util.Event.getTarget(e);
            if (el.tagName.toLowerCase() === 'form') {
                if (e.explicitOriginalTarget) {
                    el = e.explicitOriginalTarget;
                } else {
                    el = YAHOO.util.Dom.getElementsBy(function(el) {
                        return el.type === 'submit';
                    },
                    'input', el)[0];
                }
            }
            var oldlabel;
            if (el.tagName.toLowerCase() === 'input') {
                oldlabel = el.value;
                el.value = label;
                el.setAttribute('disabled', 'disabled');
            } else {
                oldlabel = el.innerHTML;
                el.innerHTML = label;
            }
            this.subscribe('done',
            function() {
                if (el.tagName.toLowerCase() === 'input') {
                    el.removeAttribute('disabled');
                    el.value = oldlabel;
                } else {
                    el.innerHTML = oldlabel;
                }
            });
        };
    },
    replace: function(el) {
        return function(evt, args) {       
			var oldDiv = YAHOO.util.Dom.get(el);
			var newDiv = document.createElement('DIV');
            newDiv.innerHTML = args[0];
			oldDiv.parentNode.replaceChild(newDiv, oldDiv);
        };
    },
    append: function(el) {
        return function(evt, args) {
            YAHOO.util.Dom.get(el).innerHTML += args[0];
        };
    },
    message: function(el) {
        return function(evt, args) {
           
           var waitForIt = function() {
                var onTheMove = el.isAnimated();
                if (onTheMove == true) {
                    goodToGo=false;
                } else {
                    goodToGo=true;
                }
            };
            
            YAHOO.util.Dom.get(el).innerHTML = args[0];
            YAHOO.util.Dom.setStyle(el, "opacity", "1");
            YAHOO.util.Dom.setStyle(el, "visibility", "visible");
            setTimeout(function() {
                var anim = new YAHOO.util.Anim(el, {
                    opacity: {
                        to: 0
                    }
                },
                4, YAHOO.util.Easing.easeOut);
                  anim.onTween.subscribe(waitForIt);
                anim.onComplete.subscribe(function() {
                    
                    YAHOO.util.Dom.setStyle(el, 'visibility', 'hidden');
                });
                
                anim.animate();
            },
            4000);
        };
    }
};
