﻿// JScript File

var coloredLine = false;
var presenceMenuOpen = false;
var menu;
var timer = 0;
var chatCount = 0;
var chatWindows = [];

var selectedUri;


function loginSubmit()
{     
    var params = "";    
    doCallBack(handleLogon, "logon", params);    
}     

function passKeyDown(e)
{
    if (isEnterKey(e) == true) loginSubmit();
}

function setCursor(cursor)
{
    document.getElementsByTagName("body")[0].style.cursor = cursor;
}

function checkRequest(request)
{                       
    if (request.readyState != 4)
    {        
         return false;
    }    
    if (request.status != 200)
    {        
        alert("There was a problem retrieving data from the web site:\n" + request.statusText);
        return false;
    }
    if (request.responseText.indexOf("<error>") > 0)
    {        
        //Load the XML string into a XML document.
        var xml = loadXmlDoc(request.responseText);
        alert(xml.getElementsByTagName("error")[0].childNodes[0].nodeValue);
        return false;
    }
    if (request.responseText == "") return false;
    
    
    return true;
}

//Load the XML string into a XML document.
function loadXmlDoc(xmlString)
{
    var xmlDoc;
    
    try //Internet Explorer
    {
          xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
          xmlDoc.async = "false";
          xmlDoc.loadXML(xmlString);
    }
    catch(e)
    {
          try //Firefox, Mozilla, Opera, etc.
          {
            var parser = new DOMParser();
            xmlDoc = parser.parseFromString(xmlString,"text/xml");
          }
          catch(e)
          {
            alert(e.message);
            return;
          }
    }
    
    return xmlDoc;
}

function handleLogon(request)
{    
    if (!checkRequest(request)) return;
    setCursor("default");       

    //Load the XML string into a XML document.
    var xmlDoc = loadXmlDoc(request.responseText);
    
    var uri = xmlDoc.getElementsByTagName("uri")[0].childNodes[0].nodeValue;
    var msg = xmlDoc.getElementsByTagName("message")[0].childNodes[0].nodeValue;  
           
    //showMessage(msg);
         
    // start new session
    setCursor("progress");   
    doCallBack(handleNewSession, "startSession", "");
}

function doCallBack(callBack, callBackMethod, callBackParams)
{
    var request;  
    	           
    /*try
    {
        // Internet Explorer Browsers
        request = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch(e)
    {
        try
        {            
            // Opera 8.0+, Firefox, Safari
            request = new XMLHttpRequest();
        }
        catch(e)
        {
        }
    }*/
    
    try
    { 
        // Firefox, Opera 8.0+, Safari 
        request = new XMLHttpRequest(); 
    }
    catch (e)
    { 
        // Internet Explorer 
        try
        { 
            request = new ActiveXObject("Msxml2.XMLHTTP"); 
        }
        catch (e)
        { 
            try
            { 
                request = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e)
            { 
            } 
        } 
    }

    request.onreadystatechange = function() { callBack(request); };
    var url = document.URL;
    if (url.toLowerCase().indexOf("agilelive.aspx") <= 0) url += "AgileLive.aspx";
    var data = "<request><method>" + callBackMethod + "</method><params>" + callBackParams + "</params></request>";
    request.open("POST", url, true);
    request.setRequestHeader("Accept", "message/xml-communicatorData");       
    request.send(data);


/*var request = new ActiveXObject("Microsoft.XMLHTTP");

request.onreadystatechange = function() { callBack(request); };
var url = document.URL;
if (url.toLowerCase().indexOf("default.aspx") <= 0) url += "Default.aspx";
var data = "<request><method>" + escape(callBackMethod) + "</method><params>" + callBackParams + "</params></request>";
request.open("GET", url, true);
request.setRequestHeader("Accept", "message/xml-communicatorData");
request.send(data);*/
}  

function handleNewSession(request)
{
    if (!checkRequest(request)) return;
    setCursor("default");
    
    //Load the XML string into a XML document.
    var xmlDoc = loadXmlDoc(request.responseText);
    
    var sid = xmlDoc.getElementsByTagName("sid")[0].childNodes[0].nodeValue;
    var msg = xmlDoc.getElementsByTagName("message")[0].childNodes[0].nodeValue;  
    
    //showMessage(msg);
    
    // Start Polling For Events
    timer = setTimeout("checkForEvents()", 0);
    window.onbeforeunload = window_onBeforeUnload;
}

function handleUserPresence(request)
{
    if (!checkRequest(request)) return;
    setCursor("default");
    
    //Load the XML string into a XML document.
    var xmlDoc = loadXmlDoc(request.responseText);
    
    var msg = xmlDoc.getElementsByTagName("message")[0].childNodes[0].nodeValue;  
           
    //showMessage(msg);
}

function checkForEvents()
{   
    if (!timer) return;
    timer = null;
    doCallBack(handleEvents, "checkEvents", "");
}

function handleEvents(request)
{     
    if (!checkRequest(request)) 
    { 
        return;
    }       
    
    //alert("Status: " + request.status + " State: " + request.readyState + " " + request.responseText); 
    
    //Load the XML string into a XML document.
    var xml = loadXmlDoc(request.responseText);

    //var msg = xml.getElementsByTagName("message")[0].childNodes[0].nodeValue;  
    var nodes = xml.getElementsByTagName("message");
    
    try
    {
        nodes = xml.documentElement.selectNodes("message");
        
        for (var i = 0; i < nodes.length; i++)
        {
            var msg = nodes[i].text;
            //if (msg != "") showMessage(msg);
        }
        
        var pollTime = xml.documentElement.selectSingleNode("waitTime").text; 
    }
    catch(e)
    {
    } 
       
    timer = setTimeout("checkForEvents()", 5000);
    parseDataEvents(xml);
}

function parseDataEvents(xml)
{        
    var nodeList = xml.getElementsByTagName("dataEvents");    
    if (nodeList.length == 0) return;          
    for (var i = 0; i < nodeList.length; i++)
    {   
        //getElementsByTagName('tagname').item(0)
        var node = nodeList[i].childNodes[0];        
        switch (node.nodeName)
        {
            /*case "userPresence":
                updatePresence(node.text, document.getElementById("presenceIcon"));
                break;
            case "userName":
                var td = document.getElementById("userName");
                if (nodeList[i].text != "")
                    td.firstChild.nodeValue = nodeList[i].text;
                break;*/
            case "contactPresence":                    
                setContactPresence(nodeList[i]);
                break;
            case "newConference":
                if (chatCount == 0) { createChatWindow(nodeList[i].text); } //This is a flag that indicates whether a chat window is open, we do not want more than one open, cause they will be on top of one another.
                break;
            case "participant":
                var confId = nodeList[i].selectSingleNode("participant/confId").text;
                var uri = nodeList[i].selectSingleNode("participant/uri").text;
                var name = nodeList[i].selectSingleNode("participant/name").text;                                                
                addChatParticipant(confId, uri, name);
                break;
            case "newMessage":
                var confId = nodeList[i].selectSingleNode("newMessage/confId").text;
                var message = nodeList[i].selectSingleNode("newMessage/message").text;
                var sender = nodeList[i].selectSingleNode("newMessage/uri").text;
                updateConversation(false, confId, message);
                break;
        }
    }
}

function updatePresence(value, img) {
    var val;
    if (value < 3000) val = "Offline";
    else if (value < 4500) val = "Online";
    else if (value < 6000) val = "IdleOnline";
    else if (value < 7500) val = "Busy";
    else if (value < 9000) val = "IdleBusy";
    else if (value < 12000) val = "Dnd";
    else if (value < 18000) val = "Away";
    else val = "Offline";
    
    img.src = "PresenceImages/presence" + val + ".png";
    img.alt = val;
}

function GetImageSrc(value)
{
    if (value < 3000) return;
    var val;
    if (value < 4500) val = "Online";
    else if (value < 6000) val = "IdleOnline";
    else if (value < 7500) val = "Busy";
    else if (value < 9000) val = "IdleBusy";
    else if (value < 12000) val = "Dnd";
    else if (value < 18000) val = "Away";
    else val = "Offline";

    return "PresenceImages/presence" + val + ".png";
}

function GetLargeImageSrc(value)
{
    var val;
    if (value == "Available") val = "Online";
    else if (value == "Busy") val = "Busy";
    else if (value == "Do Not Disturb") val = "Dnd";
    else if (value == "Away From Desk") val = "Away";
    else if (value == "Offline") val = "Offline";
    else val = "Online";

    return "PresenceImages/presenceLarge" + val + ".png";
}

function GetAvailabilityText(value)
{
    var val;
    if (value < 3000) val = "";
    else if (value < 4500) val = "Available";
    else if (value < 6000) val = "Available";
    else if (value < 7500) val = "Busy";
    else if (value < 9000) val = "Busy";
    else if (value < 12000) val = "Do Not Disturb";
    else if (value < 18000) val = "Away From Desk";
    else val = "Offline";

    return val;
}

function clickNOC(uri)
{
    document.getElementById("divPopupBackground").style.display = "block";  
    selectedUri = uri;
    startImConversation(uri);   
}

function setContactPresence(xml)
{
    try
    {        
    var uri = xml.getElementsByTagName("uri")[0].text;
    var name = xml.getElementsByTagName("name")[0].text;
    var availability = xml.getElementsByTagName("availability")[0].text;
    var imgSrc = GetImageSrc(availability);
    var title = xml.getElementsByTagName("title")[0].text;
    var email = xml.getElementsByTagName("email")[0].text;        
    var office = xml.getElementsByTagName("office")[0].text;
    var company = xml.getElementsByTagName("company")[0].text;   
    
    //Firefox uses "firstChild.nodeValue"??
    /*var uri = xml.getElementsByTagName("uri")[0].firstChild.nodeValue;*/              
    
    //alert(name);
    name = name.replace("\'","");
                         
    if (uri == "") return;
    var tbl = document.getElementById("tblFriends");
    var rows = tbl.getElementsByTagName("tr");
    var row;
    for (var i = 0; i < rows.length; i++)
    {
        var attr = rows[i].attributes["uri"].value.toLowerCase();
        
        if (attr == uri) 
            row = rows[i];
    }
    if (row != null)
    {
        var img = row.getElementsByTagName("img")[0];
        updatePresence(availability, img);
        
        row.setAttribute("availability", availability); 
        
        //Update the cell that contains the availablity.
        var cellDetail = row.getElementsByTagName("td")[2];
        cellDetail.innerHTML = GetAvailabilityText(availability);                    
    }
    else
    {                  
        if (name == "") return;
        
        
        var tbody = tbl.getElementsByTagName("tbody")[0];
        row = document.createElement("tr");
                
        //Insert the row (only this works for IE7, IE8, FireFox and Opera).      
        var lastRow = tbl.rows.length;
        row = tbl.insertRow(lastRow);                
        
        var cell = document.createElement("td");
        var img = document.createElement("img");
        var text = "";
        
        text = document.createTextNode("  " + name + "  ");
        
        //Save the extra contact details as attributes.
        row.className = "divPersonalSupportContactsRow";
        row.setAttribute("uri", uri.toLowerCase());
        row.setAttribute("availability", availability);
        row.setAttribute("name", name);
        row.setAttribute("title", title);
        row.setAttribute("office", office);
        row.setAttribute("email", email);
        
        //Table Click, Onmouseover, Onmouseout
        //row.onclick = new Function("startImConversation('" + uri + "');"); 
              
        row.onmouseover = function()
        {
            //Highlight row
            this.bgColor='#dddddd';
        }; 
         
        row.onmouseout = function()
        {
            //Highlight row
            this.bgColor='#FFFFFF';
        };                                                      
        
        row.onclick = function()
        {
            //OpenUserDetailDiv(name,title,availability,imgSrc,office,company,email,uri);
            document.getElementById("divPopupBackground").style.display = "block";  
            selectedUri = uri;
            startImConversation(uri);
        };
        
        cell.className = "divPersonalSupportContactsCell";
        cell.appendChild(img);
        cell.appendChild(text);
        
        //Add a cell that contains the title.
        var cellTitle = document.createElement("td");
        cellTitle.className = "divPersonalSupportContactsCellDetail";
        cellTitle.appendChild(document.createTextNode(title));
        
        //Add a cell that contains the availablity.
        var cellDetail = document.createElement("td");        
        //cellDetail.className = "divPersonalSupportContactsCellDetail";
        cellDetail.width = "70px";
        cellDetail.appendChild(document.createTextNode(GetAvailabilityText(availability)));
        
        row.appendChild(cell);
        row.appendChild(cellTitle);
        row.appendChild(cellDetail);
               
        updatePresence(availability, img);
        
        document.getElementById("divLoading").style.display = "none";
        document.getElementById("scrlFriends").style.display = "block";         
        document.getElementById("scrlFriendsBackground").style.display = "block";  
    }
    }
    catch(e)
    {
    }
    
}

//Clear the contacts table.
function clearContactTable()
{
    var table = document.getElementById("tblFriends"); 
    var rows = table.rows; 

    while(rows.length) // Stop when length is 0
    {
        table.deleteRow(rows.length-1); 
    }                                
}

function OpenUserDetailDiv(selectedContactName, selectedContactTitle, selectedContactAvailibility, selectedContactImgSrc, selectedContactOffice, selectedContactCompany, selectedContactEmail, selectedContactUri)
{     
    //Populate the user detail popupscreen.
    document.getElementById("lblUserDetailHeading").innerHTML = selectedContactName;
    document.getElementById("lblUserDetailTitle").innerHTML = selectedContactTitle;
    document.getElementById("lblUserDetailEmail").innerHTML = selectedContactEmail;
    document.getElementById("lblUserDetailCompany").innerHTML = selectedContactCompany;
    document.getElementById("lblUserDetailOffice").innerHTML = selectedContactOffice;
    document.getElementById("lblUserDetailUri").innerHTML = selectedContactUri;
    //document.getElementById("imUserDetailPresence").src = selectedContactImgSrc;   
    document.getElementById("linkSendEmail").href = "mailto:" + selectedContactEmail;        
    
    //Make the user detail popup screen visible
    document.getElementById("divUserDetail").style.display = "block";
    document.getElementById("divPopupBackground").style.display = "block";   
}

function displayAvailibility(text)
{
    document.getElementById("lblAvailibility").innerHTML = text; 
}

function isEnterKey(e)
{
    var keynum
    if(window.event) //IE
        keynum = e.keyCode;
    else  // other
        keynum = e.which;
   
    if (keynum == 13) return true;
    else return false;
}

function startImConversation(uri)
{
    setCursor("progress");
    var data = "<uri>" + uri + "</uri>";
    doCallBack(handleStartImConversation, "startImConversation", data);
}

function handleStartImConversation(request)
{
    if (!checkRequest(request)) return;
    setCursor("default");
    
    //Load the XML string into a XML document.
    var xmlDoc = loadXmlDoc(request.responseText);
    
    var msg = xmlDoc.getElementsByTagName("message")[0].childNodes[0].nodeValue;  
    //showMessage(msg);
}

function createChatWindow(confId)
{

    var uri = selectedUri;
    if (uri == "") return;
    var tbl = document.getElementById("tblFriends");
    var rows = tbl.getElementsByTagName("tr");
    var row;
    
    var availability;
    var name; 
    var title; 
    var office;
    var email;
    
    for (var i = 0; i < rows.length; i++)
    {
        var attr = rows[i].attributes["uri"].value.toLowerCase();
        
        if (attr.toString().toLowerCase() == uri.toString().toLowerCase()) 
            row = rows[i];
    }
    if (row != null)
    {        
        availability = row.attributes["availability"].value;
        name = row.attributes["name"].value; 
        titles = row.attributes["title"].value; 
        office = row.attributes["office"].value;                 
        email = row.attributes["email"].value;
        //document.getElementById("imUserDetailPresence").src = GetImageSrc(availability);
    }
       
    var window = document.createElement("div");
    window.setAttribute("confId", confId);
    window.className = "imPanel";
    document.getElementsByTagName("body")[0].appendChild(window);
    
    var title = document.createElement("div");
    title.className = "imPanelTitle";    
    window.appendChild(title);
    
    //A blank space to help position the rest of the layout.
    var space = document.createElement("div");
    space.className = "imSpace";                   
    window.appendChild(space);
    
    //The contact details header
    var contact = document.createElement("div");
    contact.className = "imContactDetails";
        
    var img = document.createElement("img");
        img.setAttribute('src', GetImageSrc(4000));
        img.setAttribute('alt', '');
        img.className = "padding";
    contact.appendChild(img);
        
    var b = document.createElement("b");
        b.appendChild(document.createTextNode("  Agile Support Portal"));            
    contact.appendChild(b);
    
    contact.appendChild(document.createElement("br"));
    
    var img = document.createElement("img");
        img.setAttribute('src', GetImageSrc(availability));
        img.setAttribute('alt', '');
        img.className = "padding";
    contact.appendChild(img);
        
    b = document.createTextNode("  " + name);            
    contact.appendChild(b);
       
    contact.appendChild(document.createElement("br")); 
    
    window.appendChild(contact);
    //--------------------------
    
    //Conversation history
    var content = document.createElement("div");
    content.className = "imPanelContent";
    window.appendChild(content);
    //--------------------------
    
    //A blank space to help position the rest of the layout.
    var space = document.createElement("div");
    space.className = "imSpace";                   
    window.appendChild(space);
    
    //Input text area
    //var input = document.createElement("input");
    var input = document.createElement("textarea");
    input.className = "imPanelInput";
    input.rows = 7;
    input.cols = 30;

    input.onkeypress = function() {
        if (isEnterKey(event)) {
            SendMessage(confId, this.value.replace(/[\n\r\t]/g, '') );

            this.value = "";       
        }
    };
    window.appendChild(input);
    //------------------------
        
    var header = document.createElement("div");
    header.className = "imPanelHeader";
    
    header.appendChild(document.createTextNode(name + " - Conversation"));
    title.appendChild(header);
       
    var close = document.createElement("div");
    close.className = "imPanelButton imClose";
    close.onclick = function() {
        endConference(confId);
        document.getElementsByTagName("body")[0].removeChild(window);
        document.getElementById("divPopupBackground").style.display = "none"; //Remove the popup background div.        
    };
    close.appendChild(document.createTextNode("X"));
    title.appendChild(close);
    
    chatWindows[chatCount] = window;
    chatCount += 1;

    document.getElementsByTagName("textarea")[0].focus();

}

function endConference(confId)
{
    // Find chat window
    var window;
    var index;
    for (var i = 0; i < chatCount; i++)
    {
        if (chatWindows[i].attributes["confId"].value = confId)
        {
            window = chatWindows[i];
            index = i;
        }
    }
    if (!window) return;
    if (chatWindows.length == 1) chatWindows = [];
    else chatWindows.slice(i, i+1);
    chatCount += -1;
        
    doCallBack(handleEndConference, "terminateIm", confId);
}

function handleEndConference(request)
{
    if (!checkRequest(request)) return;
    
    //Load the XML string into a XML document.
    var xmlDoc = loadXmlDoc(request.responseText);
    
    var msg = xmlDoc.getElementsByTagName("message")[0].childNodes[0].nodeValue;  
    //showMessage(msg);
}

function addChatParticipant(confId, uri, name)
{
    var window = findChatWindow(confId);
    if (!window) return;
    
    window.setAttribute("uri", uri);
    var disp = name;
    if (disp == "")
    { 
        disp = uri;
        disp = disp.replace(/sip:/i, "");
        disp = disp.replace(/@litwareinc.com/i, "");
    }
    var header = getDivByClassName(window, "imPanelHeader");
    //header.firstChild.nodeValue = disp;
}

function findChatWindow(confId)
{
    for (var i = 0; i < chatCount; i++)
    {
        if (chatWindows[i].attributes["confId"].value = confId)
        {
            return chatWindows[i];
        }
    }
}

function getDivByClassName(window, className)
{
    var divs = window.getElementsByTagName("div");
    for (var i = 0; i < divs.length; i++)
    {
        if (divs[i].className == className)
            return divs[i];
    }
    return null;
}

function updateConversation(isSelf, confId, message, uri)
{
    //Find the selected conatcts' name
    var uri = selectedUri;
    if (uri == "") return;
    var tbl = document.getElementById("tblFriends");
    var rows = tbl.getElementsByTagName("tr");
    var row;    
    var contactName; 
    for (var i = 0; i < rows.length; i++)
    {
        var attr = rows[i].attributes["uri"].value.toLowerCase();
        
        if (attr.toString().toLowerCase() == uri.toString().toLowerCase()) 
            row = rows[i];
    }
    if (row != null)
    {        
        contactName = row.attributes["name"].value; 
    }
    //---------------------------------------------
    
    var window = findChatWindow(confId);
    if (!window) 
    {
        //We do not want to reopen a conversation if the web user closed that window; he might be speaking with someone else now.
        //createChatWindow(confId); 
        //addChatParticipant(confId, uri, "");
        //updateConversation(self, confId, message);
        return;
    }
    
    var name = "me";
    if (!isSelf) name = contactName;
    
    var content = getDivByClassName(window, "imPanelContent");
    var b = document.createElement("b");
    b.appendChild(document.createTextNode(name + ": "));
    b.className = "padding";
    content.appendChild(b);
    content.appendChild(document.createTextNode(message));
    content.appendChild(document.createElement("br"));     
}

/*function SendMessage(confId, message)
{
    var window = findChatWindow(confId);
    if (!window) return;
    
    //var name = document.getElementById("txtContactName").value;
    //name = name + " (" + document.getElementById("txtCompanyName").value + "): ";
    
    var name = document.getElementById('<%=txtContactName.ClientID%>').value;
    name = name + " (" + document.getElementById('<%=txtCompanyName.ClientID%>').value + "): ";       
        
    updateConversation(true, confId, message);
    
    var data = "<confId>" + confId + "</confId>";
    data += "<message>" + name + message + "</message>";
    setCursor("progress");
    doCallBack(handleSendMessage, "sendMessage", data);
}*/

function handleSendMessage(request)
{
    if (!checkRequest(request)) return;
    setCursor("default");
    
    //Load the XML string into a XML document.
    var xmlDoc = loadXmlDoc(request.responseText);
    
    var msg = xmlDoc.getElementsByTagName("message")[0].childNodes[0].nodeValue;  
    //showMessage(msg);
}

function window_onBeforeUnload()
{
    doCallBack(emptyCallBackHandler, "terminateSession", "");
}

function emptyCallBackHandler()
{
    // does nothing
}

/*function addContact(e)
{
    if (isEnterKey(e))    
    {
        setCursor("progress");
        doCallBack(handleAddContact, "addContact", document.getElementById("txtContact").value);  
    }      
}*/

/*function userPresence_click(e)
{
    if (menu == null) menu = document.getElementById("presenceMenu");
    if (presenceMenuOpen == true)
    {
        menu.style.display = "none";
        presenceMenuOpen = false;
    }
    else
    {
        menu.style.display = "block";
        presenceMenuOpen = true;
    }
}*/

/*function updateUserPresence(value)
{
    setCursor("progress");
    presenceMenuOpen = false;
    document.getElementById("presenceMenu").style.display="none";
    var img = document.getElementById("presenceIcon");  
    updatePresence(value, img);
    doCallBack(handleUserPresence, "updateUserPresence", value);
}*/

/*function showMessage(message)
{
    var readOut = document.getElementById("tblReadOut"); 
    var row = readOut.insertRow(0);
    var cell = document.createElement("td");
    cell.appendChild(document.createTextNode(message));
    if (coloredLine == true)
    {
        cell.className = "coloredLine";
    }
    coloredLine = !coloredLine;
    row.appendChild(cell);
}*/

/*function handleAddContact(request)
{
    if (!checkRequest(request)) return;
    setCursor("default");
    
    var xml = new ActiveXObject("Microsoft.XMLDOM");
    xml.async = "false";
    xml.loadXML(request.responseText);
       
    var msg = xml.documentElement.selectSingleNode("message").text;
    
    //showMessage(msg);
}*/

