//--------------------------------------------------------------
function issueTool ( containerId, url, visitor ) {
    this.container      = document.getElementById( containerId );
    this.csUrl          = url;
    this.isVisitor      = visitor === '1';
    this.updateEvent    = new YAHOO.util.CustomEvent( 'updateEvent', this );
    this.currentUrl     = window.location;

    this.linkHandlers   = {
        'issueTool_threadLink'          : function (e, obj) {
            YAHOO.util.Event.stopEvent( e );
            obj.updateScreen( this, [ 'issuelijst', 'voorwaardenLink' ], obj.fadeOutIn );
            //obj.switchToThread( this.name );
        },
        'issueTool_rateLink'            : function (e, obj) {
            YAHOO.util.Event.stopEvent( e );
            obj.ratePost( this );
        },
        'issueTool_updateThreadView'    : function(e, obj) {
            YAHOO.util.Event.stopEvent( e );
            obj.updateScreen( this, [ 'detailsArgument', 'overzicht', 'voorwaardenLink' ] );
        }
    };

    this.setLinkHandlers( [this.container] );
    
    return this;
}

//--------------------------------------------------------------
issueTool.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.
//--------------------------------------------------------------
issueTool.prototype.addEventHandler = function ( elem, type, handler, scope ) {
    if ( handler && !this.isSubscribed( elem, handler, type ) ) {
        YAHOO.util.Event.addListener( elem, type, handler, scope );
    }
}

//--------------------------------------------------------------
issueTool.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 = this.linkHandlers[ anchors[i].rel ];
                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 = YAHOO.util.Cookie.get( cookieName );
            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();
                }
            }
        }

    }
}

//--------------------------------------------------------------
issueTool.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();
}

//--------------------------------------------------------------
issueTool.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.innerHTML = contents[0].innerHTML; 
        targetElem.parentNode.replaceChild( contents[0], targetElem );
//        self.setLinkHandlers( [ targetElem ] );
        self.setLinkHandlers( [ contents[0] ] );
    };

    if (typeof transitionEffect !== 'function') {
        transitionEffect = function ( elem, doit ) { doit() };
    }

    if (contents.length) {
        
        //targetElem.parentNode.replaceChild( contents[0], targetElem );
//        targetElem.innerHTML = contents[0].innerHTML;
        transitionEffect( targetElem, transferContent );
//        this.setLinkHandlers( [ id ] );
    }
}

issueTool.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 );
}

//--------------------------------------------------------------
issueTool.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 );
}

//--------------------------------------------------------------
issueTool.prototype.formSubmitHandler = function ( e, obj ) {
    YAHOO.util.Event.stopEvent( e );
    var formContents;
    var form        = this;
    var className   = this['class'].value.replace(/::/g, '');

    var callback = {
        scope       : obj,
        success     : function ( o ) {
            // 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;
            
            // Extract issues
            var issues = YAHOO.util.Dom.getElementsByClassName( 'itemContainer', 'div', div );

            // Append first result to to of issue list 
            //var issueList   = document.getElementById('overzicht');
            var issueList   = YAHOO.util.Dom.getElementsByClassName( 'type' + className, 'div' );
            if (issueList.length) {
                var topItem     = YAHOO.util.Dom.getElementsByClassName( 'itemContainer', 'div', issueList[0] )[0];
                if (topItem) {
                    issueList[0].insertBefore( issues[0], topItem );
                }
                else {
                    issueList[0].appendChild( issues[0] );
                }
            }
            form['innerHTML'] = formContents;         
            
            obj.setLinkHandlers( [ obj.container ] );
            obj.updateEvent.fire( div );
            return;
        }
    }

    // Make sure a correct title and content are entered.
    if ( ( form.title && ( 
               form.title.value.toLowerCase() === 'belangrijk issue'
            || form.title.value.toLowerCase() === 'argument voor dit issue'
            || form.title.value === ''
            )
         ) ||
         ( form.content && (
               form.content.value.toLowerCase() === 'toelichting'
            || form.content.value.toLowerCase() === 'ruimte voor meer toelichting'
            || form.content.value === ''
            )
         )
    ) {
        alert('Zowel een titel als een toelichting zijn verplicht.');
        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) {
                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" />';
    }
}

//--------------------------------------------------------------
issueTool.prototype.ratePost = function ( anchor ) { //postId ) {
    var smallImageUrl   = '/uploads/lh/1K/lh1KsfusQfCyAD4X8mssew/mannetje.gif';
    var bigImageUrl     = '/uploads/nV/z-/nVz-CxVs98xmAxZS7lZmYw/mannetjeGroot.gif';
    var postId          = anchor.name;

    var callback = {
        scope   : this,
        success : function ( o ) {
            var iconContainer   = document.getElementById('ratingIcons_'  + postId);
            var numberContainer = document.getElementById('ratingNumber_' + postId);
        
            // Unhide container
            var container = YAHOO.util.Dom.getAncestorByClassName( iconContainer, 'medestanders' );
            YAHOO.util.Dom.removeClass( container, 'verborgen' );

            // Update vote puppets
            var rating      = parseInt( numberContainer.innerHTML ) + 1;
            iconContainer.innerHTML = '';
            for (var i = Math.floor( rating / 10 ); i > 0; i--) {
                iconContainer.innerHTML += '<div class="mannetjeGroot"></div>';
            }
            for (var i = (rating % 10); i > 0; i--) {
                iconContainer.innerHTML += '<div class="mannetjeKlein"></div>';
            }

            // Update vote counter
            numberContainer.innerHTML   = rating;

            this.updateScreenHandler( o, [ 'detailsArgument' ] );
        }
    }

    //var url = this.csUrl + '?func=ratePost;assetId=' + postId;
    var url = anchor.href;
    YAHOO.util.Connect.asyncRequest( 'GET', url, callback );  

    // Delete vote button
    var ratingButton = document.getElementById( 'ratingButton_' + postId );
    if (ratingButton) {
        ratingButton.innerHTML = '';
    }
}

