﻿// Modal Visitor Poll 2.0.6
var ModalVisitorPoll = function(id) {
    var settings = {
        displayFrequency: 100,
        cookieExpireDays: 30,
        currentForm: null,
        forms: [],
        loaded: false,
        userParticipate: true,
        formPreviouslyDisplayed: false,
        precedingForm: true,
        noPrecedingForm: true,
        closeRedirectUrl: null,
        formIsVisible: false,
        answered: false
    };

    var sla = [];

    function init() {
        jQuery(function() {
        jQuery.get("http://www.astma.com/UI/ModalVisitorPoll/config.xml", load);
        });
    }

    function settingsLoaded(func) {
        if (typeof (func) == "undefined" && settings.loaded) {
            for (var i = 0; i < sla.length; i++) {
                sla[i]();
            }
        }
        else {
            sla.push(func);
        }
    }

    function load(data) {
        // block safari for now
        if (jQuery.browser.safari) {
            return;
        }

        var displayFrequency = jQuery(data).find("poll").attr("displayFrequency");
        var cookieExpireDays = jQuery(data).find("poll").attr("cookieExpireDays");
        if (displayFrequency != "") {
            settings.displayFrequency = displayFrequency;
        }
        if (cookieExpireDays != "") {
            settings.cookieExpireDays = cookieExpireDays;
        }

        // Check if the visitor should participate in the poll
        settings.userParticipate = participateCheck();
        if (!settings.userParticipate) {
            return;
        }

        // Load all qustionnaires
        loadForms(data);

        // Check that the form hasn't been displayed before
        settings.formPreviouslyDisplayed = formPreviouslyDisplayed();
        // Check preceding questionnarie
        settings.precedingForm = precedingFormCheck();
        // Check reversed preceding questionnaire
        settings.noPrecedingForm = noPrecedingFormCheck();

        // All settings are loaded
        settings.loaded = true;
        settingsLoaded();

        // Initalize Coookie
        var cookie = new Cookie(settings.currentForm.id, settings.cookieExpireDays);
        if (!cookie.load()) {
            cookie.setVal("state", "init");
            cookie.save();
        }

        // Display the form now or later
        if (settings.currentForm.displayEvent == "load") {
            showForm();
        }
        else if (settings.currentForm.displayEvent == "timer") {
            setTimeout(function() { showForm(); }, getDisplayDelay());
        }
        else if (settings.currentForm.displayEvent == "leave") {
            attachLinkEvent();
        }
    }

    function showForm() {
        if (!precedingFormCheck() || !noPrecedingFormCheck() || settings.formPreviouslyDisplayed) {
            return;
        }

        if (!self._mvcFormVisible) {
            jQuery(document).ready(function() {
                jQuery('<div id="MVPjqm" class="jqmWindow" />').prependTo('body')
					.jqm({ ajax: settings.currentForm.src,
					    ajaxText: 'Laddar enk&auml;t...',
					    modal: false,
					    onLoad: initForm,
					    onHide: closeForm
					})
					.jqmShow();
                self._mvcFormVisible = true;
            });
        }
    }

    // Event to run when the window is initialized
    function initForm() {
        // The form should never be displayed more than once
        // TODO: Custom var ska sättas - användare exponerad
        updateCookieState("displayed");
        settings.formPreviouslyDisplayed = true;

        jQuery("form#MVPVisitorPollForm").submit(function() { return false; });
        jQuery("#MVPjqm").jqmAddClose("#MVPClose");
        jQuery("input[type=radio]", "form#MVPVisitorPollForm").click(function() {
            if (jQuery(this).attr("class") == "MVPFreeTextChoice")
                jQuery("#" + jQuery(this).attr("name") + "FreeText").removeAttr("disabled").focus();
            else
                jQuery("#" + jQuery(this).attr("name") + "FreeText").attr("disabled", "disabled");
            jQuery("input[name=" + jQuery(this).attr("name") + "]", "form#MVPVisitorPollForm").each(function() { jQuery(this).attr("clicked", "true"); });
            if (isCompleted()) {
                jQuery("#MVPSubmitButton").removeAttr("disabled").attr("src", "http://www.astma.com/UI/ModalVisitorPoll/Images/submit.gif").attr("class", "MVPActiveButton").attr("title", "Skicka dina svar och stäng enkäten")
				/*
				  .mousedown(function() {
                jQuery("#MVPSubmitButton").attr("src", "http://www.astma.com/UI/ModalVisitorPoll/Images/submit_down.gif");
				  })
				  .mouseover(function() {
				  jQuery("#MVPSubmitButton").attr("src", "http://www.astma.com/UI/ModalVisitorPoll/Images/submit_over.gif");
				  })
				  .mouseout(function() {
				  jQuery("#MVPSubmitButton").attr("src", "http://www.astma.com/UI/ModalVisitorPoll/Images/submit.gif");
				  });
				*/
            }
        });
        jQuery("#MVPSubmitButton").click(function() {
            if (!isCompleted()) {
                alert("Du måste svara på alla frågor innan du kan skicka in enkäten!");
            } else {
                saveVisitorPoll();
            }
        });
    }

    // Event to run when the window is closed
    function closeForm(jqm) {
        if (!settings.answered) {
            try {
                updateCookieState("denied");
                //pageTracker._trackPageview(["/action/user-poll/", settings.currentForm.id, "/denied"].join(""));
				_gaq.push(['_trackPageview', "/action/user-poll/", settings.currentForm.id, "/denied"]);
            } catch (ex) { }
        }
        jqm.w.hide();
        jqm.o.hide();
        self._mvcFormVisible = false;

        if (settings.closeRedirectUrl !== null) {
            location.href = settings.closeRedirectUrl;
        }
    }

    // Check if all form fields are filled out
    function isCompleted() {
        return (jQuery("input[type=radio][clicked!=true]", "form#MVPVisitorPollForm").length === 0);
    }

    // Event that occurs when the save button is clicked
    function saveVisitorPoll() {
        if (isCompleted()) {
            var pageViewVal = "";
            for (var i = 0; i < settings.currentForm.questions.length; i++) {
                var q = settings.currentForm.questions[i];

                switch (jQuery(q).attr("registerMethod")) {
                    case "customVar":
                        var val = getSelectedValue(q);
																		
							//j:
							_gaq.push(['_setCustomVar', jQuery(q).attr("slot"), jQuery(q).attr("customVarName"), settings.currentForm.trackerValue + val, jQuery(q).attr("scope")]);
							
                        //console.log("customvar: ", jQuery(q).attr("slot"), " ", jQuery(q).attr("customVarName"), " ", settings.currentForm.trackerValue + val, " ", jQuery(q).attr("scope"));
                        break;
                    case "trackPageView":
                        pageViewVal = getSelectedValue(q);

                        //j:
						_gaq.push(['_trackPageview', settings.currentForm.trackerValue + pageViewVal]);						                        

                        //console.log("trackpage: ", settings.currentForm.trackerValue + pageViewVal);
                        break;
                }
            }
            updateCookieState("completed");
            settings.answered = true;
            jQuery("#MVPjqm").jqmHide();
        }
        return false;
    }

    // Get's the selected value for a question
    function getSelectedValue(q) {
        // Look for checkbox or radiobutton
        var selectedElement = jQuery("#MVPVisitorPollForm input[name=" + jQuery(q).attr("id") + "]:checked");
        // Look for a stand alone text-filed if not checkbox or radiobutton was found
        if (selectedElement.length === 0) {
            selectedElement = jQuery("#MVPVisitorPollForm :text[name=" + jQuery(q).attr("id") + "]");
        }
        if (selectedElement.val().toLowerCase() == "annat") {
            val = selectedElement.nextAll(":text").val();
        }
        else {
            val = selectedElement.val();
        }
        return val;
    }

    function loadForms(data) {
        // TODO: possible to rewrite to load only the current form? - that's all we need
        jQuery(data).find("form").each(function() {
            settings.forms.push({
                id: getAttrSafe(jQuery(this).attr("id")),
                src: getAttrSafe(jQuery(this).attr("src")),
                trackerValue: getAttrSafe(jQuery(this).attr("trackerValue")),
                displayEvent: getAttrSafe(jQuery(this).attr("displayEvent")),
                displayDelay: getAttrSafe(jQuery(this).attr("displayDelay")),
                precedingForm: getAttrSafe(jQuery(this).attr("precedingForm")),
                noPrecedingForm: getAttrSafe(jQuery(this).attr("noPrecedingForm")),
                urlRestriction: getAttrSafe(jQuery(this).attr("urlRestriction")),
                questions: null
            });
        });
        settings.currentForm = getForm(id);
        settings.currentForm.questions = loadQuestions(data);
    }

    // Gets all questions for the current form
    function loadQuestions(data) {
        var selector = ["#", settings.currentForm.id, " > question"].join("");
        var questions = [];
        jQuery(data).find(selector).each(function() {
            questions.push({
                "id": getAttrSafe(jQuery(this).attr("id")),
                "customVarName": getAttrSafe(jQuery(this).attr("customVarName")),
                "registerMethod": getAttrSafe(jQuery(this).attr("registerMethod")),
                "slot": getAttrSafe(jQuery(this).attr("slot")),
                "scope": getAttrSafe(jQuery(this).attr("scope"))
            });
        });
        return questions;
    }

    // Attaches click event to external links to dipslay the poll when leaving the site
    function attachLinkEvent() {
        var pattern = /^[a-zA-Z]+:\/\/([^\/]+)\/.*?$/;
        var match = pattern.exec(location.href);
        jQuery("a[href]").click(function() {
            if (this.href.indexOf(match[1]) == -1) {
                settings.closeRedirectUrl = this.href;
                showForm();
                return false;
            }
        });
    }

    // Sets the state of the cookie to keep track of if the form has been displayed, denied, completed
    function updateCookieState(state) {
        var cookie = new Cookie(settings.currentForm.id, settings.cookieExpireDays);
        if (cookie.load()) {
            cookie.setVal("state", state);
            cookie.save();
        }
    }

    // Returns the remaining time to display the form. Looks for a date value in cookie or creates a new date value in cookie
    function getDisplayDelay() {
        var cookie = new Cookie(settings.currentForm.id, settings.cookieExpireDays);
        var delay = 0;
        if (settings.currentForm.displayEvent == "timer") {
            if (cookie.load() && cookie.getVal("displayTime") !== null) {
                var displayTime = cookie.getVal("displayTime");
                if (displayTime !== null) {
                    var diff = new Date(displayTime).getTime() - new Date().getTime();
                    delay = diff > 0 ? diff : 0;
                }
            }
            else {
                delay = Number(settings.currentForm.displayDelay);
                var date = new Date();
                date.setMinutes(date.getMinutes() + delay);
                cookie.setVal("displayTime", date.toUTCString());
                cookie.save();
                delay = delay * 60000;
            }
        }
        return delay;
    }

    // Checks if the form has been previously displayed
    function formPreviouslyDisplayed() {
        var cookie = new Cookie(settings.currentForm.id);
        var exists = cookie.load();
        var cookieState = cookie.getVal("state");
        return exists && (cookieState == "completed" || cookieState == "denied" || cookieState == "displayed");
    }

    // Check if the poll should be displayed to this visitor
    function participateCheck() {
        var cookie = new Cookie("modalVisitorPoll", settings.cookieExpireDays);

        if (cookie.load()) {
            return cookie.getVal("participate") == 1;
        }
        else {
            var val = "0";
            if (settings.displayFrequency == 100 || Math.random() * 100 < settings.displayFrequency) {
                val = "1";
            }
            cookie.setVal("participate", val);
            cookie.save();
            return val == "1";
        }
    }

    // Checks if a preceding form has been answered
    function noPrecedingFormCheck() {
        var precedingOk = true;
        if (settings.currentForm.noPrecedingForm !== null) {
            var cookie = new Cookie(settings.currentForm.noPrecedingForm);
            precedingOk = !cookie.load() || cookie.getVal("state") == "init";
        }
        return precedingOk;
    }

    // Checks if a preceding form has been answered
    function precedingFormCheck() {
        var precedingOk = true;
        if (settings.currentForm.precedingForm !== null) {
            var cookie = new Cookie(settings.currentForm.precedingForm);
            var exists = cookie.load();
            precedingOk = exists && cookie.getVal("state") == "completed";
        }
        return precedingOk;
    }

    // Returns the value as null if it's undefined, null or empty
    function getAttrSafe(val) {
        if (typeof (val) == "undefined" || val === null || val == "") {
            return null;
        }
        return val;
    }

    // Get a form by ID
    function getForm(id) {
        if (typeof (id) == "undefined") {
            return getFormByUrl(location.href);
        }

        for (var i = 0; i < settings.forms.length; i++) {
            if (settings.forms[i].id == id) {
                return settings.forms[i];
            }
        }

        return null;
    }

    // Get a form by url
    function getFormByUrl(url) {
        var matches = [];
        var exactmatch;

        // Check if there are any form that matches this url
        for (var i = 0; i < settings.forms.length; i++) {
            if (settings.forms[i].urlRestriction[0] != "!" && url.indexOf(settings.forms[i].urlRestriction) != -1) {
                matches.push(settings.forms[i]);
            }
        }

        // If no matches were found. Check if there are any reversed matches for this url
        //if(matches.length === 0) {
        for (var i = 0; i < settings.forms.length; i++) {
            if (settings.forms[i].urlRestriction[0] == "!" && url.indexOf(settings.forms[i].urlRestriction.substring(1)) == -1) {
                matches.push(settings.forms[i]);
            }
        }
        //}

        if (matches.length === 0) {
            return null;
        }

        // matches.sort(function(a, b) {
        // return a.urlRestriction.length < b.urlRestriction.length;
        // });

        // plocka url som matchar exakt
        if (matches[0].urlRestriction == url) {
            return matches[0];
        }

        // plocka den längsta url som är relativ och matchar
        for (var i = 0; i < matches.length; i++) {
            if (matches[i].urlRestriction.indexOf("http://") == -1) {
                return matches[i];
            }
        }

        // plocka url som innehåller, startar med och är längst
        return matches[0];
    }

    // Cookie handlig class
    var Cookie = function(_id, _expDays) {
        var values = [];
        var id, expires;

        // Adds a key/value pair to the value array
        function setVal(k, v) {
            values.push({ "k": k, "v": v });
        }

        // Gets the value for the specified key or index
        function getVal(k) {
            if (typeof (k) == "string") {
                var index = indexOf(k);
                return index !== null ? values[indexOf(k)].v : null;
            }
            else if (typeof (k) == "number") {
                return k < values.length ? values[k].v : null;
            }
            return null;
        }

        // Returns the index of the specified key
        function indexOf(k) {
            for (var i = 0; i < values.length; i++) {
                if (values[i].k == k) {
                    return i;
                }
            }
            return null;
        }

        // Initialize the cookie object
        function init() {
            id = _id;
            expires = new Date();
            expires.setDate(expires.getDate() + _expDays);
            expires = expires.toUTCString();
        }

        // Try load cookie data. Returns true if data was loaded and false if no cookie data was found
        function load() {
            var cookies = document.cookie.split("; ");
            for (var i = 0; i < cookies.length; i++) {
                var cookie = cookies[i].split("=");
                if (cookie[0] == id) {
                    loadValues(cookie[1]);
                    return true;
                }
            }
            return false;
        }

        // Removes the key/value pair at the specified key or index
        function removeVal(k) {
            if (typeof (k) == "string") {
                var index = indexOf(k);
                if (index < values.length) {
                    values.splice(index, 1);
                }
            }
            else if (typeof (k) == "number") {
                if (k < values.length) {
                    values.splice(k, 1);
                }
            }
        }

        // Loads the cookies key/value pairs and adds them to the value array
        function loadValues(_vals) {
            var vals = _vals.split("|");
            for (var j = 0; j < vals.length; j++) {
                var kv = vals[j].split("§");
                if (kv[0] != "") {
                    setVal(kv[0], kv[1]);
                }
            }
        }

        // Initialize the cookie object
        init();

        // Public members
        return {
            // Call the private setVal function
            setVal: function(k, v) {
                if (getVal(k) !== null) {
                    removeVal(k);
                }
                setVal(k, v);
            },
            // Clears the value of the cookie
            clear: function(k) {
                document.cookie = [id, "="].join("");
            },
            // calls the private getVal function
            getVal: function(k) {
                return getVal(k);
            },
            // Calls the private indexOf function
            indexOf: function(k) {
                return indexOf(k);
            },
            // Call the private load function
            load: function() {
                return load();
            },
            // Save the cookie. Separates keys and values with § and key/value pairs with |
            save: function() {
                var vals = "";
                for (var i = 0; i < values.length; i++) {
                    vals += [values[i].k, "§", values[i].v, "|"].join("");
                }
                document.cookie = [id, "=", vals, "; expires=", expires, "; path=/;"].join("");
            },
            // Calls the private removeVal function
            removeVal: function(k) {
                removeVal(k);
            }
        };
    };

    init();

    return {
        show: function() {
            //j:
            //if(settings.userParticipate && !settings.formPreviouslyDisplayed && precedingFormCheck() && noPrecedingFormCheck()) {
            
            if (settings.userParticipate && !settings.formPreviouslyDisplayed) {
                if (!settings.loaded) {
                    settingsLoaded(showForm);
                }
                else {
                    showForm();
                }
            }
        }
    };
};
