/* Fallback support for https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray in old browsers */
if ( ! Array.isArray) {
    Array.isArray = function(arg) {
        return Object.prototype.toString.call(arg) == '[object Array]';
    };
}
DICT = {
    url: "http://dict.fagbokforlaget.no/service/",
    selector: ".ordliste_oppslag",
    contentLanguage: "nb_NO", // FIXME: should really be taken from object content language
    languageMap: {
        ar_IQ: "506799ec-d452-4df2-a468-da82aea370a2", // Arabic
        so_SO: "d6947a9c-fc72-45df-b6e3-cd661a2dfb64", // Somali
        pl_PL: "6d0770c3-5130-4002-a64c-c2ee7779f678", // Polish
        ur_PK: "b34d733c-2c96-40ca-b373-6c38bf88c968", // Urdu
        en_GB: "3d2ff2ff-456e-4f78-89db-b7f7db878dc1"  // English
    },
    formMap: false,
    phraseTypeMap: false,
    qtipMap: {},
    init: function () {
        $.getScript(this.url + "getFormsJSON?callback=DICT.initForms");
        $.getScript(this.url + "getPhraseTypesJSON?callback=DICT.initPhraseTypes");
        return true;
    },
    initForms: function(json) {
        if ( ! Array.isArray(json) ) {
            return false;
        }
        this.formMap = {};
        for (i = 0; i < json.length; i++) {
            this.formMap[ json[i].form_id ] = json[i].name;
        }
        return this.initPopups();
    },
    initPhraseTypes: function(json) {
        if ( ! Array.isArray(json) ) {
            return false;
        }
        this.phraseTypeMap = {};
        for (i = 0; i < json.length; i++) {
            this.phraseTypeMap[ json[i].phrase_type_id ] = json[i].name;
        }
        return this.initPopups();
    },
    getFormText: function (formId) {
        return this.formMap[formId];
    },
    getPhraseTypeText: function (phraseTypeId) {
        return this.phraseTypeMap[phraseTypeId];
    },
    getLanguageId: function () {
        var languageId = this.languageMap[ PORTFOLIO.translation_language ];
        return typeof languageId === "string" ? languageId : this.languageMap[ 'en_GB' ];
    },
    isNotReady: function() {
        return ! ( this.formMap && this.phraseTypeMap );
    },
    stringStartsWith: function(str, substr) {
        if ( ! ( typeof str === 'string' && typeof substr === 'string' ) ) {
            return false;
        }
        return str.indexOf(substr) === 0;
    },
    getTalkbookURL: function(phrase) {
        return PORTFOLIO.site_url + "talkbook/" + this.contentLanguage + "/" + encodeURIComponent(phrase);
    },
    initPopups: function() {
        if ( this.isNotReady() ) {
            return false;
        }
        var dict = this;
        $(this.selector).qtip({
            content: '<div class="dict-content">' + PORTFOLIO.gettext('Fetching information...') + '</div>',
            position: {
                target: "mouse",
                corner: {
                    target: "topRight"
                },
                adjust: {
                    x: 10,
                    screen: true,
                    target: true,
                    scroll: true,
                    resize: true
                }
            },
            style: {
                width: {
                    min: 280,
                    max: 500
                },
                padding: 5,
                background: "#f3f3ff",
                color: "black",
                textAlign: "left",
                border: {
                    width: 1,
                    radius: 1,
                    color: "#abd"
                },
                tip: {},
                name: "dark"
            },
            show: {
                when: "click",
                solo: true,
                effect: {
                    type: "fade",
                    length: 200
                }
            },
            hide: {
                when: "mouseout",
                effect: {
                    type: "fade",
                    length: 200
                }
            },
            api: {
                onShow: function () {
                    if ( typeof soundManager === 'undefined' ) {
                        return false;
                    }
                    if ( ! soundManager.ok() ) {
                        return false;
                    }
                    $(".audio_mpeg button.play_stop_button", this.elements.content).click(); // trigger playback
                    return true;
                },
                onHide: function () {
                    if ( typeof soundManager === 'undefined' ) {
                        return false;
                    }
                    if ( ! soundManager.ok() ) {
                        return false;
                    }
                    soundManager.stopAll();
                    return true;
                },
                onRender: function () {
                    var qtip = this;
                    var phraseId = qtip.elements.target.attr("id").substring(2, 38); // Ids have this syntax: p_<uuid>
                    var qtipId = "qtip_" + phraseId.replace(/\-/g, ""); // Strip all dashes
                    dict.qtipMap[qtipId] = function(json) {
                        var phrase, basePhrase;
                        if ( json.grunnform ) {
                            basePhrase = "<span class='dict-field'>Grunnform: " + json.grunnform + "</span>";
                            phrase = json.grunnform;
                        }
                        else {
                            basePhrase = "";
                            phrase = json.phrase;
                        };
                        var article = dict.stringStartsWith(json.kjoenn, "m") ? "en" :
                                      dict.stringStartsWith(json.kjoenn, "f") ? "ei" :
                                      dict.stringStartsWith(json.kjoenn, "n") ? "et" :
                                      "";
                        // Support for Norwegian nynorsk
                        if ( json.language_id == "c048218a-7c28-41b6-a2a0-b675a4449353" ) {
                            dict.formMap["529ffaa5-601c-4342-b789-2874d14aff7d"] = "fleirtal",
                            dict.formMap["779e4cba-0ef6-4a04-8995-4a2874a5de42"] = "inkjekj\u00f8nn",
                            dict.formMap["903cf583-ad38-4906-9237-4f1d17b110f1"] = "bestemt fleirtal",
                            dict.formMap["94c6eb1a-d5b7-448a-a0b0-14968557e1f6"] = "ubestemt fleirtal",
                            dict.formMap["9c2e6602-0c39-44a8-92a7-d1f572aff1e1"] = "bestemt eintal",
                            dict.formMap["e80dd653-6eb3-41c4-9d01-edb74e17bc7b"] = "ubestemt eintal",
                            article = dict.stringStartsWith(json.kjoenn, "m") ? "ein" :
                                      dict.stringStartsWith(json.kjoenn, "f") ? "ei"  :
                                      dict.stringStartsWith(json.kjoenn, "n") ? "eit" :
                                      ""
                        };
                        var phraseType = "<span class='dict-field'>" +
                                            "<span class='dict-descriptor'>Ordklasse:</span>" +
                                            "<span class='dict-text'>" + dict.getPhraseTypeText(json.phrase_type_id) + "</span>" +
                                         "</span>" +
                                         "<span class='dict-field'>" +
                                            "<span class='dict-descriptor'>Form:</span>" +
                                            "<span class='dict-text'>" + dict.getFormText(json.form_id) + "</span>" +
                                         "</span>";
                        var declination = "";
                        if ( json.boyninger ) {
                            declination = "<span class='dict-field dict-declination'>" +
                                            "<span class='dict-descriptor'>" + "B\u00f8yning:" + "</span>" +
                                          "</span>" +
                                          "<span class='dict-field'>" + article + " " + phrase + ", " + json.boyninger + "</span>";
                        };
                        // Support for non-classified phrases
                        if ( json.phrase_type_id == "588570d3-fb34-44eb-9e4b-453ce7756e8d" ) {
                            declination = "";
                            phraseType = "<span class='dict-field'>" +
                                            "<span class='dict-descriptor'>Frase</span>" +
                                         "</span>";
                        };
                        var html = "<div class='dict-content'>" +
                                       "<span class='dict-field'>" +
                                           "<span class='dict-descriptor'>" + json.phrase + "</span>" +
                                           "<span class='dict-text'>" +
                                               "<a class='audio_mpeg small_audio_player' href='" + dict.getTalkbookURL(json.phrase) + "'></a>" +
                                           "</span>" +
                                       "</span>" +
                                       basePhrase +
                                       "<span class='dict-field dict-translation'>" + json.translation + "</span>" +
                                       "<span class='dict-field dict-description'>" + json.description + "</span>" +
                                       phraseType +
                                       declination +
                                   "</div>";
                        qtip.updateContent(html, false);
                        PORTFOLIO.init_audio_mpeg(qtip.elements.content);
                        return true;
                    };
                    $.getScript(dict.url + "getPhraseJSON?uuid=" + phraseId + "&tr_language_uuid=" + dict.getLanguageId() + "&callback=DICT.qtipMap." + qtipId);
                    return true;
                }
            }
        });
        return true;
    }
};
$(document).ready(function () {
    DICT.init();
});

