//Add function to call onload.
addEventHandler(window, "load", init);

var OpinionConstants = new Object();
//Constants matching id's for radiobuttons (feedback to customer).
OpinionConstants.FEEDBACK_EMAIL = "feedbackemail";
OpinionConstants.FEEDBACK_PHONE = "feedbackphone";
OpinionConstants.FEEDBACK_NONE = "feedbacknone";
//Global variable referring feedback choices (radiobuttons)
var feedBackRadios = null;
//Global variables used on inputpage (with form for point of view), elements referenced in prepareMarkerHandling().
var elemMarkerName, elemMarkerCompany, elemMarkerAddress, elemMarkerPostalCode, elemMarkerCity, elemMarkerEmail, elemMarkerPhone;


function init() {
    var elemPOVForm = refElem("asikt");
    //alert("feedBackRadios.length" + feedBackRadios.length);
    var elemIdPreCheckedChoice = null;
    //Add clickeventhandlers for feedbackchoices (radiobuttons).
    if (elemPOVForm != null) {
        //Reference feedback choices
        feedBackRadios = elemPOVForm.feedback;
        for (var i = 0; i < feedBackRadios.length; i++) {
            //Check that element exists
            if (feedBackRadios[i]) {
                //Add clickeventhandler for feedbackchoice.
                addEventHandler(feedBackRadios[i], "click", handleFeedbackClick);
                //Find out id of prechecked choice (on pageload), to be able to show correct marker.
                if (feedBackRadios[i].checked) {
                    elemIdPreCheckedChoice = feedBackRadios[i].id;
                }
            }
        }
    }

    //Prepare references to marker elements, to be able to hide/show them.
    elemMarkerName = refElem("marker_namn");
    elemMarkerCompany = refElem("marker_foretag");
    elemMarkerAddress = refElem("marker_adress");
    elemMarkerPostalCode = refElem("marker_postnr");
    elemMarkerCity = refElem("marker_ort");
    elemMarkerEmail = refElem("marker_epost");
    elemMarkerPhone = refElem("marker_telefon");

    //Show marker for prechecked choice.
    if (elemIdPreCheckedChoice != null) {
        showLabelMarkerRequiredField(elemIdPreCheckedChoice);
    }

}

/*
Name: handleFeedbackClick
Purpose: handle click on feedback choice and show correct markers for required fields.
*/
function handleFeedbackClick(e) {
    var elementClicked = getTargetElement(e);
    if (elementClicked != null) {
        //Get id for clicked element
        var elementClickedId = elementClicked.id;
        //alert("handleFeedbackClick, elementClickedId:" + elementClickedId);
        if (elementClickedId != null) {
            showLabelMarkerRequiredField(elementClickedId);
        }
    }

}
/*
Name: showLabelMarkerRequiredField
Purpose: Shows label marker for clicked feedback choice.
*/
function showLabelMarkerRequiredField(elemIdFeedbackChoice) {
    //Hide all markers
    hideAllMarkers();
    //Show correct marker for required fields.
    setMarkerVisibility(elemIdFeedbackChoice, true);
}
/*
Name: hideAllMarkers
Purpose: Hides all markers for required fields.
*/
function hideAllMarkers() {
    //Note: feedBackRadios referenced in init().
    if (feedBackRadios != null) {
        for (var i = 0; i < feedBackRadios.length; i++) {
            //Check that element exists and has attribute "id".
            if (feedBackRadios[i] && feedBackRadios[i].id) {
                //Hide marker
                setMarkerVisibility(feedBackRadios[i].id, false);
            }
        }
    }
}
/*
Name: setMarkerVisibility
Purpose: Shows or hides marker for a feedback choice (according to id)
*/
function setMarkerVisibility(elemIdFeedbackChoice, blnShowMarker) {

    //Set markerdisplay for different feedback choices.
    switch (elemIdFeedbackChoice) {
        case OpinionConstants.FEEDBACK_EMAIL:
            //alert("setMarkerDisplay, case OpinionConstants.FEEDBACK_EMAIL, blnShowMarker:" + blnShowMarker);
            setElemVisibility(elemMarkerEmail, blnShowMarker);
            break;
        case OpinionConstants.FEEDBACK_PHONE:
            //alert("setMarkerDisplay, case OpinionConstants.FEEDBACK_PHONE, blnShowMarker:" + blnShowMarker);
            setElemVisibility(elemMarkerPhone, blnShowMarker);

            break;
        case OpinionConstants.FEEDBACK_NONE:
            //alert("setMarkerDisplay, case OpinionConstants.FEEDBACK_NONE, blnShowMarker:" + blnShowMarker);
            //Do nothing, all should be hidden by now, when hideAllMarkers is called.
            break;
        default:
            //Do nothing
            break;
    }
}
/*
Name: setElemVisibility
Purpose: Sets visibility for an element.
*/
function setElemVisibility(elem, blnVisible) {
    var cssAttrValue = blnVisible?"visible":"hidden";
    if (elem.style) {
        elem.style["visibility"] = cssAttrValue;
    }
}
/*
Name: refElem
Purpose: References an element according to element id.
*/
function refElem(elemId) {
    return document.getElementById(elemId);
}

/*
Name: validateOpinionForm
Purpose: Validate fields on clientside (before submitting form).
*/
function validateOpinionForm(theForm) {
    var va = new Validator();
    var er = new ErrorRenderer();

    //address = new String(document.getElementById(""+CONSTANT_ADDRESS+"").value);
    //city    = new String(document.getElementById(""+CONSTANT_CITY+"").value);

    if (!va.isRadioSelected(theForm.typ)) {
        var err = new Error(theForm.typ, 'Här måste du välja typ av synpunkt');
        va.addError(err);
    }

    if (!va.isRadioSelected(theForm.area)) {
        var err = new Error(theForm.area, 'Här måste du välja område');
        va.addError(err);
    }
    /*
    if (!va.isListSelected(theForm.servicegroup) && !va.isListSelected(theForm.tjanst)) {
        var err = new Error(theForm.servicegroup, 'Här måste du välja service eller tjänst');
        va.addError(err);
    }
    if (!va.isListSelected(theForm.orsak)) {
        var err = new Error(theForm.orsak, 'Här måste du välja orsak');
        va.addError(err);
    }
    */
    if (va.isEmpty(theForm.meddelande)) {
        var err = new Error(theForm.meddelande, 'Här måste du fylla i meddelande');
        va.addError(err);
    }

    if (!va.isRadioSelected(theForm.feedback)) {
        var err = new Error(theForm.feedback, 'Här måste du välja typ av svar');
        va.addError(err);
    }

    if (document.getElementById("feedbackemail").checked) {
        //alert("email checked");
        //Email needed for feedback through email.
        if (va.isEmpty(theForm.epost)) {
            var err = new Error(theForm.epost, 'Här måste du fylla i din e-post för att vi ska kunna återkomma till dig');
            va.addError(err);
        }
    }

    if (document.getElementById("feedbackphone").checked) {
        //alert("phone checked");
        //Phonenumber needed for feedback through phone.
        if (va.isEmpty(theForm.telefon)) {
            var err = new Error(theForm.telefon, 'Här måste du fylla i telefonnummer för att vi ska kunna återkomma till dig');
            va.addError(err);
        }
    }

    //Format errors - start
    if (!va.isEmpty(theForm.postnr)) {
        if (!va.checkZipcode(theForm.postnr.value)) {
            var err = new Error(theForm.postnr, 'Här måste du fylla i ett giltigt postnummer');
            va.addError(err);
        }
    }
    if (!va.isEmpty(theForm.epost)) {
        if (!va.checkEmail(theForm.epost.value)) {
            var err = new Error(theForm.epost, 'Här måste du fylla i giltig e-post');
            va.addError(err);
        }
    }

    if (!va.isEmpty(theForm.telefon)) {
        if (!va.checkPhone(theForm.telefon.value)) {
            var err = new Error(theForm.telefon, 'Här måste du fylla i ett giltigt telefonnummer');
            va.addError(err);
        }
    }
    //Format errors - end

    return er.displayErrors(theForm, va.getErrors());

}

function resetOtherSelect(theForm, theField) {
    var tmpIndex = theField.selectedIndex;
    theForm.servicegroup.selectedIndex = 0;
    theForm.tjanst.selectedIndex = 0;
    theField.selectedIndex = tmpIndex;
}
var submitCounter = 0;
function saveOpinion() {
    //return validateOpinionForm(this)
    var objForm = document.getElementById("asikt");

    var isValidForm = validateOpinionForm(objForm);
    //If form is valid
    if (isValidForm) {
        submitCounter++;
        //Prevent multiple submits
        if (submitCounter == 1) {
            //Set values on hidden fields
            setHiddenFields(objForm);
            //Try to show progress info
            try {
                showSaveInProgress();
            } catch(e) {
                //Do nothing. Continue to save opinion even if progressinfo fails to show.
            }
            //Send form
            objForm.submit();
        }

    }
}

function setHiddenFields(theForm) {
    //Find checked radio for "typ"
    for (i = 0; i < theForm.typ.length; i++) {
        if (theForm.typ[i].checked) {
            //alert(theForm.typ[i].getAttribute("title"));
            //Set value from attribute "title" on hidden field.
            theForm.typeOfOpinionDescrp.value = theForm.typ[i].getAttribute("title");
        }
    }

    //theForm.causeDescrp.value = theForm.orsak.options[theForm.orsak.selectedIndex].text;
    //if (theForm.servicegroup.selectedIndex > 0) {
    //    theForm.serviceOrProductDescrp.value = theForm.servicegroup.options[theForm.servicegroup.selectedIndex].text;
    //} else if (theForm.tjanst.selectedIndex > 0) {
    //    theForm.serviceOrProductDescrp.value = theForm.tjanst.options[theForm.tjanst.selectedIndex].text;
    //}
}

//-------------------------------------------------
// Name: showSaveInProgress
// Purpose:  Present a message (centered in broserwin) with info that the complaint is being saved. The message is animated for more positive user experience.
// Return value: none
//-------------------------------------------------
function showSaveInProgress() {
    var elemSaveInProgress = document.getElementById("infoSaveInProgress");
    if (elemSaveInProgress != null) {
        //Position progressinfo (find out documents inner width and height first, and scrollvalues)
        var docInnerWidth = getDocInnerWidth();
        var docInnerHeight = getDocInnerHeight();
        var docScrollTop = getDocScrollTop();
        var docScrollLeft = getDocScrollLeft();
        //Show progressinfo
        if (docInnerWidth != null && docInnerHeight != null) {
            //Find out the progressinfo-element's actual width and height.
            var elemWidth = getElemWidth(elemSaveInProgress);
            var elemHeight = getElemHeight(elemSaveInProgress);
            //Calculate where progressinfo-element should be positioned.
            var posX = parseInt(((docInnerWidth / 2) + docScrollLeft) - (elemWidth / 2));
            var posY = parseInt(((docInnerHeight / 2) + docScrollTop) - (elemHeight / 2));
            //alert("posX:" + posX);
            //alert("posY:" + posY);
            //Position the element
            posElem(elemSaveInProgress, posX, posY);
        }
        elemSaveInProgress.style.visibility = "visible";
        var objAnimationInterval = setInterval("animateSaveInProgress()", 1000);
    }
}

//-------------------------------------------------
// Name: animateSaveInProgress
// Purpose:  Animate message to user to simulate a loadingbar.
// Return value: none
//-------------------------------------------------
var objAnimationInterval;
var animateString = "";
var nrOfTimesAnimationDrawn = 0;
function animateSaveInProgress() {
    var elemAnimatedSaveInProgress = document.getElementById("containerAnimationSaveInProgress");
    if (elemAnimatedSaveInProgress) {
        animateString += ". ";
        elemAnimatedSaveInProgress.innerHTML = animateString;
        nrOfTimesAnimationDrawn++;
        //Handle if user has waited too long (>5 mins, probably scripterror)
        if (nrOfTimesAnimationDrawn > 300) {
            clearInterval(objAnimationInterval);
            elemAnimatedSaveInProgress.innerHTML = "";
            var elemSaveInProgress = document.getElementById("infoSaveInProgress");
            elemSaveInProgress.innerHTML = "Något gick fel när din synpunkt skulle sparas.";
        }
    }
}



