JavaScript API example

From 12.1.9 onwards, for cases where multiple partitions are configured in the Interact Run-time, it is mandatory to pass the partition in init method for InteractAPI. If the user enables authentication, this parameter is optional, as the partition will be fetched for the provided username.

    function isJavaScriptAPISelected() {
        var radios = document.getElementsByName('api');
        for (var i = 0, length = radios.length; i < length; i++) {
            if (radios[i].checked) {
                if (radios[i].value === 'JavaScript')
                    return true ;
                else  // only one radio can be logically checked
                    break;
            }
        }
        return false;   
    }

    function processFormForJSInvocation(e) {
    
        if (!isJavaScriptAPISelected())
            return;
            
        if (e.preventDefault) e.preventDefault();

        var serverurl = document.getElementById('serviceUrl').value ;
        InteractAPI.init( { "url" : serverurl, "m_partition_name" : partition_name  } );

        var commandsToExecute = { "ssid" : null, "commands" : [] };
        var callback = InteractAPI.Callback.create(onSuccess, onError);

        callStartSession(commandsToExecute, callback);
        callGetOffers(commandsToExecute, callback);
        callGetOffersForMultipleInteractionPoints(commandsToExecute, callback);
        callPostEvent(commandsToExecute, callback);
        callSetAudience(commandsToExecute, callback);
        callGetProfile(commandsToExecute, callback);
        callEndSession(commandsToExecute, callback);
        callSetDebug(commandsToExecute, callback);
        callGetVersion(commandsToExecute, callback);

        callExecuteBatch(commandsToExecute, callback);

        // You must return false to prevent the default form behavior
        return false;
    }

    function callStartSession(commandsToExecute, callback) {

        //read configured start session
        var ssId = document.getElementById('ss_sessionId').value;
        var icName = document.getElementById('ic').value; 
        var audId = document.getElementById('audienceId').value;
        var audLevel = document.getElementById('audienceLevel').value;
        var params = document.getElementById('ss_parameters').value; 
        var relyOldSs = document.getElementById('relyOnOldSession').value;
        var debug = document.getElementById('ss_isDebug').value;

        if (commandsToExecute && !commandsToExecute.ssid) {
            commandsToExecute.ssid = ssId;
        }

        if (commandsToExecute && commandsToExecute.commands) {
            commandsToExecute.commands.push(InteractAPI.CommandUtil.
                                       createStartSessionCmd(
                                       icName, getNameValuePairs(audId),
                                       audLevel, getNameValuePairs(params),
                                       relyOldSs, debug));
        }
        else {
            InteractAPI.startSession(ssId, icName, 
                                     getNameValuePairs(audId), audLevel,
                                     getNameValuePairs(params), relyOldSs,
                                     debug, callback) ;
        }

    }
    
    function callGetOffers(commandsToExecute, callback) {

        var ssId = document.getElementById('go_sessionId').value;
        var ip = document.getElementById('go_ipoint').value;
        var nofRequested = 5 ;
        var nreqString = document.getElementById('offersRequested').value;
        if (!nreqString && nreqString!== '')
            nofRequested = Number(nreqString);

        if (commandsToExecute && !commandsToExecute.ssid) {
            commandsToExecute.ssid = ssId;
        }

        if (commandsToExecute && commandsToExecute.commands) {
            commandsToExecute.commands.push(InteractAPI.CommandUtil.
                                       createGetOffersCmd(ip, nofRequested));
        }
        else {
            InteractAPI.getOffers(ssId, ip, nofRequested, callback);
        }
    }

    function callPostEvent(commandsToExecute, callback) {

        var ssId = document.getElementById('pe_sessionId').value;
        var ev = document.getElementById('event').value;
        var params = document.getElementById('parameters').value; 

        if (commandsToExecute && !commandsToExecute.ssid) {
            commandsToExecute.ssid = ssId;
        }

        if (commandsToExecute && commandsToExecute.commands) {
            commandsToExecute.commands.push(InteractAPI.
                                       CommandUtil.createPostEventCmd
                                       (ev, getNameValuePairs(params)));
        }
        else {
            InteractAPI.postEvent(ssId, ev, getNameValuePairs(params), callback);
        }
    }

    function callGetOffersForMultipleInteractionPoints
    (commandsToExecute, callback) {

        var ssId = document.getElementById('gop_sessionId').value;
        var requestDetailsStr = document.getElementById('requestDetail').value;
        
        //trim string
        var trimmed = requestDetailsStr.replace(/\{/g, "");
        var parts = trimmed.split("}");

        //sanitize strings
        for(i = 0; i < parts.length; i += 1) {
            parts[i] = parts[i].replace(/^\s+|\s+$/g, "");
        }

        //build get offer requests
        var getOffReqs = [];
        for(var i = 0; i < parts.length; i += 1) {
            var getofReqObj = parseGetOfferReq(parts[i]);
            if (getofReqObj) {
                getOffReqs.push(getofReqObj);
            }
        }

        if (commandsToExecute && !commandsToExecute.ssid) {
            commandsToExecute.ssid = ssId;
        }

        if (commandsToExecute && commandsToExecute.commands) {
            commandsToExecute.commands.push(InteractAPI.CommandUtil.
                                       createGetOffersForMultiple
                                       InteractionPointsCmd(getOffReqs));
        }
        else {
            InteractAPI.getOffersForMultipleInteractionPoints
                                       (ssId, getOffReqs, callback);
        }
    }

    function parseGetOfferReq(ofReqStr) {

        if (!ofReqStr || ofReqStr==="")
            return null;

        var posIp = ofReqStr.indexOf(',');
        var ip = ofReqStr.substring(0,posIp);
        var posNmReq = ofReqStr.indexOf(',', posIp+1);
        var numReq = ofReqStr.substring(posIp+1,posNmReq);
        var posDup = ofReqStr.indexOf(',', posNmReq+1);
        var dupPolicy = null;
        var reqAttributes = null;

        if (posDup===-1)
            dupPolicy = ofReqStr.substring(posNmReq+1);
        else
            dupPolicy = ofReqStr.substring(posNmReq+1,posDup);
        
        //check if request string has attributes 
        var reqAttrPos = ofReqStr.search(/\(/g);
        if (reqAttrPos!==-1) {
            var reqAttributesStr = ofReqStr.substring(reqAttrPos);
            reqAttributesStr = trimString(reqAttributesStr);
            reqAttributesStr = removeOpenCloseBrackets(reqAttributesStr);
            reqAttributes = parseReqAttributes(reqAttributesStr);
        }

       return InteractAPI.GetOfferRequest.create(ip, parseInt(numReq), 
                                    parseInt(dupPolicy), reqAttributes);
    }

    //trim string
    function trimString(strToTrim) {
        if (strToTrim)
            return strToTrim.replace(/^\s+|\s+$/g, "");
        else
            return null;
    }

    function trimStrArray(strArray) {
        if (!strArray) return ;
        for(var i = 0; i < strArray.length; i += 1) {
            strArray[i] = trimString(strArray[i]);
        }
    }

    //remove open and close brackets in the end
    function removeOpenCloseBrackets(strToUpdate) {
        if (strToUpdate)
            return strToUpdate.replace(/^\(+|\)+$/g, "");
        else
            return null;
    }

    function parseReqAttributes(ofReqAttrStr) {

        //sanitize string
        ofReqAttrStr = trimString(ofReqAttrStr);
        ofReqAttrStr = removeOpenCloseBrackets(ofReqAttrStr);

        if (!ofReqAttrStr || ofReqAttrStr==="")
            return null;

        //get the number requested
        var pos = ofReqAttrStr.indexOf(",");
        var numRequested = ofReqAttrStr.substring(0,pos);
        ofReqAttrStr = ofReqAttrStr.substring(pos+1);

        //first part will be attribute and rest will be child attributes
        var parts = [];
        pos = ofReqAttrStr.indexOf(",");
        if (pos!==-1) {
            parts.push(ofReqAttrStr.substring(0,pos));
            parts.push(ofReqAttrStr.substring(pos+1));
        }
        else {
            parts.push(ofReqAttrStr);
        }

        for(var i = 0; i < parts.length; i += 1) {
            //sanitize string
            parts[i] = trimString(parts[i]);
            parts[i] = removeOpenCloseBrackets(parts[i]);
            parts[i] = trimString(parts[i]);
        }

        //build list of attributes
        var attributes = [];
        var idx = 0;
        if (parts[0]) {
            var attParts = parts[0].split(";");
            for (idx=0; idx<attParts.length; idx++) {
                attParts[idx] = trimString(attParts[idx]);
                attParts[idx] = removeOpenCloseBrackets(attParts[idx]);
                attParts[idx] = trimString(attParts[idx]);
                
                var atrObj = parseAttribute(attParts[idx]);
                if (atrObj) attributes.push(atrObj);
            }
        }

        //build list of child attributes
        var childAttributes = [];
        if (parts[1]) {
            var childAttParts = parts[1].split(")");
            for (idx=0; idx<childAttParts.length; idx++) {
                
                childAttParts[idx] = trimString(childAttParts[idx]);
                childAttParts[idx] = removeOpenCloseBrackets(childAttParts[idx]);
                childAttParts[idx] = trimString(childAttParts[idx]);

                
                //get the number requested
                var noReqPos = childAttParts[idx].indexOf(",");
                var numReqAt = childAttParts[idx].substring(0,noReqPos);
                childAttParts[idx] = childAttParts[idx].substring(noReqPos+1);
                childAttParts[idx] = trimString(childAttParts[idx]);
                
                
                var atrObjParsed = parseAttribute(childAttParts[idx]);
                if (atrObjParsed) {
                    var childReq = InteractAPI.OfferAttributeRequirements.create
                    (parseInt(numReqAt), [atrObjParsed], null);
                    childAttributes.push(childReq);
                }
            }
        }

        return InteractAPI.OfferAttributeRequirements.create(parseInt(numRequested), 
        attributes, childAttributes);
    }

    function parseAttribute(attStr) {

        attStr = trimString(attStr);

        if (!attStr || attStr==="")
            return null;

        var pos1 = attStr.indexOf("=");
        var pos2 = attStr.indexOf("|");
        var nvp = InteractAPI.NameValuePair.create
                              ( attStr.substring(0,pos1),
                                attStr.substring(pos1+1, pos2),
                                attStr.substring(pos2+1));
        return nvp;
    }
function callSetAudience(commandsToExecute, callback) {
        if (!document.getElementById('checkSetAudience').checked)
            return ;

        var ssId = document.getElementById('sa_sessionId').value;
        var audId = document.getElementById('sa_audienceId').value;
        var audLevel = document.getElementById('sa_audienceLevel').value;
        var params = document.getElementById('sa_parameters').value;

        if (commandsToExecute && !commandsToExecute.ssid) {
            commandsToExecute.ssid = ssId;
        }

        if (commandsToExecute && commandsToExecute.commands) {
            commandsToExecute.commands.push(InteractAPI.CommandUtil.
                                            createSetAudienceCmd
            (getNameValuePairs(audId), audLevel, getNameValuePairs(params)));
        }
        else {
            InteractAPI.setAudience(ssId, getNameValuePairs(audId),
                                    audLevel, getNameValuePairs(params), 
                                    callback);
        }
    }

    function callGetProfile(commandsToExecute, callback) {

        var ssId = document.getElementById('gp_sessionId').value;

        if (commandsToExecute && !commandsToExecute.ssid) {
            commandsToExecute.ssid = ssId;
        }

        if (commandsToExecute && commandsToExecute.commands) {
            commandsToExecute.commands.push(InteractAPI.CommandUtil.
            createGetProfileCmd());
        }
        else {
            InteractAPI.getProfile(ssId, callback);
        }
    }

    function callEndSession(commandsToExecute, callback) {

        var ssId = document.getElementById('es_sessionId').value;

        if (commandsToExecute && !commandsToExecute.ssid) {
            commandsToExecute.ssid = ssId;
        }

        if (commandsToExecute && commandsToExecute.commands) {
            commandsToExecute.commands.push(InteractAPI.CommandUtil.
            createEndSessionCmd());
        }
        else {
            InteractAPI.endSession(ssId, callback);
        }
    }

    function callSetDebug(commandsToExecute, callback) {

        var ssId = document.getElementById('sd_sessionId').value;
        var isDebug = document.getElementById('isDebug').value;
        
        if (commandsToExecute && !commandsToExecute.ssid) {
            commandsToExecute.ssid = ssId;
        }

        if (commandsToExecute && commandsToExecute.commands) {
            commandsToExecute.commands.push(InteractAPI.CommandUtil.
            createSetDebugCmd(isDebug));
        }
        else {
            InteractAPI.setDebug(ssId, isDebug, callback);
        }
    }

    function callGetVersion(commandsToExecute, callback) {

        if (commandsToExecute && commandsToExecute.commands) {
            commandsToExecute.commands.push(InteractAPI.CommandUtil.
            createGetVersionCmd());
        }
        else {
            InteractAPI.getVersion(callback);
        }
    }

    function callExecuteBatch(commandsToExecute, callback) {

        if (!commandsToExecute)
            return ;

        InteractAPI.executeBatch(commandsToExecute.ssid, 
        commandsToExecute.commands, callback);
    }

    function getNameValuePairs(parameters) {

        if (parameters === '')
            return null ;

        var parts = parameters.split(';');
        var nvpArray = new Array(parts.length);

        for(i = 0; i < parts.length; i += 1) {
            var nvp = parts[i].split(',') ;
            var value = null;
            if (nvp[2]===InteractAPI.NameValuePair.prototype.TypeEnum.NUMERIC) {
                if (isNaN(nvp[1])) {
                    value = nvp[1];  //a non number was provided as number, 
                    pass it to API as it is
                }
                else {
                    value = Number(nvp[1]);
                }
            }
            else {
                value = nvp[1];
            }
            //special handling NULL value            
            if (value && typeof value === 'string') {
                if (value.toUpperCase() === 'NULL') {
                    value = null;
                }
            }            
            nvpArray[i] = InteractAPI.NameValuePair.create(nvp[0], value, nvp[2]) ;
        }

        return nvpArray;
    }

    function showResponse(textDisplay) {
        var newWin = open('','Response','height=300,width=300,titlebar=no,
        scrollbars=yes,toolbar=no,
       resizable=yes,menubar=no,location=no,status=no');

        if (newWin.locationbar !== 'undefined' && newWin.locationbar 
        && newWin.locationbar.visible)
            newWin.locationbar.visible = false;

        var displayHTML = '<META HTTP-EQUIV="Content-Type" 
        CONTENT="text/html; charset=UTF-8"> 
        <html><head><style>TD { border-width : thin; border-style : solid }</style.'
                            + "<script language='Javascript'>"
                            + "var desiredDomain = 'unicacorp.com'; "
                            + "if (location.href.indexOf(desiredDomain)>=0) "
                            + "{ document.domain = desiredDomain;} "
                            + "</script></head><body> "
                            + textDisplay
                            + "</body></html>" ;
        newWin.document.body.innerHTML = displayHTML;
        newWin.focus() ;
    }

    function onSuccess(response) {
        showResponse("********Response********<br> " + JSON.stringify(response)) ;
    }

    function onError(response) {
        showResponse("********Error********<br> " + response) ;
    }

    function formatResoponse(response) {

    }

    function printBatchResponse(batResponse) {
        
    }

    function printResponse(response) {

    }