Adding smoother transitions between events
[profile/ivi/webdialer.git] / js / dialer.js
1 /*
2  * Copyright (c) 2012, Intel Corporation.
3  *
4  * This program is licensed under the terms and conditions of the 
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9
10 var mainCanvas, bgCanvas, buttonCanvas,callCanvas;
11 var mainCtx, bgCtx, buttonCtx, mouseCtx, callCtx;
12 var drawn = false;
13 var screenHeight;
14 var screenWidth;
15 var images = [];
16 var objects = [];
17 var mouseDrag = false, mouseDown = false;
18 var prevXMouse, prevYMouse;
19 var clicksDisabled = true;
20
21 var mainPageTitleTemplate = {"font" : "bold 40pt Arial", "lineWidth" : 2.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "center",  
22     "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 32, "shadowColor" : "rgba(0, 0, 110, 1.0)"};       
23
24 var mainPageButtonTemplate = {"font" : "bold 20pt Arial", "lineWidth" : 1.5, "strokeStyle" : "white", "textAlign" : "center", "textBaseline" : "middle", 
25     "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 10, "shadowColor" : "black"};      
26
27 var buttonTextTemplate = {"font" : "bold 30pt Arial", "fillStyle" : "white", "textAlign" : "center", "textBaseline" : "middle",
28     "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 12, "shadowColor" : "rgba(50, 50, 50, 1.0)"};
29
30 var mainPage = new MenuObject({"name" : "main", "xLoc" : 0, "yLoc" : 0, "visible" : true});
31 var callPage = new MenuObject({"name" : "incomingCall", "xLoc" : 0, "yLoc" : 0, "visible" : true});
32
33 var currentPage = mainPage;
34 var currentNumber = " ";
35 var currentState = "idle";
36
37 var activeCall = null;
38 var activeService = null;
39 var noModems = false;
40 var selectedObj;
41
42 function onMouseDown(event) 
43 {       
44     if (!clicksDisabled)
45     {
46         selectedObj = objectsAtLocation(currentPage, event.clientX, event.clientY);             
47
48         if (selectedObj && selectedObj.onClick)
49             selectedObj.onClick(event);
50
51         prevXMouse = event.clientX;
52         prevYMouse = event.clientY;
53     }
54 }
55
56 function onMouseUp(event) 
57 {       
58     if (selectedObj && selectedObj.onRelease)
59         selectedObj.onRelease(event);
60 }
61
62 function resizeCanvas() 
63 {   
64     screenWidth = $(window).width();
65     screenHeight = $(window).height();
66
67     $(mainCanvas).attr('width', screenWidth);
68     $(mainCanvas).attr('height', screenHeight);
69     $(bgCanvas).attr('width', screenWidth);
70     $(bgCanvas).attr('height', screenHeight);
71     $(buttonCanvas).attr('width', screenWidth);
72     $(buttonCanvas).attr('height', screenHeight);
73     $(mouseClicksLayer).attr('width', screenWidth);
74     $(mouseClicksLayer).attr('height', screenHeight);
75     $(callCanvas).attr('width', screenWidth);
76     $(callCanvas).attr('height', screenHeight);
77
78     if (currentPage)
79         initPages();   
80 }
81
82 function loadImages(sources, callback)
83 {
84     var loadedImages = 0;
85     var numImages = 0;
86
87     for (var src in sources) 
88     {
89         numImages++;
90     }
91     for (var src in sources) 
92     {
93         images[src] = new Image();
94         images[src].onload = function(){
95             if (++loadedImages >= numImages) {          
96                 callback(images);
97             }
98         };
99         images[src].src = sources[src];
100     }
101 }
102
103 function init() 
104 {   
105     document.documentElement.style.overflow = 'hidden';
106     var activeAccount = null;
107     var listener = {
108         "onAccountUpdated": function(account) {}, 
109         "onAccountAdded": function(account) { 
110             if (activeService == null) {
111                 activeAccount = account;
112                 activeService = tizen.call.getCallService(activeAccount.id);
113             }
114
115             noModems = false;
116             initMainPage();
117             switchMenu(mainPage);               
118             clicksDisabled = false;
119
120
121             console.log("Modem available for account: " + activeAccount.id);
122         }, 
123         "onAccountRemoved": function(id) {
124             if (activeAccount && activeAccount.id == id) {
125                 // grab any account available
126                 activeAccount = tizen.account.findServices('')[0];
127                 try {
128                     activeService = tizen.call.getCallService(activeAccount.id);
129                 } catch (err) {
130                     noModems = true;
131                     initMainPage();
132                     switchMenu(mainPage);                                   
133                     console.log("No available modems!");
134                 }
135             }
136         }
137     }
138     mainCanvas = document.getElementById("mainCanvas");
139     bgCanvas = document.getElementById("bgCanvas");
140     buttonCanvas = document.getElementById("buttonCanvas");
141     mouseClicksLayer = document.getElementById("mouseClicks");
142     callCanvas = document.getElementById("callCanvas");
143
144     mainCtx = mainCanvas.getContext("2d");
145     bgCtx = bgCanvas.getContext("2d");
146     buttonCtx = buttonCanvas.getContext("2d");
147     mouseCtx = mouseClicksLayer.getContext("2d");
148     callCtx = callCanvas.getContext("2d");
149
150     var sources = {
151 phoneIcon: "images/bluetooth-smartphone.png",
152            callButton: "images/ivi_btn-call.png",
153            callButtonActive: "images/ivi_btn-call-active.png",
154            closeButton: "images/ivi_btn-close.png",
155            deleteButton: "images/ivi_btn-delete.png",
156            deleteButtonActive: "images/ivi_btn-delete-active.png",
157            endCallButton: "images/ivi_btn-endcall.png",
158            endCallButtonActive: "images/ivi_btn-endcall-active.png",
159            incomingAcceptButton: "images/ivi_btn-incomingcall-accept.png",
160            incomingAcceptButtonActive: "images/ivi_btn-incomingcall-accept-active.png",
161            incomingDeclineButton: "images/ivi_btn-incomingcall-decline.png",
162            incomingDeclineButtonActive: "images/ivi_btn-incomingcall-decline-active.png",
163            listItem: "images/ivi_btn-list.png",
164            listItemActive: "images/ivi_btn-list-active.png",
165            numberButton: "images/ivi_btn-numbers.png",
166            numberButtonActive: "images/ivi_btn-numbers-active.png",
167            buttonBG: "images/ivi_buttonarea.png",
168            callIcon: "images/ivi_icon-call.png",
169            deleteIcon: "images/ivi_icon-delete.png",
170            endCallIcon: "images/ivi_icon-endcall.png",
171            deleteListItemIcon: "images/ivi_icon-list-delete.png",
172            deleteListItemIconActive: "images/ivi_icon-list-delete-active.png",
173            clockIcon: "images/ivi_icon-time.png",
174            textArea: "images/ivi_textarea.png",
175            bgImage: "images/ivi-v1_ivi-background.jpg" 
176     };
177
178     loadImages(sources, resizeCanvas);
179
180     resizeCanvas();
181     resizeCanvas();     
182
183     $(window).bind('resize', resizeCanvas);
184
185     mouseClicksLayer.addEventListener('mousedown', onMouseDown);   
186     mouseClicksLayer.addEventListener('mouseup', onMouseUp);
187
188     tizen.account.addAccountListener(listener);
189     setTimeout(function(){
190             if (tizen.account.findServices('').length == 0) 
191             {
192             noModems = true;
193             initMainPage();
194             switchMenu(mainPage);
195             console.log("No available modems!");       
196             }
197             },1000);
198
199     var handler = {
200 onIncoming: function(call) {
201                 activeCall = call;
202                 currentState = "incomingCall";          
203                 initCallPage(currentState);    
204                 updateNumber(call.callData.LineIdentification);
205                 updateCallStateText("Incoming Call...");
206                 animateIncoming();
207                 //switchMenu(callPage);
208             },
209 onDialing: function(call) {
210                activeCall = call;
211            },
212 onAlerting: function(call) {
213                 activeCall = call;
214             },
215 onDisconnected: function(call, disconnectReason) {
216                     if (currentState !== "idle")
217                     {
218                         currentState = "idle";
219                         activeCall = null;
220                         stopTimer();
221                         animateFinished();
222                     }
223                     //switchMenu(mainPage);
224                 },
225 onDisconnecting: function(call) {
226                      if (currentState !== "idle")
227                      {
228                          currentState = "idle";
229                          stopTimer();
230                          animateFinished();
231                      }
232                      //switchMenu(mainPage);
233                  },
234 onAccepted: function(call) {
235                 startTimer();
236                 initButtons("activeCall");            
237                 updateCallStateText("Active");
238                 callPage.drawMenu();
239                 activeCall = call;
240             },
241 onActivated: function(call) {
242                  startTimer();
243                  initButtons("activeCall");            
244                  updateCallStateText("Active");
245                  callPage.drawMenu();
246                  activeCall = call;
247              },
248 onError: function(call){
249              console.log("onError: "); console.log(call);
250          }
251     };
252     tizen.call.addCallHandler(handler);
253 }
254
255 function switchMenu(nextMenu)
256 {   
257     //currentPage.visible = false;              
258     currentPage = nextMenu; 
259     currentPage.visible = true;
260     currentPage.drawMenu();     
261 }
262
263 function initPages()
264 {
265     initMainPage();
266     initCallPage(currentState);
267     // initDisabledPage();
268
269     bgCtx.drawImage(images.bgImage, 0, 0, screenWidth, screenHeight);
270     currentPage.drawMenu();
271 }
272
273 $(document).ready(function () {
274         init();
275         });