/**
 * Class FeedbackHelper
 * 
 *
 */
function FeedbackHelper( fbEl, fbElExt) {

    /**
     * @var int Angir hvor lenge beskjeden skal vises
     */
    var SKJUL_FORSINKELSE = 7000; // MS

    var SKJUL_FORSINKELSE_EXTENDED = 16000; // MS

    var mainContext = this;

    /**
     * @var dom-element Tabellen som huser utdannelseslisten
     */
    var feedbackElement = fbEl;

    var feedbackElementExtended = fbElExt;

    /**
     * @var dom-element Brukes for å unngå at en senere beskjed blir fjernet raskt av utgående beskjed
     */
    var timerId;


    /**
     * CONSTRUCTOR
     */    
     _removePostbackFeedback();

     $(feedbackElementExtended).find(".close-button").click(function( event ) {
         event.preventDefault();
         $(feedbackElement).hide("slow");
         $(feedbackElementExtended).hide("slow");
         return false;
     });


    /**
     * PUBLIC FUNCTION showOk
     *
     * Viser feedbackobjektet og setter klassene til OK-visning
     */
    this.showOk = function( message, extendedMessage ) {
        mainContext.show(message, 'feedback-state-ok', extendedMessage);
    }

    /**
     * PUBLIC FUNCTION showNotice
     *
     * Viser feedbackobjektet og setter klassene til NOTICE-visning
     */
    this.showNotice = function( message ) {
        mainContext.show(message, 'feedback-state-notice');
    }

    /**
     * PUBLIC FUNCTION showError
     *
     * Viser feedbackobjektet og setter klassene til ERROR-visning
     */
    this.showError = function( message ) {
        mainContext.show(message, 'feedback-state-error');
    }

    /**
     * PUBLIC FUNCTION
     *
     * Viser feedbackobjektet og setter klassene til ERROR-visning
     */
    this.showUnexpectedError = function() {
        mainContext.show("Det oppstod en ikke-bruker-feil", 'feedback-state-error');
    }

    /**
     * PUBLIC FUNCTION show
     *
     * Viser feedbackobjektet og setter klassene til spesifisert.
     * 
     * _hideAndReset()-funksjonen kjøres slik at beskjedden fjernes etter
     * x-antall sekunder
     */
    this.show = function ( message, className, extendedMessage ) {
        _resetClassAttribute();
        $("#section_feedback_beskjed_extended").html("");
        $("#section_feedback_beskjed").text(message);
        if( extendedMessage ) {
            $("#section_feedback_beskjed_extended").html(extendedMessage);
            $(feedbackElementExtended).show();
        }
        $(feedbackElement).addClass(className).fadeIn("fast", _hideAndReset);

        _reposition();
    }

    /**
     * PRIVATE FUNCTION _reposition
     *
     * Prøver å finne den beste plasseringen til feedbacklinjen basert på
     * hvor mye brukerne har scrollet 
     */
    function _reposition() {

        var scrollPos = getScrollXY(); // Kan ikke bruke window.pageXOffset/pageYOffset, direkte pga. IE

        if(44 < scrollPos[1] ) {
            $(feedbackElement).parent().addClass('feedback_position_bottom');
            $(feedbackElement).css({
                position: 'fixed',
                top: "auto",
                bottom: "0px"
            });

            $(feedbackElementExtended).css({
                position: 'fixed',
                top: "auto",
                bottom: "18px"
            });
        } else {
            $(feedbackElement).parent().removeClass('feedback_position_bottom');
            $(feedbackElement).css({
                position: 'absolute',
                top: "44px",
                bottom: "auto"
            });
            $(feedbackElementExtended).css({
                position: 'absolute',
                top: "67px",
                bottom: "auto"
            });
        }
    }
    /**
     * PRIVATE FUNCTION _removePostbackFeedback
     *
     * Fjerner - om aktiv - feedback som er satt "statisk" via PHP
     */
    function _removePostbackFeedback() {

        // Hvis klassen ikke er tom, ergo; error/notice/ok er satt
        if( $(feedbackElement).attr("class") != "" ) {
            _hideAndReset();
        }
    }

    /**
     * PRIVATE FUNCTION _hideAndReset
     *
     * Skjuler feedbackelementet og viser den origniale linjen igjen
     *
     * Har en innebygd forsinkelse
     */
    function _hideAndReset() {
        
            clearTimeout(timerId);  // For å unngå at beskjed B blir fjernet av utgående beskjed A sin
            
            var forsinkelse = ( $("#section_feedback_beskjed_extended").text().length > 0 ) ? SKJUL_FORSINKELSE_EXTENDED : SKJUL_FORSINKELSE;
            
            timerId = setTimeout(function(){
                $(feedbackElement).fadeOut("slow");
                $(feedbackElementExtended).fadeOut("slow");
            } , forsinkelse);
    }
    
    /**
     * PRIVATE FUNCTION _resetClassAttribute
     *
     * Fjerner eventuelle tidligere satte states fra før
     */
    function _resetClassAttribute() {
        $(feedbackElement).attr('class', "");
    }

    /**
     * PUBLIC FUNCTION _resetClassAttribute
     *
     * Fjerner eventuelle tidligere satte states fra før
     */
    this.prosessAjaxResponse = function( data ) {
        if( data['status'] != null && data['message'] != null ) {

            var extendedMessage = ( data['messageExtended'] != null ) ? data['messageExtended'] : "";

            switch( data['status'] ) {
                case 'ok': mainContext.showOk(data['message'], extendedMessage); break;
                case 'error': mainContext.showError(data['message'], extendedMessage); break;
                case 'notice': mainContext.showNotice(data['message'], extendedMessage); break;
            }
        }
    }
    

}
