if(!AJS.MacroBrowser.Macros["gadget"]){
    AJS.MacroBrowser.Macros["gadget"] = {};
}

AJS.MacroBrowser.Macros["gadget"].postPreview = function (iframe, macro) {
    var hasAJS = iframe.contentWindow.AJS;
    var bodyParamMap = {};
    var keyValuePairs = AJS.$("#macro-insert-container .macro-body-div textarea").val().split("&");
    for (var i = 0; i < keyValuePairs.length; i++) {
        var keyValue = keyValuePairs[i].split("=");
        try {
            bodyParamMap[decodeURI(keyValue[0])] = decodeURI(keyValue[1]);
        } catch(e) {
            //Do nothing, just skip it. It's not essential that we capture all preferences, and not all are valid
            //to be decoded as a URI
        }
    }
    if (macro.needsConfig && hasAJS) {
        var bodyConfigured = !!bodyParamMap["isConfigured"];

        if (!bodyConfigured) {
            var okButton = AJS.$("#macro-browser-dialog .button-panel .ok");
            AJS.$("#save-warning-span").addClass("gadget-not-configured-warning").text(AJS.params.gadgetPreviewWarning).removeClass("hidden");
            okButton.attr("disabled", "disabled");
        }
    }
}

AJS.MacroBrowser.Macros["gadget"].populateBodyParams = function(body) {
    var bodyParamMap = {};
    var keyValuePairs = AJS.$("textarea", body).val().split("&");
    for (var i = 0; i < keyValuePairs.length; i++) {
        var keyValue = keyValuePairs[i].split("=");
        bodyParamMap[decodeURI(keyValue[0])] = decodeURI(keyValue[1]);
    }
    return bodyParamMap;
}

AJS.MacroBrowser.Macros["gadget"].prepareMacroForPreview = function(wikiMarkup) {
    var posOfBrace = wikiMarkup.indexOf('}');
    return wikiMarkup.substring(0, posOfBrace) + "|forceWrite=true" + wikiMarkup.substring(posOfBrace, wikiMarkup.length);
}

AJS.MacroBrowser.Macros["gadget"].manipulateMarkup = function (macro) {
        if(AJS.MacroBrowser.gadgetPrefsChanged){
            var container = top.document.getElementById("macro-insert-container");
            var textArea = AJS.$(".macro-body-div .textarea", container);
            var baseVal = "";
            for (var key in AJS.MacroBrowser.gadgetPrefs)
            {
                if (baseVal.length != 0)
                {
                    baseVal += "&";
                }
                baseVal = baseVal + encodeURI(key) + "=" + encodeURI(AJS.MacroBrowser.gadgetPrefs[key]);
            }
            textArea.val(baseVal);
        }
}

//Adds special behaviour for "gadget" macros : only considered the same if they share the same url as the selected macro
AJS.MacroBrowser.Macros["gadget"].getMacroDetailsFromSelectedMacro = function(metadataList, selectedMacroToUse) {
    var selectedUrl = selectedMacroToUse.params["url"];
    for (var i = 0; i < metadataList.length; i++) {
        var tempMacro = metadataList[i];
        if (tempMacro.macroName == selectedMacroToUse.name) {
            for (var j = 0; j < tempMacro.formDetails.parameters.length; j++) {
                if (tempMacro.formDetails.parameters[j].name == "url") {
                    if (tempMacro.formDetails.parameters[j].defaultValue == selectedUrl) {
                        return tempMacro;
                    }
                }
            }
        }
    }
}

//Add special handling to intepret and merge existing body params for opensocial preference gadgets
AJS.MacroBrowser.Macros["gadget"].applySpecialBodyHandling = function(macro, previousBodyMarkup, bodyParamMap) {
    var result="";
    if (macro.nonHiddenUserPrefs) {
        var first = true;
        //reparse the possible existing key value pairs
        var userPreferenceMap = {};

        if (previousBodyMarkup) {
            var keyValuePairs = previousBodyMarkup.split("&");
            for (var i = 0; i < keyValuePairs.length; i++) {
                var keyValue = keyValuePairs[i].split("=");
                var userPrefKey = decodeURI(keyValue[0]);
                var userPrefValue = decodeURI(keyValue[1]);
                userPreferenceMap[userPrefKey] = userPrefValue;
            }
        }

        //New values take precedence over existing values
        for (var param1 in bodyParamMap) {
            userPreferenceMap[param1] = bodyParamMap[param1];
        }

        var isDefaultValue = function (macro, name, value)
        {
            var params = macro.formDetails.parameters
            for (var i = 0; i < params.length; i++)
            {
                if (params[i].name == name)
                {
                    return value == params[i].defaultValue;
                }
            }
            //Not necessarily bad ... could be a param we don't have metadata for
            AJS.log("Unable to find matching param for " + name);
            return false;
        }

        for (var param in userPreferenceMap) {
            if (!isDefaultValue(macro, param, userPreferenceMap[param]))
            {
                if (!first)
                {
                    result += "&";
                }
                first = false;
                result = result + encodeURI(param) + "=" + encodeURI(userPreferenceMap[param]);
            }
        }
        return result;
    }
    else
    {
        return previousBodyMarkup;
    }
}


