var proxyURL = "server/proxy.php";

var thirdPartyCallMD5 = {

    handleSuccess:function(o)
    {
        //alert("success: "+o.responseText);
        if(o.responseText == "")
            return;
        var response = YAHOO.lang.JSON.parse(o.responseText);
        if(response.CallID != null){
            this.CallID = response.CallID;

            if ( response.StatusCode < 300 && this.ActionID == response.ActionID )
                this.queryState();

            if ( response.StatusCode != 101 )
                this.onMessage(response);
        }
    },

    handleFailure:function(o){
        //alert("thirdPartyCall.handleFailure: " + o.statusText);
    },

    placeCall:function(SubscriberID, ContactID, VisitorContact, Language, Referral, VisitorID, VisitorCookie, MD5Hash, Timestamp, Referer, onMessage) {
        var jReq = new Object();
        jReq.Command = "place_external_call";
        jReq.SubscriberID = SubscriberID;
        jReq.ContactID = new Number(ContactID);
        jReq.VisitorContact = VisitorContact;
        jReq.Language = Language;
        jReq.Referral = Referral;
        jReq.Referer = Referer;
        jReq.VisitorID = VisitorID;
        jReq.VisitorCookie = VisitorCookie;
        jReq.ActionID = Math.random().toString();
        jReq.MD5 = MD5Hash;
        jReq.Timestamp = Timestamp;
            
        this.onMessage = onMessage;
        this.ActionID = jReq.ActionID;
        this.MD5Hash = jReq.MD5;
        this.Timestamp = jReq.Timestamp;
        this.SubscriberID = SubscriberID;
        this.ContactID = new Number(ContactID);
        
//        var srequest = YAHOO.lang.JSON.stringify(jReq);
	var srequest = escape(YAHOO.lang.JSON.stringify(jReq)); // Faccio l'escape (URL encode) 
                
        YAHOO.util.Connect.setDefaultPostHeader( false );
        YAHOO.util.Connect.initHeader("Content-Type", "application/json", true);
        YAHOO.util.Connect.initHeader("Accept", "application/json", true);

        var url = remoteURL + 'ThirdPartyCall';
        this.request = YAHOO.util.Connect.asyncRequest('POST', proxyURL + '?url=' + url + '&data=' +srequest, tpcMD5Callback, srequest);
        return this.ActionID;
    },
    
    queryState: function() {
        var jReq = new Object();
        jReq.CallID = this.CallID;
        jReq.Command = "external_query_state";
        var ActionID = Math.random().toString();
        jReq.ActionID = ActionID;
        jReq.MD5 = this.MD5Hash;
        
        jReq.Timestamp = this.Timestamp;
        jReq.SubscriberID = this.SubscriberID;
        jReq.ContactID = this.ContactID;        
        this.ActionID = jReq.ActionID;


        var srequest = YAHOO.lang.JSON.stringify(jReq);
        //var responseDiv = document.getElementById('requesttext');
        //responseDiv.innerHTML = srequest;
        
        YAHOO.util.Connect.setDefaultPostHeader( false );
        YAHOO.util.Connect.initHeader("Content-Type", "application/json", true);
        YAHOO.util.Connect.initHeader("Accept", "application/json", true);
        var url = remoteURL + 'ThirdPartyCall';
        this.request = YAHOO.util.Connect.asyncRequest('POST', proxyURL + '?url=' + url + '&data=' +srequest, tpcMD5Callback, srequest);
        return ActionID;
    },
    
     closeCall: function(){
        var jReq = new Object();
        jReq.Command = "close_external_call";
        jReq.CallID = this.CallID;
        var ActionID = Math.random().toString();
        jReq.ActionID = ActionID;
        jReq.MD5 = this.MD5Hash;
        jReq.Timestamp = this.Timestamp;
        jReq.SubscriberID = this.SubscriberID;
        jReq.ContactID = this.ContactID;
        
        var srequest = YAHOO.lang.JSON.stringify(jReq);
        //var responseDiv = document.getElementById('requesttext');
        //responseDiv.innerHTML = srequest;
            
        YAHOO.util.Connect.setDefaultPostHeader( false );
        YAHOO.util.Connect.initHeader("Content-Type", "application/json", true);
        YAHOO.util.Connect.initHeader("Accept", "application/json", true);
        var url = remoteURL + 'ThirdPartyCall';
        this.request = YAHOO.util.Connect.asyncRequest('POST', proxyURL + '?url=' + url + '&data=' +srequest, tpcMD5Callback, srequest);
        return ActionID;
    },

     saveWebStats: function(SubscriberID, ContactID, Language, Referral, VisitorID, VisitorCookie, MD5Hash, Timestamp, Referer){
        var jReq = new Object();
        jReq.Command = "save_external_web_stats";
        //jReq.CallID = this.CallID;
        var ActionID = Math.random().toString();
        jReq.ActionID = ActionID;
        jReq.MD5 = MD5Hash;
        jReq.Timestamp = Timestamp;
        jReq.SubscriberID = SubscriberID;
        jReq.ContactID = new Number(ContactID);
        jReq.Referral = Referral;
        jReq.Referer = Referer;
        jReq.VisitorCookie = VisitorCookie;
        jReq.VisitorID = VisitorID;
        jReq.Language = Language;

        var srequest = YAHOO.lang.JSON.stringify(jReq);
        //var responseDiv = document.getElementById('requesttext');
        //responseDiv.innerHTML = srequest;

        YAHOO.util.Connect.setDefaultPostHeader( false );
        YAHOO.util.Connect.initHeader("Content-Type", "application/json", true);
        YAHOO.util.Connect.initHeader("Accept", "application/json", true);
        var url = remoteURL + 'ThirdPartyCall';
        this.request = YAHOO.util.Connect.asyncRequest('POST', proxyURL + '?url=' + url + '&data=' +srequest, tpcMD5Callback, srequest);
        return ActionID;
    }

};

var tpcMD5Callback =
{
    success: thirdPartyCallMD5.handleSuccess,
    failure: thirdPartyCallMD5.handleFailure,
    scope: thirdPartyCallMD5
};

function onCallState(message) {
    var smessage = YAHOO.lang.JSON.stringify(message);
    var callbutton = document.getElementById("callbutton");
    
    var ds;
    if(visitorContact == null)
        ds = document.getElementById("ds");
    else ds = null; // caso LCS
    
    var nu = document.getElementById('numberac');
    if ( message.StatusCode < 300 ) {
        //callbutton.value = closeTranslation;
        statecall = closeTranslation;
        callbutton.className = "close";
        if(ds!= null)
            ds.disabled = true;
        nu.disabled = true;
        
    } else {
        //callbutton.value = callTranslation;
        statecall = callTranslation;
        callbutton.className = "call";
        if(ds!= null)
            ds.disabled = false;
        if(visitorContact == null)
            nu.disabled = false;
    }
    var callstatetext = document.getElementById('callstatetext');
    var prefix;
    
    if(visitorContact == null){
        prefix = document.getElementById("ds").value;
        var country = document.getElementById("ds").text;
    
        var number = document.getElementById("numberac").value;            
        if ( message.StatusCode < 300 )
            saveNumber(prefix, number, country);
    }
    else prefix = "";
    
    var msg = getStatusString(message);              
            
    if ( timerID != 0 )
        clearTimeout(timerID);
    timerID = setTimeout("clearState("+message.StatusCode.toString()+");", 10000);
    var isVisitorMessage = message.Source == 2 || message.Destination == 2;
    var isSubscriberMessage = message.Source == 1 || message.Destination == 1;
    var isVoiceMailMessage = message.Source == 3 || message.Destination == 3;
            
    if ( message.StatusCode == 444 ) {
        if(visitorContact == null){
            if ( document.getElementById("ds").value == "0039"  // solo per l'Italia
                && document.getElementById("numberac").value.indexOf("3") == 0 )
                msg = mobileTranslation;
        }
        else if ( document.getElementById("numberac").value.indexOf("00393") == 0 )
            msg = mobileTranslation;            
        if ( isWebCallEnabled )
            msg = msg + '<br />' + '<a href="'+webCallLink+'">' + tPCWebInstructionsTranslation + '</a>';
    }
                        
    callstatetext.innerHTML = msg;
            
    var stateImage = document.getElementById("stateimage");
    
    if ( message.StatusCode == 100 || message.StatusCode == 200 || message.StatusCode == 300)
        changeStateImage(call_autorizzata);
    else if ( message.StatusCode == 180 || message.StatusCode == 103 )
        changeStateImage(call_squillando);
    else changeStateImage(call_non_abilitata);

    if(message.StatusCode == 413)
        document.getElementById("numberac").value = yourNumberString;
    
    if ( (message.StatusCode == 444 || message.StatusCode == 413) && isWebCallEnabled ) // prefisso non abilitato: fa blincare il link alla webcall
    {
        var webcall = document.getElementById("webCallButton");
        //var arrow = document.getElementById("arrow");

        setTimeout('document.getElementById("webCallButton").style.visibility="hidden";', 10000);
        setTimeout('document.getElementById("webCallButton").style.visibility="visible";', 10200);
        setTimeout('document.getElementById("webCallButton").style.visibility="hidden";', 10400);
        setTimeout('document.getElementById("webCallButton").style.visibility="visible";', 10600);
        setTimeout('document.getElementById("webCallButton").style.visibility="hidden";', 10800);
        setTimeout('document.getElementById("webCallButton").style.visibility="visible";', 11000);
                
        /*arrow.style.visibility="visible";
                setTimeout('document.getElementById("arrow").style.visibility="hidden";', 10000);*/
    }
}

function getEndpointString(endpoint) 
{
    var endpoint = statusMap[endpoint.toString()];
    if ( typeof(status) == 'undefined' )
        return "";
    else
        return endpoint;
}

function getStatusString(message) 
{
    //alert(message.StatusCode);
    var code = message.StatusCode;
    var status;
    if ( code < 100 || code >= 800 )
        status = statusMap["XXX"];
    else {
        status = statusMap[code.toString()];
        if (typeof(status) == 'undefined') {            
            code = Math.round(code / 100 - 0.5);
            //alert(code);
            if ( code != message.StatusCode ) {
                message.StatusCode = code * 100;
                return getStatusString(message);
            }
            else
                status = statusMap["XXX"];                
        }
    }   
    status = status.replace("%s", getEndpointString(message.Source));
    return status.replace("%d", getEndpointString(message.Destination));
}

function cleanNumber(obj)
{
	var number = obj.value;

    number = number.replace(/[^\d\+]/g, ""); // tutto ciņ che non č numero e neanche "+" viene eliminato
    number = number.replace(/^\+/, "00");//il "+" iniziale viene trasformato in "00"
    number = number.replace(/[^\d]/g, "");// tutto ciņ che non č numero viene eliminato

    if(number.match(/^00/)){ //riconoscimento prefisso int ed eliminazione con riconoscimento combo
        
        var ds=document.getElementById("ds");
        var reg=new RegExp("^"+ds.value);
        if(number.match(reg))
            number=number.replace(reg,"");
        else{
            for(i=0;i<ds.options.length;i++)
            {
                reg=new RegExp("^"+ds.options[i].value);
                if(number.match(reg)){
                    number=number.replace(reg,"");
                    ds.value=ds.options[i].value;
                    break;
                }
            }
        }
    }

//se parte ancora con 00 si potrebbe avvisare (edit in rosso, alert (multilanguage))
//non far partire chiamata...

    obj.value=number;
}

function CheckKey(k){
  var numberac =  document.getElementById('numberac');
  if ( k == 27 && (visitorContact == null)){
      //server per rimuovere l'autocomplete
        document.getElementById('ds').focus();
        actb_display = 0;
        actb_display = false;
        numberac.focus();
  }

  numberac.focus();
  //var callbtn_disabled = numberac.value.length == null
  //    || numberac.value.length == 0 && (k == 8  || k == 32 || k ==13)
  //    || numberac.value.length == 1 && k == 8;
  //numberac.disabled = callbtn_disabled;
  //if ( k == 13 && !callbtn_disabled) {
  if ( k == 13 ) {
        if ( actb_display == false || actb_display == 0 ) {
            var callbutton = document.getElementById("callbutton");
            callbutton.focus();
            /*callbutton.click();
            var visitorContact = document.getElementById('ds').value + document.getElementById('numberac').value;
            thirdPartyCallMD5.placeCall(sid, cid, visitorContact, 'ita', Referral, VisitorID, visitorCookie, MD5Hash, ts, onCallState);*/
        }
  }
}

function checkEditBox(){
    var nu = document.getElementById('numberac');
    nu.focus();
    //alert("cookieNumber: " + cookieNumber);
    if(nu.value != null && (nu.value == yourNumberString || nu.value == editHereString || nu.value == incompleteNumber))
        nu.value = "";
}

function Append(text){
    var append = document.getElementById(debugArea).value;
    append = append + myString +"\n";	
}// end Append

//SetCookie("SitofonoVisitor", VisitorCookie, 360);

function changePrefixBox(){
    if(visitorContact != null)
        return;
    //alert("change prefix box");
    var ds = document.getElementById("ds");
    var nu = document.getElementById('numberac');
    var call_btn = document.getElementById('callbutton');
    var prefix = ds.value;
    if ( prefix == cookiePrefix )
        nu.value = cookieNumber;
    else
        nu.value = yourNumberString;//"";
    nu.disabled = ds.value == "-";
    call_btn.disabled = ds.value == "-";//|| nu.value == null || nu.value.length == 0;
    ds.focus();
    AutocompleteObj = actb(document.getElementById('numberac'), getNumbersForPrefix(prefix));
    if(!call_btn.disabled)
        call_btn.focus();
    //alert("[changePrefixBox] disabled: " + call_btn.disabled);
}

function initializeNumbers() {
    if (visitorContact != null)
       return; //caso di LCS
    
    var cn = ReadCookie("CookieNumbers");
    if ( cn != "" )
        cookieNumbers = YAHOO.lang.JSON.parse(cn);
    else
        cookieNumbers = new Array();
    var ds = document.getElementById("ds");
    var i = 0;

    if ( localCode != "" ){
            for ( i = 0; i < ds.options.length; ++i ) {
                if ( ds.options[i].text == localCode ) {
                    ds.options[i].selected = "1";
                    changePrefixBox();
                    return;
                }
            }              
    }
    
    if ( cookieNumber != "" && cookiePrefix != "" && cookieCountry != "" ) {
        for ( i = 0; i < ds.options.length; ++i ) {
            if ( ds.options[i].text == cookieCountry ) {                          
                document.getElementById('numberac').value = cookieNumber;
                ds.options[i].selected = "1";                                
                changePrefixBox();
                return;
            }
        }      
    }
    
    changePrefixBox();
    document.getElementById("callbutton").disabled = false;
    document.getElementById("callbutton").focus();
    //alert("[initializeNumbers] disabled: " + document.getElementById("callbutton").disabled);
}

function changeStateImage(image)
{
    //alert(image.src);
    var stateimage = document.getElementById("stateimage");
    stateimage.src = image.src;
    stateimage.alt = image.alt;
    stateimage.style.visibility = "visible";
}

function saveNumber(prefix, number, country) {
     if ( visitorContact != null )
        return; //caso LCS
    var n = new Object();
    n.prefix = prefix;
    n.number = number;
    for (var i = 0; i < cookieNumbers.length; ++i) {
        if ( cookieNumbers[i].prefix == prefix && cookieNumbers[i].number == number ) {
            cookieNumbers.splice(i, 1);
        }
    }
    cookieNumbers.push(n);
    if ( cookieNumbers.lenght > 10 )
        cookieNumbers.splice(0, cookieNumbers.lenght - 10);
    SetCookie("CookieNumbers", YAHOO.lang.JSON.stringify(cookieNumbers), 90);
    SetCookie('sitofonoPrefix', prefix, 90);
    SetCookie('sitofonoNumber', number, 90);    
    SetCookie('sitofonoCountry', country, 90);    
}

function getNumbersForPrefix(prefix) {
    var numbers = new Array();
    for (var i = 0; i < cookieNumbers.length; ++i) {
        if ( cookieNumbers[i].prefix == prefix ){
            //alert(cookieNumbers[i].number + " " + cookieNumbers[i].number.length);
            numbers.push(cookieNumbers[i].number);
        }
    }
    //alert("numbers size (" + prefix + ") = " + numbers.length + " - cookieNumbers size = " + cookieNumbers.length);
    return numbers;
}

        
function clearState(statusCode) {            
    document.getElementById('callstatetext').innerHTML="&nbsp;";
    var stateImage = document.getElementById("stateimage");
    stateImage.style.visibility = "hidden";       
}

function loadImages() {
    call_squillando = new Image(105, 58);
    call_squillando.src = "images/mela_arancio.gif";
    call_squillando.alt = "call closed";
    call_autorizzata= new Image(105, 58);
    call_autorizzata.src = "images/mela_verde.gif";
    call_autorizzata.alt = "call starting";
    call_non_abilitata = new Image(105, 58);
    call_non_abilitata.src = "images/mela_rossa.gif";
    call_non_abilitata.alt = "call connected";
}

