var plupperWindow = null;
var plupper = {
    providerId:"",
    cobrowsing:false,
    embedded:false,
    visitorCookie:"puid",
    sideBadgeEnabled:false,
    orientation:null,
    position:null,
    embHolder:null,
    embWidth:null,
    onStartCallback:null,
    enableCobrowsing:function() {
        plupper.cobrowsing = true;
    },
    enableEmbedded:function(width) {
        plupper.embedded = true;
        plupper.embWidth = width;
    },
    init:function (providerId) {
        plupper.providerId = providerId;
        plupper.processButtons(providerId);
    },
    start:function (providerString) {
        visitorUUID = plupper.getVisitorUUID();
        plupper.openWin(providerString, visitorUUID);
        if(plupper.onStartCallback !== null) {
            plupper.onStartCallback();
        }
    },
    openWin:function(providerString, visitorId) {
        if(plupper.embedded === true) {
            plupper.createEmbeddedIFrame(providerString, visitorId);
            plupper.writeSessionCookie("plupperEmbedded", "1");
            plupper.setCookie("enabled", "1", "1");
            if(plupper.cobrowsing === true) {
                plupper.trackUser(false);
            }
            return;
        }
        if(plupperWindow !== null) {
            if(!plupperWindow.closed) {
                plupperWindow.focus();
                return;
            }
        }
        var width = 700;
        var height = 320;
        var left = parseInt((screen.availWidth/2) - (width/2));
        var top = parseInt((screen.availHeight/2) - (height/2));
        var windowFeatures = "width=" + width + ",height=" + height + ",status=no,resizable=no,toolbar=no,menubar=no,directories=no,screllbars=no,left=" + left + ",top=" + top + "screenX=" + left + ",screenY=" + top;
        plupperWindow = window.open("https://www.plupper.com/widget/plupper.xhtml?p=" + providerString + "&v=" + visitorId,
            "plupper",
            windowFeatures);
        plupperWindow.focus();
        plupper.setCookie("enabled", "1", "1");
        if(plupper.cobrowsing === true) {
            plupper.trackUser(false);
        }
    },
    getPage:function() {
        //var elements = $("html");
        var elements = document.getElementsByTagName('html');
        var documentString = elements[0].innerHTML;
        return documentString;
    },
    getVisitorUUID:function() {
        var visitorUUID = plupper.getCookieValue(plupper.visitorCookie);
        if(visitorUUID === null) {
            return plupper.createVisitorUUID();
        } else {
            return visitorUUID;
        }
    },
    createVisitorUUID:function() {
        var uuid = new UUID();
        plupper.setCookie(plupper.visitorCookie, uuid, 1000);
        return uuid;
    },
    trackUser:function(check) {
        if(check) {
            var enabled = plupper.getCookieValue("enabled");
            if(enabled !== "1") {
                return;
            }
        }
        plupper.createIFrame();
        var page = plupper.getPage();
        var clearPage = "<html>" + page + "</html>";
        var innerForm = document.createElement("form");
        innerForm.id = "plupperForm";
        innerForm.name = "plupperForm";
        var visitorUUID = plupper.getCookieValue(plupper.visitorCookie);
        innerForm.action = "https://www.plupper.com/resources/tracker?v=" + visitorUUID;
        innerForm.method = "post";
        var parentUrl = document.createElement("input");
        parentUrl.type = "hidden";
        parentUrl.name = "url";
        parentUrl.value = window.location.href;
        innerForm.appendChild(parentUrl); 
        var parentHtml = document.createElement("input");
        parentHtml.type = "hidden";
        parentHtml.name = "page";
        parentHtml.value = clearPage;
        innerForm.appendChild(parentHtml);
        var parentProvider = document.createElement("input");
        parentProvider.type = "hidden";
        parentProvider.name = "providerId";
        parentProvider.value = plupper.providerId;
        innerForm.appendChild(parentProvider);

        var iFrame =  document.getElementById('plupperFrame');
        var iFrameBody;
        if (iFrame.contentDocument)  { // FF
            iFrameBody = iFrame.contentDocument.getElementsByTagName('body')[0];
        }
        if(iFrame.contentWindow) { // IE
            iFrameBody = iFrame.contentWindow.document.getElementsByTagName('body')[0];
            if(iFrameBody === undefined) {
                var body = document.createElement("body");
                iFrame.contentWindow.document.appendChild(body);
                iFrameBody = body;
            }
        }
        if(iFrameBody !== undefined) {
            iFrameBody.appendChild(innerForm);
            innerForm.submit();
        } 
    },
    trim:function(str, chars) {
        return plupper.ltrim(plupper.rtrim(str, chars), chars);
    },
    ltrim:function(str, chars) {
        chars = chars || "\\s";
        return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
    },
    rtrim:function(str, chars) {
        chars = chars || "\\s";
        return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
    },
    setCookie:function(c_name,value,expiredays) {
        var exdate=new Date();
        exdate.setDate(exdate.getDate()+expiredays);
        document.cookie=c_name+ "=" +escape(value)+
        ((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
    },
    writeSessionCookie:function(cookieName, cookieValue) {
        document.cookie = escape(cookieName) + "=" + escape(cookieValue) + "; path=/";
    },
    getCookieValue:function(cookieName) {
        var exp = new RegExp (escape(cookieName) + "=([^;]+)");
        if (exp.test (document.cookie + ";")) {
            exp.exec (document.cookie + ";");
            return unescape(RegExp.$1);
        }
        else {
            return null;
        }
    },
    processButtons:function(providerId) {
        var elements = document.getElementsByTagName("div");
        for (i = 0; i < elements.length; i++) {
            var divId = elements[i].id;
            if((divId.indexOf("plupperButton") === 0)) {
                if(divId.length > 13) {
                    plupper.createButton(elements[i], providerId, divId.substr(13));
                } else {
                    plupper.createButton(elements[i], providerId, null);
                }
            }
        }
    },
    createButton:function(plupperButton, providerId, user) {
        var buttonHref = document.createElement("a");
        buttonHref.setAttribute("href", "javascript:;");
        var buttonImage = document.createElement("img");
        buttonImage.setAttribute("style", "border:0px;");
        var providerString;
        if(user !== null) {
            providerString = providerId + user;
        } else {
            providerString = providerId;
        }
        buttonImage.src = "https://www.plupper.com/resources/button?p=" + providerString;
        buttonImage.setAttribute("alt", "");
        buttonImage.onclick = function() {
            plupper.start(providerString);
        };
        buttonHref.appendChild(buttonImage);
        plupperButton.appendChild(buttonHref);
    },
    setStyle:function(obj, style) {
        if (obj.style.cssText != null) {
            obj.style.cssText = style;
        } else {
            obj.setAttribute("style", style);
        }
    },
    createIFrame:function() {
        var plupperFrame = document.createElement("iframe");
        plupperFrame.id = "plupperFrame";
        plupperFrame.name = "plupperFrame";
        plupperFrame.setAttribute("style", "display:none;width=0px;height=0px;visibility:hidden;");
        plupperFrame.setAttribute("width", "0");
        plupperFrame.setAttribute("height", "0");
        plupperFrame.setAttribute("src", "javascript:false;");
        document.getElementsByTagName('body')[0].appendChild(plupperFrame);
    },
    createEmbeddedIFrame:function(providerString, visitorId) {
        if(plupper.embHolder !== null) {
            return;
        }
        plupper.embHolder = document.createElement("div");
        plupper.embHolder.id = "plupperChatHolder";
        plupper.setStyle(plupper.embHolder, "position:fixed !important; position: absolute;right:0px;bottom:0px;border:0px;z-index:10000;");
        var iconHolder = document.createElement("div");
        plupper.setStyle(iconHolder, "background-color:#404040;text-align:right;padding-right:5px;");
        iconHolder.id="plupperIconHolder";
        var closeLink = document.createElement("a");
        closeLink.id="plupperCloseLink";
        closeLink.setAttribute("href", "javascript:;");
        var closeIcon = document.createElement("img");
        closeIcon.id="closeIcon";
        closeIcon.setAttribute("src", "https://www.plupper.com/widget/images/close_icon.gif");
        closeIcon.setAttribute("alt", "close");
        closeIcon.setAttribute("title", "close");
        plupper.setStyle(closeIcon, "z-index:100000;");
        var plupperFrame = document.createElement("iframe");
        plupperFrame.id = "plupperEmbeddedFrame";
        plupperFrame.name = "plupperEmbeddedFrame";
        plupper.setStyle(plupperFrame, "border: 0px;");
        plupperFrame.setAttribute("width", "" + plupper.embWidth);
        plupperFrame.setAttribute("height", "320");
        plupperFrame.setAttribute("scrolling", "no");
        plupperFrame.setAttribute("frameborder", "0");
        closeLink.appendChild(closeIcon);
        iconHolder.appendChild(closeLink);
        plupper.embHolder.appendChild(iconHolder);
        plupper.embHolder.appendChild(plupperFrame);
        closeLink.onclick = plupper.closeEmbeddedChat;
        document.getElementsByTagName('body')[0].appendChild(plupper.embHolder);
        if (typeof(setIE6location) != 'undefined') {
            plupperFrame.frameborder = "no";
            setIE6location();
        }
        plupperFrame.setAttribute("src", "https://www.plupper.com/widget/plupper.xhtml?p=" + providerString + "&v=" + visitorId + "&emb=true");
    },
    setIE6location:function() {
        //alert("hi");
        window.frames["plupperEmbeddedFrame"].location = "https://www.plupper.com/widget/plupper.xhtml?p=" + providerString + "&v=" + visitorId + "&emb=true";
    },
    closeEmbeddedChat:function() {
        plupper.writeSessionCookie("plupperEmbedded", "0");
        document.getElementsByTagName('body')[0].removeChild(plupper.embHolder);
        plupper.embHolder = null;
    },
    showSideBadge:function(_orientation, _position) {
        plupper.sideBadgeEnabled = true;
        plupper.orientation = _orientation;
        plupper.position = _position;
        if (plupper.isIE()) {
        //wait until page completion
        } else {
            plupper.createSideBadge();
        }
    },
    createSideBadge:function() {
        var buttonHref = document.createElement("a");
        buttonHref.id="sideBadgeHref";
        buttonHref.setAttribute("href", "javascript:;");

        var sideBadge = document.createElement("img");
        sideBadge.setAttribute("style", "border:0px;");
        sideBadge.setAttribute("alt", "");
        sideBadge.id="plupperSideBadge";
        sideBadge.src="https://www.plupper.com/resources/button/sideBadge?p=" + plupper.providerId;
        sideBadge.onclick = function() {
            plupper.start(plupper.providerId);
        };
        buttonHref.appendChild(sideBadge);
        document.getElementsByTagName('body')[0].appendChild(buttonHref);
        var badge = document.getElementById('plupperSideBadge');
        var badgeStyle = "";
        badge.style.position="fixed";
        if(plupper.orientation === "left") {
            badgeStyle = "position:fixed !important; position: absolute; left: 0px; top:" + plupper.position + ";";
        } else if(plupper.orientation === "right") {
            badgeStyle = "position:fixed !important; position: absolute; right: 0px; top:" + plupper.position + ";";
        } else if(plupper.orientation === "bottom") {
            badgeStyle = "position:fixed !important; position: absolute; bottom: 0px; left:" + plupper.position + ";";
        } else {
            badgeStyle = "position:fixed !important; position: absolute; left: 0px; top:30%;";
        }

        plupper.setStyle(badge, badgeStyle);
    },
    scrollSideBadge:function() {
        var badge = document.getElementById('sideBadgeHref');
        var offset = plupper.getClientHeight();
        var result = offset/3;
        if(plupper.orientation === "left") {
            plupper.setStyle(badge, "position:fixed !important; position: absolute; left: 0px; top:"+(document.documentElement.scrollTop + result - badge.offsetHeight) + "px;");
        } else if(plupper.orientation === "right") {
            plupper.setStyle(badge, "position:fixed !important; position: absolute; right: 0px; top:"+(document.documentElement.scrollTop + result - badge.offsetHeight) + "px;");
        } else {
            plupper.setStyle(badge, "position:fixed !important; position: absolute; left: 0px; top:"+(document.documentElement.scrollTop + result - badge.offsetHeight) + "px;");
        }
    },
    getClientHeight:function() {
        return typeof( window.innerHeight) !== "undefined" ?window.innerHeight :document.documentElement.clientHeight;
    },
    isIE:function() {
        return !+"\v1";
    },
    setOnStartCallback:function(callback) {
        plupper.onStartCallback = callback;
    }
};

// On creation of a UUID object, set it's initial value
function UUID(){
    this.id = this.createUUID();
}

// When asked what this Object is, lie and return it's value
UUID.prototype.valueOf = function(){
    return this.id;
}
UUID.prototype.toString = function(){
    return this.id;
}

//
// INSTANCE SPECIFIC METHODS
//

UUID.prototype.createUUID = function(){
    //
    // Loose interpretation of the specification DCE 1.1: Remote Procedure Call
    // described at http://www.opengroup.org/onlinepubs/009629399/apdxa.htm#tagtcjh_37
    // since JavaScript doesn't allow access to internal systems, the last 48 bits
    // of the node section is made up using a series of random numbers (6 octets long).
    //
    var dg = new Date(1582, 10, 15, 0, 0, 0, 0);
    var dc = new Date();
    var t = dc.getTime() - dg.getTime();
    var h = '-';
    var tl = UUID.getIntegerBits(t,0,31);
    var tm = UUID.getIntegerBits(t,32,47);
    var thv = UUID.getIntegerBits(t,48,59) + '1'; // version 1, security version is 2
    var csar = UUID.getIntegerBits(UUID.rand(4095),0,7);
    var csl = UUID.getIntegerBits(UUID.rand(4095),0,7);

    // since detection of anything about the machine/browser is far to buggy,
    // include some more random numbers here
    // if NIC or an IP can be obtained reliably, that should be put in
    // here instead.
    var n = UUID.getIntegerBits(UUID.rand(8191),0,7) +
    UUID.getIntegerBits(UUID.rand(8191),8,15) +
    UUID.getIntegerBits(UUID.rand(8191),0,7) +
    UUID.getIntegerBits(UUID.rand(8191),8,15) +
    UUID.getIntegerBits(UUID.rand(8191),0,15); // this last number is two octets long
    return tl + h + tm + h + thv + h + csar + csl + h + n;
}


//
// GENERAL METHODS (Not instance specific)
//


// Pull out only certain bits from a very large integer, used to get the time
// code information for the first part of a UUID. Will return zero's if there
// aren't enough bits to shift where it needs to.
UUID.getIntegerBits = function(val,start,end){
    var base16 = UUID.returnBase(val,16);
    var quadArray = new Array();
    var quadString = '';
    var i = 0;
    for(i=0;i<base16.length;i++){
        quadArray.push(base16.substring(i,i+1));
    }
    for(i=Math.floor(start/4);i<=Math.floor(end/4);i++){
        if(!quadArray[i] || quadArray[i] == '') quadString += '0';
        else quadString += quadArray[i];
    }
    return quadString;
}

// Replaced from the original function to leverage the built in methods in
// JavaScript. Thanks to Robert Kieffer for pointing this one out
UUID.returnBase = function(number, base){
    return (number).toString(base).toUpperCase();
}

// pick a random number within a range of numbers
// int b rand(int a); where 0 <= b <= a
UUID.rand = function(max){
    return Math.floor(Math.random() * (max + 1));
}

google.setOnLoadCallback(function() {
    /*@cc_on
@if (@_jscript_version <= 5.6)
    window.onscroll = plupper.scrollSideBadge;
/*@end @*/
    if(plupper.isIE() && plupper.sideBadgeEnabled) {
        plupper.createSideBadge();
    }
    if(plupper.embedded) {
        if(plupper.getCookieValue("plupperEmbedded") === "1") {
            var visitorUUID = plupper.getCookieValue(plupper.visitorCookie);
            plupper.createEmbeddedIFrame(plupper.providerId, visitorUUID);
        }
    }
    if(plupper.cobrowsing) {
        plupper.trackUser(true);
    }
});
