/**
 * Expect amplafi.flow.js to be loaded first
 */
$(function() {
    var af = amplafi.flow;
    //Flow parameter names
    $.extend(af.fp, {
        availableCategories:'availableCategories',
        broadcastEnvelopes:'broadcastEnvelopes',
        // com.amplafi.core.iomanagement.flows.UriDownloadFlowPropertyChangeListener.DOWNLOAD_PUBLIC_URI
        fetchContent:'downloadPublicUri',
        insertionPointOffset:'insertionPointOffset',
        mepChanges:'mepChanges',
        // com.amplafi.core.messages.flows.MessageBodyFlowPropertyValueProvider.MESSAGE_BODY
        messageBody:'messageBody',
        messageEndPointsInfo:'messageEndPointsAuxInfo',
        // com.amplafi.core.flows.ExtendedFlowConstants.PUBLIC_URI
        publicUri: 'publicUri',
        templates:'templates'
    });

    amplafi.flow.defs.defineCall({
        categoriesListFlow: { flowTypeName: 'CategoriesList',
            success: function(responseObject) {
                var af = amplafi.flow;
                var cats = af._getFlowValue(responseObject, amplafi.flow.fp.availableCategories);
                var vals = amplafi.insertion.data['availableCategories'] = cats;
                if (vals) {
                    var categoriesHash = {};
                    for (var i=0; i<vals.length; i++) {
                        categoriesHash[vals[i].entityId] = vals[i]; 
                    }
                    amplafi.insertion.data['categoriesHash'] = categoriesHash;
                }
                
            }
        },
        categoryMessages:{ flowTypeName: 'CategoryMessages', 
            success: function(responseObject) {
                var af = amplafi.flow;
                var envs = $.evalJSON(af._getFlowValue(responseObject,amplafi.flow.fp.broadcastEnvelopes));
                amplafi.insertion.data['envelopes'] = envs;
    
                var messages = envs.messages;
                var mepId = 'newId';
                var ctx = {messageEndPointLookupKey:mepId};
                var envelopes = [];
                for (var msg_index in messages){
                    var msg = messages[msg_index];
                    var env = {lookupKey:'ampbe_xx', messageLookupKey:'ampmsg_'+msg.messageId,
                        headline:msg.headline, updateDate:msg.lastUpdate, message:msg.fullText,
                        eventStart:msg.eventStart, eventLocation:msg.eventLocation};
                    envelopes.push(env);
                }
                ctx.envelopes = envelopes;
    
                ctx.beforeText = template.substitutions.beforeText || {};
                ctx.afterText = template.substitutions.afterText || {};
    
                if (template)
                    node.innerHTML = freemarker.render(template.template, ctx);
                else
                    node.innerHTML = response;
    
                amplafi.insertion.startEditing();
            }
        },
        createMessageFlow: { flowTypeName: 'CreateAlert', 
                             fsLinkText :'Configure Reusing Selection',
                             fsContinueLinkText :'(continue) Reusing Selection',
                             fsMethod: amplafi.flow.defs.postMethod },
        websiteMEPCreateFlow: { flowTypeName: 'CreateWebsite',
                                 fsLinkText:'Replace and discard or insert after',
                                 fsContinueLinkText: 'Modify configuration'},
        editWebPointsFlow: { flowTypeName: 'EditWebPoints'},
        messageEndPointListFlow: { flowTypeName: 'MessageEndPointList', 
            success: function(responseObject) {
                var af = amplafi.flow;            
                var mepsData = af._getFlowValue(responseObject, amplafi.flow.fp.messageEndPointsInfo);
                amplafi.insertion.data['meplist'] = mepsData;
    
                var meps = amplafi.insertion.data['meplist'];
                if (!meps) {
                    return;
                }
                for (var i in amplafi.insertion.state) {
                    var stateMep = amplafi.insertion.state[i];
                    var initStateMep = amplafi.insertion.initialState[i];
                    if (meps[i]) {
                        initStateMep.template = {id:meps[i].template.lookupKey};
                        if (stateMep && !stateMep.template)
                            stateMep.template = initStateMep.template;
    
                        var topicsObj = meps[i].topics;
                        var topics = [];
                        for (var j in topicsObj) {
                            topics.push(''+topicsObj[j].entityId);
                        }
                        initStateMep.topics = topics;
                        if (stateMep && !stateMep.topics)
                            stateMep.topics = initStateMep.topics;
                    }
                }
                for (var i in meps) {
                    if (!amplafi.insertion.state[i]) {
                        // mep was not found on page, add it to the paste list!
                        var template = meps[i].template;
                        template.id = template.lookupKey;
                        var topics = [];
                        for (var j=0; j<meps[i].topics.length; j++) {
                            topics[j] = meps[i].topics[j].entityId;
                        }
                        amplafi.insertion.state[i] = {
                                disabled : true,
                                template : template,
                                topics : topics
                        };
                        // also add it to the initial state (as disabled)
                        var clonedTopics = topics.slice(0);
                        amplafi.insertion.initialState[i] = {
                                disabled : true,
                                template : template,
                                topics : clonedTopics
                        };
                    }
                }
                
            }},
        templatesListFlow: { flowTypeName: 'TemplatesList', 
            success : function(responseObject) {
                var af = amplafi.flow;            
                var templates = af._getFlowValue(responseObject, amplafi.flow.fp.templates);
                var vals = amplafi.insertion.data['templates'] = templates;
                if (vals) {
                    var templatesHash = {};
                    for (var i=0; i<vals.length; i++) {
                        templatesHash[vals[i].id] = vals[i]; 
                    }
                    amplafi.insertion.data['templatesHash'] = templatesHash;
                }
            }
        },
        tipsListFlow: { flowTypeName: 'tipsList',
            success: function(responseObject) {
                var af = amplafi.flow;
                
                var tipsList = af._getFlowValue(responseObject, 'tipsList');
                $.trigger("addTips", {tipsList : tipsList});            
            }
        },
     
        emptyFlow: { flowTypeName: 'Empty'}
    });
});
        
