Initial commit of the Modello Phone app
[profile/ivi/Modello_Phone.git] / js / main.js
1 /*global disconnectCall, Bootstrap, Carousel, ContactsLibrary, getAppByID, disconnectCall, Configuration, Speech, Phone, changeCssBgImageColor, ThemeKeyColorSelected */
2
3 /**
4  * This application provides voice call from paired Bluetooth phone. Application uses following APIs:
5  *
6  * * {{#crossLink "Phone"}}{{/crossLink}} library
7  * * [tizen.bt]() as replacement of [tizen.bluetooth](https://developer.tizen.org/dev-guide/2.2.0/org.tizen.web.device.apireference/tizen/bluetooth.html) API due to
8  *   conficts in underlying framework
9  *
10  * Application supports multiple connected devices, however only one of the devices can be selected at the time.
11  * Selection is done from {{#crossLink "Bluetooth"}}{{/crossLink}} UI. In case that phone has active call additional {{#crossLink "Carousel"}}{{/crossLink}}
12  * element is replaced by {{#crossLink "CallDuration"}}{{/crossLink}} element.
13  *
14  * Application allows following operations:
15  *
16  * * {{#crossLink "Phone/acceptCall:method"}}Place call{{/crossLink}}
17  * * Handles incoming calls passed from {{#crossLink "IncomingCall"}}{{/crossLink}} widget
18  * * Display {{#crossLink "Carousel"}}call history{{/crossLink}}
19  * * Display {{#crossLink "ContactsLibrary"}}contact list{{/crossLink}}
20  * * Mute/unmute call - not working due to [TIVI-2448](https://bugs.tizen.org/jira/browse/TIVI-2448)
21  *
22  * Additionaly application can be controlled using speech recognition via {{#crossLink "Speech"}}{{/crossLink}} component.
23  *
24  * Hover and click on elements in images below to navigate to components of Phone application.
25  *
26  * <img id="Image-Maps_1201312180420487" src="../assets/img/phone.png" usemap="#Image-Maps_1201312180420487" border="0" width="649" height="1152" alt="" />
27  *   <map id="_Image-Maps_1201312180420487" name="Image-Maps_1201312180420487">
28  *     <area shape="rect" coords="0,0,573,78" href="../classes/TopBarIcons.html" alt="top bar icons" title="Top bar icons" />
29  *     <area shape="rect" coords="0,77,644,132" href="../classes/Clock.html" alt="clock" title="Clock"    />
30  *     <area shape="rect" coords="0,994,644,1147" href="../classes/BottomPanel.html" alt="bottom panel" title="Bottom panel" />
31  *     <area shape="rect" coords="573,1,644,76" href="../modules/Settings.html" alt="Settings" title="Settings"    />
32  *     <area shape="rect" coords="552,136,646,181" href="../classes/ContactsLibrary.html" alt="Contacts library" title="Contacts library" />
33  *     <area shape="rect" coords="95,345,164,491" href="../classes/Phone.html#method_acceptCall" alt="Call button" title="Call button" />
34  *     <area shape="rect" coords="1,668,644,984" href="../classes/Carousel.html" alt="" title="History carousel" />
35  *     <area shape="rect" coords="171,181,471,635" alt=""   href="../classes/keyboard.html" alt="Keyboard input" title="Keyboard input"    >
36  *   </map>
37  *
38  * @module PhoneApplication
39  * @main PhoneApplication
40  * @class Phone
41  */
42
43 /**
44  * Holds object of input for dialing phone number.
45  *
46  * @property telInput {Object}
47  */
48 var telInput;
49 /**
50  * Instance of class Bootstrap, this class provides unified way to boot up the HTML applications by loading shared components in proper order.
51  * * {{#crossLink "Bootstrap"}}{{/crossLink}}
52  *
53  * @property bootstrap {Object}
54  */
55 var bootstrap;
56
57 /**
58 * Instance of class Carousel, this class provides methods to operate with hystory carousel.
59 * * {{#crossLink "Carousel"}}{{/crossLink}}
60 *
61 * @property callHistoryCarousel {Object}
62 */
63 var callHistoryCarousel = null;
64
65 /**
66 * This property holds information about accept Phone call from Other widgets.
67 * If is true, phone call came from another widget.
68 * @property acceptPhoneCallFromOtherWidget {Boolean}
69 */
70 var acceptPhoneCallFromOtherWidget = false;
71
72 /**
73  * Class handling user input from keyboard
74  *
75  * @class keyboard
76  * @static
77  */
78 var keyboard = {
79     /**
80      * property holding Interval within which next click on the same key is considered as rotating associated characters with the given key.
81      *
82      * @property clickInterval {int}
83      */
84     clickInterval: 1000,
85
86     /**
87      * property holding info about last pressed key
88      *
89      * @property pressedKey {string}
90      */
91     pressedKey: "-1",
92
93     /**
94      * Array of input object holding info about main key character, all associated characters with the given key and index of currently used key
95      *
96      * @property inputs {Array of Object}
97      */
98     inputs: [{
99         key: "1",
100         values: ["1"],
101         index: 0
102     }, {
103         key: "2",
104         values: ["2", "A", "B", "C"],
105         index: 0
106     }, {
107         key: "3",
108         values: ["3", "D", "E", "F"],
109         index: 0
110     }, {
111         key: "4",
112         values: ["4", "G", "H", "I"],
113         index: 0
114     }, {
115         key: "5",
116         values: ["5", "J", "K", "L"],
117         index: 0
118     }, {
119         key: "6",
120         values: ["6", "M", "N", "O"],
121         index: 0
122     }, {
123         key: "7",
124         values: ["7", "P", "Q", "R", "S"],
125         index: 0
126     }, {
127         key: "8",
128         values: ["8", "T", "U", "V"],
129         index: 0
130     }, {
131         key: "9",
132         values: ["9", "W", "X", "Y", "Z"],
133         index: 0
134     }, {
135         key: "*",
136         values: ["*"],
137         index: 0
138     }, {
139         key: "0",
140         values: ["0", "+"],
141         index: 0
142     }, {
143         key: "#",
144         values: ["#"],
145         index: 0
146     }],
147
148     /**
149      * property holding time of clickedInterval started
150      *
151      * @property startedTime {Date}
152      */
153     startedTime: null,
154
155     /**
156      * property holding input object associated with last pressed key
157      *
158      * @property selectedInput {Object}
159      */
160     selectedInput: null,
161
162     /**
163      * function starting clickInterval
164      *
165      * @method startTimer
166      */
167     startTimer: function() {
168         "use strict";
169         keyboard.startedTime = new Date();
170     },
171
172     /**
173      * function testing if clickInterval expired
174      *
175      * @method intervalExpired
176      * @param currTime {Date}
177      */
178     intervalExpired: function(currTime) {
179         "use strict";
180         if (currTime - keyboard.startedTime > keyboard.clickInterval) {
181             keyboard.resetIndices();
182             return true;
183         }
184         return false;
185     },
186
187     /**
188      * function reseting indices for all input objects to 0
189      *
190      * @method resetIndices
191      */
192     resetIndices: function() {
193         "use strict";
194         for (var i in keyboard.inputs) {
195             if (keyboard.inputs.hasOwnProperty(i)) {
196                 keyboard.inputs[i].index = 0;
197             }
198         }
199     },
200
201     /**
202      * function cycling associated input characters within clickInterval
203      *
204      * @method nextKey
205      */
206     nextKey: function() {
207         "use strict";
208         for (var i in keyboard.inputs) {
209             if (keyboard.pressedKey === keyboard.inputs[i].key) {
210                 if (keyboard.inputs[i].values.length > 1) {
211                     if (keyboard.inputs[i].index < keyboard.inputs[i].values.length - 1) {
212                         keyboard.inputs[i].index += 1;
213                     } else {
214                         keyboard.inputs[i].index = 0;
215                     }
216                 } else {
217                     keyboard.inputs[i].index = 0;
218                 }
219                 keyboard.selectedInput = keyboard.inputs[i];
220                 return keyboard.inputs[i].values[keyboard.inputs[i].index];
221             }
222         }
223         return keyboard.pressedKey;
224     },
225
226     /**
227      * function setting selected input object based on last pressed key
228      *
229      * @method selectInput
230      */
231     selectInput: function() {
232         "use strict";
233         for (var i in keyboard.inputs) {
234             if (keyboard.pressedKey === keyboard.inputs[i].key) {
235                 keyboard.selectedInput = keyboard.inputs[i];
236             }
237         }
238     }
239 };
240
241 /**
242  * Holds status of calling panel initialization.
243  *
244  * @property callingPanelInitialized {Boolean}  if is true, calling panel is initialized
245  * @default false
246  */
247 var callingPanelInitialized = false;
248
249 /**
250  * Class which provides initialize call info.
251  *
252  * @method initializeCallInfo
253  * @param contact {Object} Contact object.
254  * @for Phone
255  */
256 function initializeCallInfo(contact) {
257     "use strict";
258     var callNumber;
259     console.log(contact);
260     if ( !! contact) {
261
262         if ( !! contact.name) {
263             var nameStr;
264             if (contact.name.displayName) {
265                 nameStr = contact.name.displayName;
266             } else {
267                 nameStr = !! contact.name.firstName ? contact.name.firstName : "";
268                 nameStr += !! contact.name.lastName ? " " + contact.name.lastName : "";
269             }
270             $("#callName").html(nameStr.trim());
271         } else {
272             $("#callName").html("Unknown");
273         }
274
275         if ( !! contact.phoneNumbers && contact.phoneNumbers.length) {
276             callNumber = !! contact.phoneNumbers[0].number ? contact.phoneNumbers[0].number : "";
277             $("#callNumber").html(callNumber);
278         } else {
279             $("#callNumber").html("Unknown");
280         }
281
282         if ( !! contact.photoURI) {
283             $("#callPhoto").attr("src", contact.photoURI);
284         }
285     } else {
286         $("#callName").html("Unknown");
287         $("#callNumber").html("Unknown");
288     }
289
290     if (!callingPanelInitialized) {
291         $(".noVolumeSlider").noUiSlider({
292             range: [0, 100],
293             step: 1,
294             start: 50,
295             handles: 1,
296             connect: "lower",
297             orientation: "horizontal",
298             slide: function() {
299                 var VolumeSlider = parseInt($(".noVolumeSlider").val(), 10);
300                 console.log("noVolumeSlider" + VolumeSlider);
301             }
302         });
303         callingPanelInitialized = true;
304     }
305
306     if ($("#callButton").hasClass("callingFalse")) {
307         $("#callButton").removeClass("callingFalse");
308         $("#callButton").addClass("callingTrue");
309     }
310 }
311
312 /**
313  * Class which provides methods to operate with call duration. Component show information about current call (call number or call contact, time duration of call).
314  *
315  * @class CallDuration
316  * @static
317  */
318 var CallDuration = {
319     /**
320      * Holds value of seconds.
321      *
322      * @property sec {Integer}
323      */
324     sec: 0,
325     /**
326      * Holds value of minutes.
327      *
328      * @property min {Integer}
329      */
330     min: 0,
331     /**
332      * Holds value of hours.
333      *
334      * @property hour {Integer}
335      */
336     hour: 0,
337     /**
338      * Holds object of timer.
339      *
340      * @property timeout {Object}
341      */
342     timeout: null,
343     /**
344      * Method provides initialization of call timers.
345      *
346      * @method initialize
347      */
348     startWatch: function() {
349         "use strict";
350         var self = this;
351         if (!this.timeout) {
352             this.timeout = window.setInterval(function() {
353                 self.stopwatch();
354             }, 1000);
355         } else {
356             this.resetIt();
357             this.timeout = window.setInterval(function() {
358                 self.stopwatch();
359             }, 1000);
360         }
361     },
362
363     /**
364      * Method provides reset call timers.
365      *
366      * @method resetIt
367      */
368     resetIt: function() {
369         "use strict";
370         CallDuration.sec = 0;
371         CallDuration.min = 0;
372         CallDuration.hour = 0;
373         window.clearTimeout(CallDuration.timeout);
374         var callStatus = tizen.phone.activeCall.state.toLowerCase();
375         if (callStatus === "DIALING".toLowerCase()) {
376             $("#callDuration").html("DIALING");
377         } else if (callStatus === "DISCONNECTED".toLowerCase()) {
378             $("#callDuration").html("ENDED");
379         } else {
380             $("#callDuration").html(
381                 ((CallDuration.min <= 9) ? "0" + CallDuration.min : CallDuration.min) + ":" + ((CallDuration.sec <= 9) ? "0" + CallDuration.sec : CallDuration.sec));
382         }
383
384     },
385     /**
386      * Method provides call stop watch.
387      *
388      * @method stopwatch
389      */
390     stopwatch: function() {
391         "use strict";
392
393         var callStatus = tizen.phone.activeCall.state.toLowerCase();
394         if (callStatus === "DIALING".toLowerCase()) {
395             $("#callDuration").html("DIALING");
396         } else if (callStatus === "DISCONNECTED".toLowerCase()) {
397             $("#callDuration").html("ENDED");
398
399         } else {
400             CallDuration.sec++;
401             if (CallDuration.sec === 60) {
402                 CallDuration.sec = 0;
403                 CallDuration.min++;
404             }
405
406             if (CallDuration.min === 60) {
407                 CallDuration.min = 0;
408                 CallDuration.hour++;
409             }
410             $("#callDuration").html(
411                 ((CallDuration.min <= 9) ? "0" + CallDuration.min : CallDuration.min) + ":" + ((CallDuration.sec <= 9) ? "0" + CallDuration.sec : CallDuration.sec));
412         }
413     }
414 };
415
416 /**
417 * This property holds information about mute of call. If is true, phone call is mute.
418 *
419 * @property VolumeMuteStatus
420 * @default false
421 */
422 var VolumeMuteStatus = false;
423
424 /**
425  * Class provides a muting of a call
426  *
427  * @method muteCall
428  * @for Phone
429  */
430 function muteCall() {
431     "use strict";
432     VolumeMuteStatus = VolumeMuteStatus ? false : true;
433
434     // Not working due to TIVI-2448
435     if (tizen.phone) {
436         //tizen.phone.muteCall(VolumeMuteStatus);
437     }
438     if (VolumeMuteStatus) {
439         changeCssBgImageColor(".muteButton", ThemeKeyColorSelected);
440         $(".muteButton").addClass("fontColorSelected");
441     } else {
442         changeCssBgImageColor(".muteButton", "#FFFFFF");
443         $(".muteButton").removeClass("fontColorSelected");
444     }
445 }
446
447 /**
448  * Class which provides methods to call contact.
449  *
450  * @method acceptCall
451  * @param contact {Object} Contact object.
452  * @for Phone
453  */
454 function acceptCall(contact) {
455     "use strict";
456
457     ContactsLibrary.hide();
458     if ($("#settingsTabs").tabs) {
459         $("#settingsTabs").tabs("hidePage");
460     }
461     $("#callBox").removeClass("callBoxHidden");
462     $("#callBox").addClass("callBoxShow");
463     $('#contactsCarouselBox').removeClass("contactsCarouselBoxShow");
464     $('#contactsCarouselBox').addClass("contactsCarouselBoxHide");
465     if (tizen.phone) {
466         CallDuration.resetIt();
467
468         initializeCallInfo(contact);
469         var callStatus = tizen.phone.activeCall.state.toLowerCase();
470         if (callStatus !== "ACTIVE".toLowerCase() && callStatus !== "DIALING".toLowerCase()) {
471
472             if (callStatus === "INCOMING".toLowerCase()) {
473                 tizen.phone.answerCall(function(result) {
474                     console.log(result.message);
475                 });
476             } else if (callStatus === "DISCONNECTED".toLowerCase()) {
477
478                 var callNumber = contact.phoneNumbers[0] && contact.phoneNumbers[0].number ? contact.phoneNumbers[0].number : "";
479                 tizen.phone.invokeCall(callNumber, function(result) {
480                     console.log(result.message);
481                 });
482
483             }
484
485         } else if (callStatus === "ACTIVE".toLowerCase()) {
486             CallDuration.startWatch();
487         }
488     }
489 }
490
491 /**
492  * Class which provides disconnect call.
493  *
494  * @method disconnectCall
495  * @for Phone
496  */
497 function disconnectCall() {
498     "use strict";
499     $("#callButton").removeClass("callingTrue");
500     $("#callButton").addClass("callingFalse");
501     if (acceptPhoneCallFromOtherWidget !== true) {
502         $("#callBox").removeClass("callBoxShow");
503         $("#callBox").addClass("callBoxHidden");
504         $('#contactsCarouselBox').removeClass("contactsCarouselBoxHide");
505         $('#contactsCarouselBox').addClass("contactsCarouselBoxShow");
506     }
507     CallDuration.resetIt();
508     if (tizen.phone) {
509         tizen.phone.hangupCall(function(result) {
510             console.log(result.message);
511         });
512     }
513     $("#inputPhoneNumber").val('');
514 }
515
516 $(document).ready(
517     function() {
518         "use strict";
519         setTimeout(function() {
520             /* initialize phone widget by remote device status */
521             if (tizen.phone) {
522                 tizen.phone.getSelectedRemoteDevice(function(selectedRemoteDevice){
523                 if (selectedRemoteDevice !== "") {
524                     $("#noPairedDevice").hide();
525                     $("#loadingHistorySpinnerWrapper").show();
526                 } else {
527                     $("#noPairedDevice").show();
528                 }
529                 });
530                 /* initialize phone widget by active call status */
531                 var callStatus = tizen.phone.activeCall.state.toLowerCase();
532                 if (callStatus === "INCOMING".toLowerCase() || callStatus === "DIALING".toLowerCase() || callStatus === "ACTIVE".toLowerCase()) {
533                     var contact;
534                     if (tizen.phone.callState) {
535                         contact = tizen.phone.activeCall.contact;
536                     }
537                     acceptPhoneCallFromOtherWidget = true;
538                     acceptCall(contact);
539                 } else if (callStatus === "DISCONNECTED".toLowerCase()) {
540                     disconnectCall();
541                 }
542             }
543             /* start keyboard timer */
544             keyboard.startTimer();
545             /* initialize bootstrap */
546             bootstrap = new Bootstrap(function(status) {
547                 telInput = $("#inputPhoneNumber");
548                 $("#clockElement").ClockPlugin('init', 5);
549                 $("#clockElement").ClockPlugin('startTimer');
550                 $("#topBarIcons").topBarIconsPlugin('init', 'phone');
551                 $('#bottomPanel').bottomPanel('init');
552                 if (!callHistoryCarousel) {
553
554                     callHistoryCarousel = new Carousel();
555                 }
556
557                 if (typeof Phone !== "undefined") {
558                     /* add listener to selected remote device */
559                     tizen.phone.addRemoteDeviceSelectedListener(function(returnID) {
560                         if ((!!returnID && !!returnID.error) || (!!returnID && !!returnID.value && returnID.value === "")) {
561                             $("#loadingHistorySpinnerWrapper").hide();
562                             $(".caroufredsel_wrapper").hide();
563                             $("#noPairedDevice").show();
564                         } else {
565                             $("#noPairedDevice").hide();
566                             $("#loadingHistorySpinnerWrapper").show();
567                             $(".caroufredsel_wrapper").show();
568                         }
569                     });
570                     /* initialize contacts and call history, if not accept phone call from another widget */
571                     if (acceptPhoneCallFromOtherWidget !== true) {
572                         window.setTimeout(function() {
573                             Phone.loadContacts(function(err) {
574                                 if (!err) {
575                                     ContactsLibrary.init();
576                                     Phone.loadCallHistory(function(err) {
577                                         if (!err) {
578                                             $("#loadingHistorySpinnerWrapper").hide();
579                                             callHistoryCarousel.loadCallHistory(Phone.callHistory(), 0);
580                                         }
581                                     });
582                                 }
583                             });
584
585                         }, 2000);
586                     }
587                     /* add listener to change contacts list  */
588                     tizen.phone.addContactsChangedListener(function() {
589                         if (acceptPhoneCallFromOtherWidget !== true) {
590                             window.setTimeout(function() {
591                                 Phone.loadContacts(function(err) {
592                                     if (!err) {
593                                         ContactsLibrary.init();
594                                     }
595                                 });
596                             }, 1000);
597                         }
598                     });
599                     /* add listener to change call history  */
600                     tizen.phone.addCallHistoryChangedListener(function() {
601                         $("#loadingHistorySpinnerWrapper").show();
602                         if (acceptPhoneCallFromOtherWidget !== true) {
603                             window.setTimeout(function() {
604                                 Phone.loadCallHistory(function(err) {
605                                     if (!err) {
606                                         $("#loadingHistorySpinnerWrapper").hide();
607                                         callHistoryCarousel.loadCallHistory(Phone.callHistory(), 0);
608
609                                     }
610                                 });
611                             }, 1000);
612                         }
613
614                     });
615                 }
616
617                 $("#contactsLibraryButton").bind('click', function() {
618
619                     ContactsLibrary.show();
620
621                 });
622
623                 $(".numbersBox").delegate("#numberButton", "click", function() {
624                     var pressTime = new Date(),
625                         number, oneCharPX = 32;
626                     if (keyboard.intervalExpired(pressTime)) {
627                         number = telInput.attr("value") + $(this).data("id");
628                         telInput.attr("value", number);
629                         $('#inputPhoneNumber').scrollLeft(number.length * oneCharPX);
630                         keyboard.pressedKey = $(this).data("id").toString();
631
632                     } else {
633                         if (keyboard.pressedKey === "-1" || keyboard.pressedKey !== $(this).data("id").toString()) {
634                             number = telInput.attr("value") + $(this).data("id");
635                             telInput.attr("value", number);
636                             $('#inputPhoneNumber').scrollLeft(number.length * oneCharPX);
637                             keyboard.pressedKey = $(this).data("id").toString();
638                         } else {
639                             var phoneNumText = telInput.attr("value");
640                             if (keyboard.pressedKey === $(this).data("id").toString() && keyboard.selectedInput !== null && keyboard.selectedInput.values.length === 1) {
641                                 number = telInput.attr("value") + $(this).data("id");
642                                 telInput.attr("value", number);
643                                 $('#inputPhoneNumber').scrollLeft(number.length * oneCharPX);
644                             } else {
645                                 var numToUpdate = phoneNumText.slice(0, phoneNumText.length - 1);
646                                 numToUpdate += keyboard.nextKey();
647                                 telInput.attr("value", numToUpdate);
648
649                             }
650                         }
651                     }
652                     keyboard.selectInput();
653                     keyboard.startTimer();
654                     return false;
655                 });
656
657                 $(".inputPhoneNumberBox").delegate("#deleteButton", "click", function() {
658                     var number = telInput.attr("value");
659                     number = number.slice(0, number.length - 1);
660                     telInput.attr("value", number);
661                     return false;
662                 });
663
664                 $('#callButton').bind('click', function() {
665                     var phoneNumber = $("#inputPhoneNumber").val();
666                     if ($("#callBox").hasClass("callBoxShow")) {
667                         disconnectCall();
668                     } else if (phoneNumber !== "") {
669                         var contact = Phone.getContactByPhoneNumber(phoneNumber);
670                         if (contact === null) {
671
672                             contact = {
673                                 phoneNumbers: [{
674                                     number: phoneNumber
675                                 }]
676                             };
677
678                         }
679                         acceptCall(contact);
680                     }
681                 });
682                 $('.muteButton').bind('click', function() {
683                     muteCall();
684                 });
685                 if (tizen.phone) {
686                     /* add listener to change call history entry, because if call is ended tizen.phone give back only last history object */
687                     tizen.phone.addCallHistoryEntryAddedListener(function(contact) {
688                         if (acceptPhoneCallFromOtherWidget !== true) {
689
690
691                             var tmpCallHistory = Phone.callHistory();
692                             var tmpContact = [];
693                             tmpContact.push(contact);
694                             tmpContact = Phone.formatCallHistory(tmpContact);
695                             tmpCallHistory.unshift(tmpContact[0]);
696                             Phone.callHistory(tmpCallHistory);
697
698                             callHistoryCarousel.loadCallHistory(Phone.callHistory(), 0);
699
700                         }
701                     });
702                     /* add listener to change call state */
703                     tizen.phone.addCallChangedListener(function(result) {
704                         var contact;
705                         if ( !! result.contact.name) {
706                             contact = result.contact;
707                         } else {
708                             contact = {
709                                 phoneNumbers: [{
710                                     /* jshint camelcase: false */
711                                     number: tizen.phone.activeCall.line_id
712                                     /* jshint camelcase: true */
713                                 }]
714
715                             };
716                         }
717
718                         console.log("result.state " + result.state);
719
720                         switch (result.state.toLowerCase()) {
721                             case "DISCONNECTED".toLowerCase():
722
723                                 disconnectCall(contact);
724
725                                 if (acceptPhoneCallFromOtherWidget === true) {
726
727                                     window.setTimeout(function() {
728                                         if (typeof tizen !== "undefined") {
729                                             tizen.application.getCurrentApplication().exit();
730                                         }
731                                     }, 1000);
732                                 }
733
734                                 Configuration.set("acceptedCall", "false");
735
736                                 break;
737                             case "ACTIVE".toLowerCase():
738                                 if (Configuration._values.acceptedCall !== "true") {
739                                     /* global self */
740                                     self.incomingCall.acceptIncommingCall();
741                                     CallDuration.startWatch();
742                                     console.log("phone active");
743                                     Configuration.set("acceptedCall", "true");
744                                 }
745                                 break;
746                             case "DIALING".toLowerCase():
747                                 acceptCall(contact);
748                                 break;
749                         }
750                     });
751                 }
752
753             if (typeof(Speech) !== 'undefined') {
754                 /* add listener to voice recognition */
755                 Speech.addVoiceRecognitionListener({
756                     oncall: function() {
757                         if (ContactsLibrary.currentSelectedContact !== "" && $('#library').library("isVisible")) {
758                             acceptCall(ContactsLibrary.currentSelectedContact);
759                         }
760                     }
761                 });
762             } else {
763                 console.warn("Speech API is not available.");
764             }
765
766             });
767         }, 0);
768
769     });
770
771 /**
772  * Class which provides call contact carousel.
773  *
774  * @method callContactCarousel
775  * @param contact {Object} Contact object.
776  * @for Phone
777  *
778  */
779
780 function callContactCarousel(contact) {
781     "use strict";
782
783     acceptCall(contact);
784 }
785
786 /**
787  * Class which provides call by contact ID.
788  *
789  * @method callContactById
790  * @param contactId {String} Contact id.
791  * @for Phone
792  */
793 function callContactById(contactId) {
794     "use strict";
795     $("#contactDetailMobile").addClass("fontColorSelected ");
796     if (contactId !== "" && typeof contactId !== undefined) {
797
798         var contactObject = Phone.getContactById(contactId);
799         if ( !! contactObject) {
800             window.setTimeout(function() {
801                 acceptCall(contactObject);
802                 $("#contactDetailMobile").removeClass("fontColorSelected ");
803             }, 500);
804         } else {
805             console.log("contact not found");
806             $("#contactDetailMobile").removeClass("fontColorSelected ");
807         }
808     }
809 }