//embed v2

/*

//sample options object

var claOptions = {
'iframe' : 'cla_iframe', //side_chan.html will expect this to be cla_iframe (unless otherwise changed)
'chatUrl' : 'http://chat.virgindigitalhelp.co.uk/CLA_Frontend/index.htm?sitecode=3zxnx86x0l7a',
'backChanUrl' : 'cla_embed/back_chan.html',
'sideChanUrl' : 'http://chat.virgindigitalhelp.co.uk/CLA_API/side_chan.html',
'sideChanIframeId' : 'sideChannelIframe',
'sendOnLoadInput' : true 
};

*/

//NOTE: we currently don't have support for open and close functions
var cla = function() {
    //local vars
    var isLoaded = false;
    var sendQueue = [];
    var lastMsgId = -1;
    var lastMsgTime = 0;

    //local functions
    var send = function(command, args) {
        try {
            sendQueue.push(escape(command) + ':' + escape(args));
        } catch (error) {
            alert('error: ' + error);
        }
    };

    var doSend = function() {
        if (isLoaded && sendQueue.length > 0 && lastMsgTime + 500 < (new Date()).getTime()) {
            var msg = sendQueue.shift();

            if (claOptions.sideChanUrl != null) {
                lastMsgId++;
                lastMsgTime = (new Date()).getTime();

                var existingIframe = document.getElementById(claOptions.sideChanIframeId);
                if (existingIframe != null)
                    document.body.removeChild(existingIframe);

                var iframe = document.createElement('iframe');
                iframe.id = claOptions.sideChanIframeId;
                iframe.src = claOptions.sideChanUrl + "#" + lastMsgId + ':' + msg;
                iframe.style.position = "absolute";
                iframe.style.visibility = "hidden";
                iframe.style.top = iframe.style.left = iframe.style.width = iframe.style.height = "0";
                document.body.appendChild(iframe);
            }
        }
    };

    var receiveMessageFromInner = function(msg) {
        var colPos1 = msg.indexOf(":");
        var colPos2 = msg.indexOf(":", colPos1 + 1);
        if (colPos1 > 0 && colPos2 > colPos1 + 1) {
            var msgId = msg.substring(0, colPos1);
            var command = unescape(msg.substring(colPos1 + 1, colPos2));
            var args = "";
            if (colPos2 < msg.length - 1)
                args = unescape(msg.substring(colPos2 + 1));

            switch (command) {
                case "ack":
                    if (args == lastMsgId) {
                        var existingIframe = document.getElementById(claOptions.sideChanIframeId);
                        if (existingIframe != null)
                            document.body.removeChild(existingIframe);
                        lastMsgTime = 0;
                    }
                    break;
                case "open":
                    window.location = args;
                    break;
                default:
                    break;
            }

            if (command != "ack")
                send("ack", msgId);
        }
    };

    function findIFrame(id) {
        var iframe = document.getElementById(id);
        if (iframe == null) {
            var iframes = document.getElementsByTagName('iframe');
            for (var i = 0; i < iframes.length; i++) {
                if (iframes[i].name == id) {
                    iframe = iframes[i];
                    break;
                }
            }

        }
        return iframe;
    }
    function eventPush(obj, event, handler) {
        if (obj.addEventListener) {
            obj.addEventListener(event, handler, false);
        } else if (obj.attachEvent) {
            obj.attachEvent('on' + event, handler);
        }
    }
    function iFrameLoadHandler() {
        isLoaded = true;
        send('setLocation', window.location.toString());
        if (claOptions && claOptions.sendOnLoadInput)
            send('getReplySilent', '_onload');
    }

    //init
    send('setBackChannel',window.location.protocol + "//" + window.location.host +"/" + claOptions.backChanUrl);
    var iFrameElement = findIFrame(claOptions.iframe);
    if (iFrameElement) {
        //iFrameElement.onload = iFrameLoadHandler;
        eventPush(iFrameElement, 'load', iFrameLoadHandler);
        setInterval(doSend, 100);
        iFrameElement.src = claOptions.chatUrl;
    }

    //return the public interface
    return {
        'send': send,
        'receiveMessageFromInner': receiveMessageFromInner
    };


} ();

