//--------------------------------------------------------------
function noteDropper ( containerId, updateIds, visitor, validator ) {
    this.container      = document.getElementById( containerId );
    this.isVisitor      = visitor === '1';
    this.updateEvent    = new YAHOO.util.CustomEvent( 'updateEvent', this );
    this.currentUrl     = window.location;
    this.updateIds      = updateIds;
    this.validator = validator;

    this.setLinkHandlers( [this.container] );
    
    return this;
}

//--------------------------------------------------------------
noteDropper.prototype.isSubscribed = function ( elem, handler, type ) {
    var subscribedHandlers = YAHOO.util.Event.getListeners( elem, type );
    if (subscribedHandlers === null) {
        return false;
    }

    for (var i = 0; i < subscribedHandlers.length; i++) {
        if (subscribedHandlers[i].fn === handler) {
            return true;
        }
    }

    return false;
}

// This method essentially just invokes YAHOO.util.Event.addListener, but
// makes sure that the same handler is added to an event only once.
//--------------------------------------------------------------
noteDropper.prototype.addEventHandler = function ( elem, type, handler, scope ) {
    if ( handler && !this.isSubscribed( elem, handler, type ) ) {
        YAHOO.util.Event.addListener( elem, type, handler, scope );
    }
}

//--------------------------------------------------------------
noteDropper.prototype.setLinkHandlers = function( startNodes ) {
    for (var node = 0; node < startNodes.length; node++) {
        var startNode = startNodes[node];

        if (typeof startNode !== 'object') {
            startNode = document.getElementById( startNode );
        }

        // Set link handlers
        var anchors = startNode.getElementsByTagName('A');
        for (var i = 0; i < anchors.length; i++) {
            if (anchors[i].rel) {
                var handler = function (e, obj) {
                    YAHOO.util.Event.stopEvent( e );
                    obj.updateScreen( this, obj.updateIds, obj.fadeOutIn );
                };

                this.addEventHandler( anchors[i], 'click', handler, this );
            }
        }

        // Make forms use AJAX to submit
        var forms = startNode.getElementsByTagName('FORM');
        for (var i = 0; i < forms.length; i++) {
            // Add handler to take care of the submission process.
            this.addEventHandler( forms[i], 'submit', this.formSubmitHandler, this );
            
            // Populate and submit the form in case it was submitted before logging in.
            var cookieName = forms[i].id.toLowerCase();
            var cookie = cookieName ? YAHOO.util.Cookie.get( cookieName ) : null;
            if (cookie) {
                for (var j = 0; j < forms[i].elements.length; j++) {
                    var element = forms[i].elements[j];
                    if (element.name) {
                        element.value = YAHOO.util.Cookie.getSub( cookieName, element.name );
                    }
                }
         
                YAHOO.util.Cookie.remove( cookieName, {path: '/'} );

                if (!this.isVisitor) {
                    //forms[i].submit();
                }
            }
        }

    }
}

//--------------------------------------------------------------
noteDropper.prototype.fadeOutIn = function ( container, doit ) {
    var anim = new YAHOO.util.Anim( container, { opacity: {to: 0} }, 0.5 );
    anim.onComplete.subscribe( function () {
        doit();
        var anim = new YAHOO.util.Anim( container, { opacity: { to: 1 } }, 0.5 );
        anim.animate();
    }); 
    anim.animate();
}

//--------------------------------------------------------------
noteDropper.prototype.updateNode = function ( domObject, id, transitionEffect ) {
    var self = this;
    var contents        = YAHOO.util.Dom.getElementsBy( function (elem) { return elem.id === id }, '*', domObject );
    var targetElem      = document.getElementById( id );
    var transferContent = function () { 
        targetElem.parentNode.replaceChild( contents[0], targetElem );
        self.setLinkHandlers( [ contents[0] ] );
    };

    if (typeof transitionEffect !== 'function') {
        transitionEffect = function ( elem, doit ) { doit() };
    }

    if (contents.length) {
        transitionEffect( targetElem, transferContent );
    }
}

noteDropper.prototype.updateScreenHandler = function ( o, updateIds, transitionEffect ) {
    // This should parse the HTML in responseText and allow us to use Dom methods on it.
    var div = document.createElement('div');
    div.innerHTML = o.responseText;
    
    // Update all requested nodes one by one
    for (var i = 0; i < updateIds.length; i++) {
        this.updateNode( div, updateIds[i], transitionEffect );
    }
    
    this.updateEvent.fire( div );
}

//--------------------------------------------------------------
noteDropper.prototype.updateScreen = function ( url, updateIds, transitionEffect ) {
    var callback = {
        scope       : this,
        success     : function ( o ) {
            this.currentUrl = url;

            this.updateScreenHandler( o, updateIds, transitionEffect );

            return;
        }
    }

    var cm = YAHOO.util.Connect.asyncRequest( 'post', url, callback );
}

//--------------------------------------------------------------
noteDropper.prototype.formSubmitHandler = function ( e, obj ) {
    YAHOO.util.Event.stopEvent( e );
    var formContents;
    var form        = this;

    if ( obj.validator && !obj.validator.validate( form ) ) {
        return false;
    }

    var callback = {
        scope       : obj,
        success     : function ( o ) {
            obj.updateScreenHandler( o, obj.updateIds, obj.fadeOutIn );
            obj.setLinkHandlers( [ obj.container ] );
//            form['innerHTML'] = formContents;

            return;
        }
    }
   
    // If user isn't logged in yet, save form data to a cookie and redirect to login page.
    if (obj.isVisitor) {
        for (var i = 0; i < form.elements.length; i++) {
            var element = form.elements[i];
            if (element.name && form.id) {
                YAHOO.util.Cookie.setSub( form.id.toLowerCase(), element.name, element.value, {path:'/' } );
            }
        }
        
        //var redirect = obj.currentUrl.hostname.replace(/^\//, '') + '/inlogplaatsen?ral=' + obj.currentUrl.pathname;
        var redirect = '/inlogplaatsen?ral=' + obj.currentUrl.pathname;
        window.location = redirect;
            //obj.currentUrl.protocol + '//' + obj.currentUrl.hostname + '/inlogplaatsen?ral=' + obj.currentUrl.pathname;
    }
    // Otherwise post the form data through ajax
    else {
        YAHOO.util.Connect.setForm( form );
        form.reset();
        formContents = this.innerHTML;

        var cm = YAHOO.util.Connect.asyncRequest( 'POST', form.action, callback );     
        //form.innerHTML = '<img src="/uploads/G5/f_/G5f_p99RTemEjF_4UGJcwA/progress.gif" alt="uw contributie wordt toegevoegd" />Uw contributie wordt toegevoegd.';
    }

}
