// Implements One Step Click To Talk Button
// see sample user of this code in http://<server>/hcp/voice/CALL3/sampleOneStepClickToTalk.html

var LP_PHONE_NUMBER_COOKIE = "LPPhoneNumber"; 
var LP_PHONE_NUMBER_COOKIE_SPERATOR = "^";
var LP_CLICK_TO_TALK_FORM = "lpClickToTalk";
var LP_PHONE_NUMBER_FIELD = "lpcttPhoneNumber";
var LP_SKILL_FIELD = "lpcttSkill";
var LP_EXTENSION_FIELD = "lpcttExtension";
var LP_INVALID_PHONE_NUMBER_MSG = "Invalid phone number";

if (typeof(lpServerName) == "undefined")
	lpServerName = "server.iad.liveperson.net";

if (typeof(lpMinPhoneNumberLength) == "undefined")
	lpMinPhoneNumberLength = 5;

if (typeof(lpMaxPhoneNumberLength) == "undefined")
	lpMaxPhoneNumberLength = 10;

// Display the queue status in lpcttApproximatedTimeInQueue and lpcttApproximatedPlaceInQueue
// fields, if lpcttDisplayQueueStatus variable is not true nothing will be done.
// this methos is used by /hcp/html/lpCheckVisitorQueueStats.js script
// and must being loaded before it.
function visitorQueueStatsNotifyFunction(avgWait, estimatedPlaceInQueue, status)
{
	if (status != LP_SERVICE_UP	||
		typeof(lpcttDisplayQueueStatus)	== "undefined" || !lpcttDisplayQueueStatus)
	{
		return;
	}

	var	waitMsg	= "";
	var	placeInQueueMsg	= "";
	var	hrs	= Math.floor(avgWait / 3600);
	var	mnts = Math.floor(avgWait /	60);
	if (hrs	> 0) {
		waitMsg	= hrs +	(hrs > 1 ? " Hours"	: "	Hour");
		avgWait	= avgWait -	(hrs * 3600);
	}
	if (mnts > 0) {
		waitMsg	= waitMsg +	(hrs > 0 ? " and " : "") + mnts	+ (mnts	> 1	? "	Minutes" : " Minute");
		avgWait	= avgWait -	(mnts *	60);
	}
	if (hrs	== 0 &&	avgWait	> 0) {
		waitMsg	= waitMsg +	(mnts >	0 ?	" and "	: "") +	avgWait	+ (avgWait > 1 ? " Seconds"	: "	Second");
	}

	var queueLengthMsg = estimatedPlaceInQueue - 1;
	if (queueLengthMsg == 0)
		queueLengthMsg = 'no';

	var approximatedTimeInQueue = document.getElementById("lpcttApproximatedTimeInQueue");
	if (approximatedTimeInQueue != undefined)
		approximatedTimeInQueue.innerHTML = waitMsg;
	var approximatedPlaceInQueue = document.getElementById("lpcttApproximatedPlaceInQueue");
	if (approximatedPlaceInQueue != undefined)
		approximatedPlaceInQueue.innerHTML = queueLengthMsg;
}

function lpGetCookie(c_name)
{
	if (document.cookie.length > 0)
	{
		c_start=document.cookie.indexOf(c_name + "=")
		if (c_start!=-1)
		{
			c_start=c_start + c_name.length+1
			c_end=document.cookie.indexOf(";",c_start)
			if (c_end==-1) c_end=document.cookie.length
				return unescape(document.cookie.substring(c_start,c_end))
		}
	}
	return null
}

function lpSetCookie(c_name, value, expiredays)
{
	var exdate=new Date()
	exdate.setDate(exdate.getDate()+expiredays)
	var cookieValue = c_name + "=" +escape(value);
	if (expiredays != null)
		cookieValue += ';expires=' + exdate.toGMTString();
	document.cookie = cookieValue;
}

// When lpcttPrePopulatePhone variable is true, the phone number is loaded from cookie
function lpLoadPhoneNumberFromCookie()
{
	if (typeof(lpcttPrePopulatePhone) != "undefined" && lpcttPrePopulatePhone)
    {
        var form = document.forms[LP_CLICK_TO_TALK_FORM];
        var cookieValue = lpGetCookie(LP_PHONE_NUMBER_COOKIE);
        if (cookieValue != null)
        {
            var cookieValues = cookieValue.split(LP_PHONE_NUMBER_COOKIE_SPERATOR);
            var fieldsCount = 0;
            if (form[LP_PHONE_NUMBER_FIELD] != null)
                fieldsCount++;
            else
            {
                for (i = 1; i <= lpMaxPhoneNumberLength && form[LP_PHONE_NUMBER_FIELD + i] != null ; i++)
                    fieldsCount++;
            }
            if (form[LP_EXTENSION_FIELD] != null)
                fieldsCount++;

            if (fieldsCount != cookieValues.length)
                return; // the number of phone fields has changed

            var phoneNumberField = form[LP_PHONE_NUMBER_FIELD];
            if (phoneNumberField != null)
                phoneNumberField.value = cookieValues[0];
            else
            {
                for(i = 1; i <= fieldsCount; i++)
                {
                    var phoneNumberField = form[LP_PHONE_NUMBER_FIELD + i];
                    if (phoneNumberField != null)
                        phoneNumberField.value = cookieValues[i-1];
                }
            }

            var extensionField = form[LP_EXTENSION_FIELD];
            if (extensionField != null)
                 extensionField.value = cookieValues[cookieValues.length - 1];
        }
    }
}

// LP_SKILL_FIELD select control is filled by option from lpcttSkillsList array values
// (only when LP_SKILL_FIELD exists and lpcttSkillsList is defined)
function lpFillSkillSelectControl()
{
	var	form = document.forms[LP_CLICK_TO_TALK_FORM];
	var	selectControl =	form[LP_SKILL_FIELD];

	if (selectControl != undefined)
	{
		if (typeof(lpcttSkillsList) != "undefined" && lpcttSkillsList.length >= 2)
		{
			var selectedSkill = null;
			if (typeof(lpcttDefaultSkill) != "undefined")
            {
                selectedSkill = lpcttDefaultSkill;
                lpcvqsSkill = lpcttDefaultSkill;
            }
            else
                lpcvqsSkill = lpcttSkillsList[0];

            for(i=0; i < lpcttSkillsList.length; i+=2)
			{
				var option = new Option(lpcttSkillsList[i+1], lpcttSkillsList[i]);
				selectControl.options.add(option);
				if (selectedSkill == lpcttSkillsList[i])
                    option.selected = true;
            }
        }
		else
		{
			selectControl.style.display = "none";
		}
	}
}

function lpSetNextFocus(phoneNumberFieldObj)
{
    if (phoneNumberFieldObj.value.length == phoneNumberFieldObj.maxLength)
    {
        var fieldName = phoneNumberFieldObj.name;
        var fieldNameSuffix = fieldName.substr(fieldName.length-1);
        var nextFieldNameSuffix = parseInt(fieldNameSuffix) + 1;
        var nextFieldName = fieldName.substr(0, fieldName.length-1) + nextFieldNameSuffix
        var nextField = phoneNumberFieldObj.form.elements[nextFieldName];

        if (nextField != null)
        {
            nextField.focus();
            nextField.select();
        }
    }
}

// get and validate phone number using the following rules:
// Do not send a request when phone number has less than lpMinPhoneNumberLength digits
// (default=5); show an error message.
// Remove all spaces, ) (, dashes and dots.
// Remove dial prefixes: 0, 00, 011.
function lpGetPhoneNumber()
{
	var form = document.forms[LP_CLICK_TO_TALK_FORM];
    var phoneNumber = "";
    var alertString = null;

    var phoneNumberField = form[LP_PHONE_NUMBER_FIELD];
    if (phoneNumberField != null)
        phoneNumber += phoneNumberField.value;
    else
    {
        for (i = 1; i <= lpMaxPhoneNumberLength; i++)
        {
            var phoneNumberField = form[LP_PHONE_NUMBER_FIELD+i];
            if (phoneNumberField != null) {
                if (phoneNumberField.value == "")
                    alertString = LP_INVALID_PHONE_NUMBER_MSG;
                phoneNumber += phoneNumberField.value;
            } else
                break;
        }
    }

    // remove "().-" chars from the string
	phoneNumber = phoneNumber.replace(/[ \(\)\.\-]/g, "");

	if (phoneNumber.substring(0,3) == "011")
	{
		phoneNumber = phoneNumber.substring(3, phoneNumber.length);
	}
	else if (phoneNumber.substring(0,2) == "00")
	{
		phoneNumber = phoneNumber.substring(2, phoneNumber.length);
	}
	else if (phoneNumber.substring(0,1) == "0")
	{
		phoneNumber = phoneNumber.substring(1, phoneNumber.length);
	}

    var phoneNumberLength = phoneNumber.length;
    if (typeof(lpcttPrefix) != "undefined" && phoneNumber.indexOf(lpcttPrefix) == 0)
           phoneNumberLength -= lpcttPrefix.length;

	if (phoneNumberLength < lpMinPhoneNumberLength || phoneNumberLength > lpMaxPhoneNumberLength ||
        phoneNumber.match(/^\d+$/) == null)
	{
	 	 alertString = LP_INVALID_PHONE_NUMBER_MSG;
	}

	if (alertString != null) {
		alert(alertString);
		return null;
	}

	return phoneNumber;
}

// get the skill from skill control or lpcttDefaultSkill variable.
function lpGetSelectedSkill()
{
	var	form = document.forms[LP_CLICK_TO_TALK_FORM];
	var	skill =	form[LP_SKILL_FIELD];
	var resultSkill = null;

	if (skill != undefined && skill.value != "")
		resultSkill = skill.value;
	else if (typeof(lpcttDefaultSkill) != "undefined")
		resultSkill = lpcttDefaultSkill;

	return resultSkill;
}

// set lpSkill variable according to skill selection control
function onSkillChange()
{
	var skill = lpGetSelectedSkill();
	if (skill != null)
		lpcvqsSkill = skill;
}

function lpOpenCallbackFormFunctionDefault(url, name, specs)
{
	window.open(url, name, specs);
}

function lpOpenWindow(parameters)
{
	if (typeof(lpcttProtocol) == "undefined")
		lpcttProtocol = "http";

	var url = lpcttProtocol +'://'+ lpServerName +'/hc/'+ lpNumber	+'/?' + parameters +'&site='+ lpNumber +
			  lpGetSkillParameter() + '&referrer=' + escape(document.location) + lpGetOffineUrlParameter();

	var windowName = 'call' + lpNumber;
	var specs = 'width=472,height=320';

	if (typeof(lpOpenCallbackFormFunction) != "undefined")
		lpOpenCallbackFormFunction(url, windowName, specs);
	else
		lpOpenCallbackFormFunctionDefault(url, windowName, specs);
}

// Called when click to talk button is called
function onOneStepClickToTalk()
{
	var	phoneNumber	= lpGetPhoneNumber();
	if (phoneNumber == null)
		return false;

    lpSetPhoneNumberCookies();
    phoneNumber = lpAddPrefixToPhoneNumber(phoneNumber);

	var parameters = 'cmd=callback&callbackcmd=callback&isOneStep=true&phoneNumber=' + phoneNumber +
                     lpGetExtensionParameter();
	lpOpenWindow(parameters);
	return false;
}

function lpInvokeLpdbButtonAction(cmd, suffix)
{
	lpdbRedirectActionUrlCmd = cmd;
	lpdbRedirectActionURLSuffix = suffix + lpGetSkillParameter();
	if (typeof(lpdbButtonAction) != "undefined")
		lpdbButtonAction();
}

function lpSetPhoneNumberCookies()
{
    if (typeof(lpcttPrePopulatePhone) != "undefined" && lpcttPrePopulatePhone)
    {
        var cookieValue = "";
        var	form = document.forms[LP_CLICK_TO_TALK_FORM];

        var phoneNumberField = form[LP_PHONE_NUMBER_FIELD];
        if (phoneNumberField != null)
            cookieValue += phoneNumberField.value;
        else
        {
            for (i = 1; i <= lpMaxPhoneNumberLength; i++)
            {
                var phoneNumberField = form[LP_PHONE_NUMBER_FIELD+i];
                if (phoneNumberField != null)
                {
                    if (i > 1)
                        cookieValue += LP_PHONE_NUMBER_COOKIE_SPERATOR
                    cookieValue += phoneNumberField.value;
                }
                else
                    break;
            }
        }

        var extensionField = form[LP_EXTENSION_FIELD];
        if (extensionField != null)
            cookieValue += LP_PHONE_NUMBER_COOKIE_SPERATOR + extensionField.value;

        lpSetCookie(LP_PHONE_NUMBER_COOKIE, cookieValue, 365)
    }
}

function lpAddPrefixToPhoneNumber(phoneNumber)
{
	return (typeof(lpcttPrefix) != "undefined" && phoneNumber.indexOf(lpcttPrefix) != 0 ? lpcttPrefix : "") + phoneNumber;
}

function lpGetExtensionParameter()
{
    var	form = document.forms[LP_CLICK_TO_TALK_FORM];
    var extension = form[LP_EXTENSION_FIELD];

    var result = "";
    if (extension != undefined && extension.value != "")
        result = "&SESSIONVAR!Extension=" + extension.value;
   return result;
}

function lpGetOffineUrlParameter()
{
    var result = "";
    if (typeof(lpcttOfflineUrl) != "undefined")
    {
        var concatSign = lpcttOfflineUrl.indexOf("?") >= 0 ? "&" : "?";
        result = "&offlineURL=" + escape(lpcttOfflineUrl + concatSign + "site=" + lpNumber + lpGetSkillParameter());
    }
    return result;
}

function lpGetSkillParameter()
{
    var skill = lpGetSelectedSkill();
    return (skill != null) ? "&skill=" + skill : "";
}

// the onclick method of the one step dynamic button
function onOneStepDbClickToTalk()
{
	var	phoneNumber	= lpGetPhoneNumber();
	if (phoneNumber == null)
		return false;

	lpSetPhoneNumberCookies();
	phoneNumber = lpAddPrefixToPhoneNumber(phoneNumber);

	lpInvokeLpdbButtonAction('cmd=callback&callbackcmd=callback',
                             '&isOneStep=true&phoneNumber=' + phoneNumber + lpGetExtensionParameter());
}

// this method overrides the same method in DynamicButtonScript3.js script.
function lpdbGenerateChatWindowURL(buttonState) {
	var referrerString = "&referrer=(button%20dynamic-button:"+escape(lpdbButtonName)+"("+escape(lpdbButtonContext)+"))%20"+lpdbVoiceLimitString(escape(document.location),200);
	var forceOfflineString = (buttonState != lpdbButtonStateAvailable) ? ("&forceOffline=true&SESSIONVAR!OfflineTrigger="+buttonState+"Click") : "";

    var tmp_url = '';
    if (typeof(lpParseLocalVisitorID)=='function')  tmp_url = tmp_url + '&visitor=' + lpParseLocalVisitorID();
    if (typeof(lpParseLocalSessionKey)=='function')  tmp_url = tmp_url + '&msessionkey=' + lpParseLocalSessionKey();
	var cmd = null;
	if (typeof(lpdbActionType) == "undefined" || lpdbActionType == "voice")
	{
		if (typeof(lpdbRedirectActionUrlCmd) != "undefined" && lpdbRedirectActionUrlCmd != null)
        {
			cmd = lpdbRedirectActionUrlCmd;
            lpdbRedirectActionUrlCmd = null;
        }
        else
			cmd = "cmd=file&file=visitorWantsToTalk";
	}
	else
	{
		cmd = "cmd=file&file=visitorWantsToChat";
	}

	var url =
		lpChatProtocol + "://" + lpServerName + "/hc/" + lpNumber + "/?" + cmd + "&site=" +
	 	lpNumber + ((typeof(lpOfflineURL) != "undefined") ? "&offlineURL=" + escape(lpChatProtocol + "://" + lpOfflineURL) : "") +
	 	forceOfflineString +
	 	"&SESSIONVAR!chat-button-name="+escape(lpdbButtonName) +
	 	"&SESSIONVAR!chat-button-room="+escape(lpdbButtonRoom) +
	 	lpdbRedirectActionURLSuffix +
	 	referrerString + tmp_url;
	return url;
}

// The onclick method of two steps click to talk static button
function onTwoStepsClickToTalk()
{
	var parameters = '&cmd=file&file=visitorWantsToTalk';
	lpOpenWindow(parameters);
	return false;
}

// The onclick method of the two steps dynamic button
function onTwoStepsDbClickToTalk()
{
	lpInvokeLpdbButtonAction('cmd=file&file=visitorWantsToTalk', '')
}

function lpdbVoiceLimitString(str, maxsize) {
    if (str.length > maxsize) return str.substring(0,maxsize);
    else return str;
}
// Init skill and phone number fields.
lpLoadPhoneNumberFromCookie();
lpFillSkillSelectControl();
