/*
 * Manageing the C2Call PhoneApplet
 */

PhoneManager = function(applet) {
    this.phoneApplet = applet;
    //alert('Applet Initialized!');
        
    this.friendsXML = null;
    this.contactsXML = null;
    this.historyXML = null;
    this.messagesXML = null;
    this.userCredit = null;
    this.userCurrency = "EUR";
    this.userVAT = "true";
    this.creditMonitorInstance = 0;
    this.handleEvents = false;
    this.displayName = null;
    this.registered = false;
    this.presenceString = '';

    this.registered = this.phoneApplet.isUserRegistered();
    this.presenceString = new String(this.phoneApplet.getPresenceList());
    
    var xml = this.phoneApplet.getFriendsXML();
        
    if (xml != null)
        this.friendsXML =  new String(xml);
     
    xml = this.phoneApplet.getContactsXML();
    if (xml != null)
        this.contactsXML =  new String(xml);
      
    xml = this.phoneApplet.getCallHistoryXML();
    if (xml != null)
        this.historyXML =  new String(xml);
    
    xml = this.phoneApplet.getMSGHistoryXML();
    if (xml != null)
        this.messagesXML =  new String(xml);
      
    this.messageEvents = new Array();
    this.callEvents = new Array();
    this.messageByUserid = new Array();
    this.eventListener = new Array();

    //alert('history : ' + this.historyXML);
    
    try {
        if (this.friendsXML != null && this.friendsXML != '')
            this.c2friends = new C2Friends(this.friendsXML);
    } catch (exception) { 
        var msg = '';
        for (var i in exception) {
            msg = msg + exception[i] + ' / ';
        }
        alert('Exception PhoneManager 1 : ' + msg + ' : ' + exception);
    }

    try {
        if (this.contactsXML != null && this.contactsXML != '')
            this.c2contacts = new C2Contacts(this.contactsXML);
    } catch (exception) { 
        msg = '';
        for (i in exception) {
            msg = msg + exception[i] + ' / ';
        }
        alert('Exception PhoneManager 2 : ' + msg + ' : ' + exception);
    }

    try {
        if (this.historyXML != null && this.historyXML != '')
            this.c2history = new XMLObject(this.historyXML);
    } catch (exception) { 
        msg = '';
        for (i in exception) {
            msg = msg + exception[i] + ' / ';
        }
        alert('Exception PhoneManager 3 : ' + msg + ' : ' + exception);
    }

    try {
        this.refreshMessages();
    } catch (exception) { 
        msg = '';
        for (i in exception) {
            msg = msg + exception[i] + ' / ';
        }
        alert('Exception PhoneManager 4 : ' + msg + ' : ' + exception);
    }


}

PhoneManager.prototype.isUserRegistered = function(){
    return this.registered;
}


PhoneManager.prototype.getPriceInfo = function(number, currency){
    var billingXML = this.phoneApplet.getPriceInfoXML(number, this.userCurrency, this.userVAT);
    if (billingXML != null) {
        //alert('xml : ' + new String(billingXML));
        var billing = new XMLObject(new String(billingXML));
		//alert(billing);

        var value = parseFloat(billing.getAttributeValue('Charges'));
        var costs = value.toFixed(4) + ' ' + billing.getAttributeValue('Currency');
        //alert('Costs : ' +costs);
        return costs;
    }
     
    return "n/a";
}

PhoneManager.prototype.getDisplayName = function() { 
    if (typeof(this.displayName) == 'undefined' || this.displayName == null) {
        this.displayName = new String(this.phoneApplet.getUserDisplayName());
    }
    return this.displayName;
}

PhoneManager.prototype.addListener = function(listenerName, listener) {
    this.eventListener[listenerName] = listener;
}

PhoneManager.prototype.removeListener = function(listenerName) {
    this.eventListener[listenerName] = null;
}

PhoneManager.prototype.fireEvent = function(eventType, eventObject) {
    
    if (!this.handleEvents) {
        return;
    }

    //alert('fireEvent  :' + eventType + ' to : ' + this.eventListener.length);
    for (var name in this.eventListener) {
        try {
            if (this.eventListener[name] == null) {
                continue;
            }
            
            if (this.eventListener[name].handleEvent) {
                //alert('fireEvent  :' + eventType);
                this.eventListener[name].handleEvent(this, eventType, eventObject);
            }
        } catch (exception) { 
            var msg = '';
            for (var i in exception) {
                msg = msg + exception[i] + ' / ';
            }

            alert('Error : fireEvent : ' + eventType + ' / ' + msg);
        }
    }
    
}

PhoneManager.prototype.creditMonitorStub = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    this.creditMonitorInstance = 1; 
    var wrapper = function () {
        method.creditMonitorInstance = 0;
        method.creditMonitor();

    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

PhoneManager.prototype.checkUserCredits = function () {
    
    var xml = this.phoneApplet.getUserCreditsXML();
    //alert('PhoneManger.checkUserCredits() : ' + new String(xml));

    if (xml == null) {
        return;
    }
    
    var c = new XMLObject(new String(xml));
    var creditsNew = c.getAttributeValue('Credits');
    //alert(creditsNew);
    if (this.userCredit == null) {
        this.userCredit = c;
        this.userCurrency = c.getAttributeValue("Currency");
        this.userVAT = c.getAttributeValue("VAT");
        this.fireEvent("UserCredit", this.userCredit);
        return;
    }
    
    var creditsOld = this.userCredit.getAttributeValue('Credits');
    if (creditsOld != creditsNew) {
        this.userCredit = c;
        this.userCurrency = c.getAttributeValue("Currency");
        this.userVAT = c.getAttributeValue("VAT");
        this.fireEvent("UserCredit", this.userCredit);
        return;
    }
}

PhoneManager.prototype.creditMonitor = function () {
    //alert('PhoneManger.creditMonitor()');
    this.checkUserCredits();
    
    var status = this.phoneApplet.getCallStatus();
    if (status != 0) {
        if (this.creditMonitorInstance == 0) {
            setTimeout(this.creditMonitorStub(), 60000);
        }
    }
//    else {
//        //alert('Stop Credit Monitor!');
//    }
}

PhoneManager.prototype.call = function(contact) {
    //alert('PhoneManger.call : ' + contact + ' / ' + this.callEvents.length);
    // Remove existing event from the same caller
    var tmpList = new Array();
    for (var i = 0; i < this.callEvents.length; i++) {
        var ce = this.callEvents[i];
        if (ce.getElementValue('Contact') != contact) {
            tmpList.push(ce);
        } 
    }
    this.callEvents = tmpList;        

    
    this.phoneApplet.call(contact.toString());
    setTimeout(this.creditMonitorStub(), 3000);
}

PhoneManager.prototype.writeContact = function(contact) {
    this.phoneApplet.writeContact(contact.toString());
}

PhoneManager.prototype.removeContact = function(contact) {
    this.phoneApplet.removeContact(contact.toString());
    this.refreshContacts();
}

PhoneManager.prototype.removeFriend = function(friendid) {
    this.phoneApplet.removeFriend(friendid);
    this.refreshFriends();
}

PhoneManager.prototype.refreshContacts = function() {
    this.contactsXML =  new String(this.phoneApplet.getContactsXML());
    if (this.contactsXML != null && this.contactsXML != '') {
        //alert('Contacts : ' + this.contactsXML);
        this.c2contacts = new C2Contacts(this.contactsXML);
    } else {
//alert('Contacts : NULL');
}
}

PhoneManager.prototype.refreshFriends = function() {
    this.friendsXML =  new String(this.phoneApplet.getFriendsXML());
    if (this.friendsXML != null && this.friendsXML != '') {
        //alert('Friends : ' + this.contactsXML);
        this.c2friends = new C2Friends(this.friendsXML);
    } else {
//alert('Friends : NULL');
}
}

PhoneManager.prototype.refreshHistory = function() {
                
    this.historyXML =  new String(this.phoneApplet.getCallHistoryXML());
    //alert('history : ' + this.historyXML);
    if (this.historyXML != null && this.historyXML != '') {
        //alert('Friends : ' + this.contactsXML);
        this.c2history = new XMLObject(this.historyXML);
    } else {
    //alert('Friends : NULL');
    }
    var event = new XMLObject("<RefreshHistory/>");
    this.fireEvent('RefreshHistory', event);
}

PhoneManager.prototype.refreshMessages = function() {
    this.messagesXML = null;
    var xml = this.phoneApplet.getMSGHistoryXML();
    
    if (xml != null)
        this.messagesXML =  new String(xml);
 
    
    if (this.messagesXML != null && this.messagesXML != '') {
        //alert('messages : ' + this.messagesXML.substr(this.messagesXML.length - 50));
        
        this.c2messages = new XMLObject(this.messagesXML);
        
        var eventList = this.c2messages.getElementObjects('C2CallEvent');
        this.messageByUserid = new Array();
        for (var i = 0; i < eventList.length; i++) {
            var event = eventList[i];
            var userid = event.getElementValue('Contact');
            
            var mlist = this.messageByUserid[userid];
            if (!mlist || mlist == null) {
                mlist = new Array();
                this.messageByUserid[userid] = mlist;
            }
            mlist.push(event);
        }
        
    } else {
//alert('Friends : NULL');
}
}

PhoneManager.prototype.getMessagesByUserid = function(userid) {
    return this.messageByUserid[userid];
}

PhoneManager.prototype.processIM = function (userid, username, msgkey) {
    //alert('Phone Manager - New Message : ' + userid + ' / ' + msgkey);
    
    var message = new String(this.phoneApplet.getMessage(msgkey));
    var evt = new XMLObject('<C2CallEvent/>');

    evt.setElementValue('EventType', 'MessageIn');
    evt.setElementValue('EventId', msgkey);
    evt.setElementValue('Contact', userid);
    evt.setElementValue('Description', message);
    
    var date = new Date();
    var datestr = this.getFormattedDate(date);

    evt.setElementValue('Timestamp', datestr);
    evt.setElementValue('Timevalue', '' + date.getTime());

    this.messageEvents.push(evt);
    
    var mlist = this.messageByUserid[userid];
    if (!mlist || mlist == null) {
        mlist = new Array();
        this.messageByUserid[userid] = mlist;
    }
    mlist.push(evt);

    if (this.handleEvents)
        setTimeout(this.fireEventStub('MessageIn', evt), 100);
    else
        setTimeout(this.fireEventStub('MessageIn', evt), 2000);
        
}

PhoneManager.prototype.sendIM = function (userid, message) {
    
    // Remove all message events from that userid
    var newarray = new Array();
    for (var i = 0; i < this.messageEvents.length; i++) {
        var event = this.messageEvents[i];
        if (event.getElementValue('Contact') != userid) {
            newarray.push(event);
        }
    }
    this.messageEvents = newarray;
    
    var evt = new XMLObject('<C2CallEvent/>');

    evt.setElementValue('EventType', 'MessageOut');
    evt.setElementValue('EventId', userid);
    evt.setElementValue('Contact', userid);
    evt.setElementValue('Description', message);
    
    var date = new Date();
    var datestr = this.getFormattedDate(date);

    evt.setElementValue('Timestamp', datestr);
    evt.setElementValue('Timevalue', '' + date.getTime());

    var mlist = this.messageByUserid[userid];
    if (!mlist || mlist == null) {
        mlist = new Array();
        this.messageByUserid[userid] = mlist;
    }
    mlist.push(evt);

    
    var res = this.phoneApplet.sendIM(userid, message);
}

PhoneManager.prototype.getFormattedDate = function(date) {
    //var date = new Date();
    var dayzero = '';
    if (date.getDate() <= 9) {
        dayzero = '0';
    }

    var monthzero = '';
    if ((date.getMonth() + 1) <= 9) {
        monthzero = '0';
    }

    var hourzero = '';
    if (date.getHours() <= 9) {
        hourzero = '0';
    }
    var minutezero = '';
	if (date.getMinutes() <= 9) {
		minutezero = '0';
    }
    //alert("date : " + date);
    var datestr = dayzero + date.getDate() + '.' + monthzero + (date.getMonth() + 1) + '.' + date.getFullYear() + ' ' + hourzero + date.getHours() + ':'+ minutezero + date.getMinutes();
    //alert("datestr : " + datestr);
    return datestr;
}

PhoneManager.prototype.notifyCall = function(caller, ntype, displayName) {
    //alert('phoneManager.notifyCall : ' + caller + ' / ' + ntype);
    var callEvent = null;
    var tmpList = new Array();
    
    if (ntype == 'hangup') {
    // Remove existing event from the same caller
    //        for (var i = 0; i < this.callEvents.length; i++) {
    //            var ce = this.callEvents[i];
    //            if (ce.getElementValue('Contact') == caller) {
    //                callEvent = ce;
    //            } else {
    //                tmpList.push(ce);
    //            }
    //        }
    //        this.callEvents = tmpList;
    } else if (ntype == 'busy') 
    {
    } else if (ntype == 'notavailable') 
    {
    } else if (ntype == 'error') 
    {
    } else 
    {
        
        if (this.phoneApplet.getCallStatus() == 1) {
            // Eingehender Anruf
            //alert('incoming call');
            // Find existing event from the same caller
            for (i = 0; i < this.callEvents.length; i++) {
                ce = this.callEvents[i];
                if (ce.getElementValue('Contact') == caller) {
                    callEvent = ce;
                } else {
                    tmpList.push(ce);
                }
            }
        
        
            var date = new Date();
            var datestr  = '06.10.2008 15:54'; //date.toLocaleFormat("%d.%m.%Y %H:%M");
            if (callEvent != null) {
                this.callEvents = tmpList;
                callEvent.setElementValue('Timestamp', datestr);
                callEvent.setElementValue('Timevalue', '' + date.getTime());
            } else {
                callEvent = new XMLObject('<C2CallEvent/>');
                callEvent.setElementValue('EventType', 'CallIn');
                callEvent.setElementValue('EventId', '' + date.getTime());
                callEvent.setElementValue('Contact', caller);
                callEvent.setElementValue('Description', displayName);
                callEvent.setElementValue('Timestamp', datestr);
                callEvent.setElementValue('Timevalue', '' + date.getTime());
            }
        
            this.callEvents.push(callEvent);
        }
        
    }   

    
    var event = new XMLObject("<NotifyCall/>");
    event.setElementValue('Caller', caller);
    event.setElementValue('NType', ntype);
    event.setElementValue('DisplayName', displayName);

	self.focus();
	
    if (this.handleEvents) 
        setTimeout(this.fireEventStub('NotifyCall', event), 100);
    else
        setTimeout(this.fireEventStub('NotifyCall', event), 2000);

}

PhoneManager.prototype.notifyDataUpdate = function(dataType) {
    //alert('notifyDataUpdate : ' + dataType);
    if (dataType == 'C2Friends') {
        this.refreshFriends();
    }

    if (dataType == 'C2Contacts') {
        this.refreshContacts();
    }

    if (dataType == 'C2CallHistory') {
        this.refreshHistory();
    }

    if (dataType == 'C2MSGHistory') {
        this.refreshMessages();
    }

    var event = new XMLObject("<NotifyDataUpdate/>");
    event.setElementValue('DataType', dataType);

    if (this.handleEvents)
        setTimeout(this.fireEventStub('NotifyDataUpdate', event), 100);
    else
        setTimeout(this.fireEventStub('NotifyDataUpdate', event), 2000);
}

PhoneManager.prototype.notifyOnlineStatus = function(status) {
    var event = new XMLObject("<NotifyOnlineStatus/>");
    event.setElementValue('Status', status);
    
    if (this.handleEvents) 
        setTimeout(this.fireEventStub('NotifyOnlineStatus', event), 100);
    else
        setTimeout(this.fireEventStub('NotifyOnlineStatus', event), 2000);
}

PhoneManager.prototype.notifyCallInfo = function(ntype, status) {
    var event = new XMLObject("<NotifyCallInfo/>");
    event.setElementValue('NType', ntype);
    event.setElementValue('Status', status);
    if (this.handleEvents)
        setTimeout(this.fireEventStub('NotifyCallInfo', event), 100);
    else
        setTimeout(this.fireEventStub('NotifyCallInfo', event), 2000);
}

PhoneManager.prototype.doPresence = function() {
    
    if (this.handleEvents) 
        setTimeout(this.firePresenceStub('NotifyPresence', null), 100);
    else
        setTimeout(this.firePresenceStub('NotifyPresence', null), 2000);
    
}

PhoneManager.prototype.refreshPresence = function() {
    this.presenceString = new String(this.phoneApplet.getPresenceList());
} 

PhoneManager.prototype.checkPresence = function(userid) {
    if (this.presenceString == null || this.presenceString == '') {
        return false;
    }

    if (this.presenceString.indexOf(userid) != -1) {
        return true;
    }

    return false;
} 


PhoneManager.prototype.firePresenceStub = function () {
    var method = this;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function () {
        method.refreshPresence();
        method.fireEvent('NotifyPresence', null);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

PhoneManager.prototype.fireEventStub = function (etype, eobj) {
    var method = this;
    var eventType = etype;
    var eventObject = eobj;

    // Notiere eine Function-Expression, die als Closure wirkt
    var wrapper = function () {
        method.fireEvent(eventType, eventObject);
    };

    // Gib die Wrapper-Funktion zurück.
    return wrapper;
}

PhoneManager.prototype.takeCall = function() {
    if (this.callEvents.length > 0) {
        //alert('CallEvents 1 : ' + this.callEvents.length);
        this.callEvents.pop();
    //alert('CallEvents 2 : ' + this.callEvents.length);
    }
    
    this.phoneApplet.takeCall();
}

PhoneManager.prototype.hangUpCall = function() {
    this.phoneApplet.hangUpCall();
    setTimeout(this.fireEventStub('UserHangUp', null), 100);
}

PhoneManager.prototype.rejectCall = function() {
    this.phoneApplet.rejectCall();
    setTimeout(this.fireEventStub('UserHangUp', null), 100);
}

PhoneManager.prototype.hasCallEventForUser = function(userid) {
    
    for (var i = 0; i < this.callEvents.length; i++) {
        var ce = this.callEvents[i];
        if (ce.getElementValue('Contact') == userid) {
            return true;
        } 
    }

    return false;
}

PhoneManager.prototype.hasMessageEventForUser = function(userid) {
    
    for (var i = 0; i < this.messageEvents.length; i++) {
        var ce = this.messageEvents[i];
        if (ce.getElementValue('Contact') == userid) {
            //alert('MessageEvent for :' + userid);
            return true;
        } 
    }

    return false;
}

