PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/disruptive/js/jquery.callme.js

https://github.com/MichaelMackus/Disruptive-Talk
JavaScript | 231 lines | 194 code | 33 blank | 4 comment | 16 complexity | 4f43b3cc1d20abd7af7a9b3a7af4d843 MD5 | raw file
  1. (function( $ ){
  2. $.fn.callme = function( options ) {
  3. var thisPhone = this, dispatcher = $({}), callMeOptions = {}, phono, call;
  4. var settings = {
  5. apikey : "",
  6. dialpad: true,
  7. togglemic: true,
  8. slideopen: true,
  9. buttontext: "loading...",
  10. buttontextready: "Call me",
  11. numbertodial: "app:9991457008"
  12. };
  13. if(options) {
  14. //lowercase all options passed in
  15. $.each(options, function(k,v){
  16. callMeOptions[k.toLowerCase()] = v;
  17. });
  18. }
  19. return this.each(function(){
  20. if ( options ) {
  21. $.extend( settings, callMeOptions );
  22. }
  23. var phone = buildPhone( settings );
  24. $(this).append(phone);
  25. // event handlers
  26. phone.find(".phono-digit").bind({
  27. mouseenter: function(){
  28. $(this).addClass("ui-state-hover");
  29. },
  30. mouseleave: function(){
  31. $(this).removeClass("ui-state-hover");
  32. },
  33. mousedown: function(){
  34. $(this).addClass("ui-state-active");
  35. },
  36. mouseup: function(){
  37. $(this).removeClass("ui-state-active");
  38. },
  39. click: function(e){
  40. if( call )
  41. call.digit( $(this).attr("title") );
  42. e.preventDefault();
  43. }
  44. });
  45. phone.find(".phono-mic-toggle").bind({
  46. click: function(){
  47. (this.checked)? phono.phone.headset(true): phono.phone.headset(false);
  48. }
  49. });
  50. dispatcher.bind({
  51. // phono is ready, bind events to the call button
  52. phonoReady: function(){
  53. var btn = phone.find("a.phono-phone-button");
  54. btn.bind({
  55. click: function(e){
  56. (call) ? hangUpCall(settings, phone) : makeCall(settings, phone);
  57. e.preventDefault();
  58. }
  59. });
  60. btn.text(settings.buttontextready);
  61. }
  62. });
  63. // initialize phono
  64. phono = $.phono({
  65. apiKey: settings.apikey,
  66. onReady: function(){
  67. dispatcher.trigger("phonoReady");
  68. },
  69. phone: {
  70. onDisconnect: function(event) {
  71. hangUpCall(settings, phone);
  72. }
  73. }
  74. });
  75. });
  76. function buildPhone( settings ){
  77. var phoneHldr = $( "<div/>")
  78. .addClass("phono-hldr ui-widget ui-corner-all");
  79. var phoneContent = $("<div/>")
  80. .addClass("ui-widget-content ui-corner-all")
  81. .css("padding","2px")
  82. .appendTo(phoneHldr);
  83. var statusLink = $("<a>")
  84. .attr("href","#")
  85. .addClass("phono-phone-button ui-widget-header ui-corner-all")
  86. .css({
  87. "text-align":"center",
  88. "display":"block",
  89. "padding":"8px 10px",
  90. "text-decoration":"none"
  91. })
  92. .html(settings.buttontext)
  93. .appendTo(phoneContent);
  94. if ( settings.togglemic ){
  95. var micToggle = $("<div/>")
  96. .addClass("phono-mic-toggle-hldr")
  97. .css({
  98. "margin":"5px 0",
  99. "font-size":"75%",
  100. "text-align":"center"
  101. })
  102. .html("<input class='phono-mic-toggle' type='checkbox'/> Wearing a headset?")
  103. .appendTo(phoneContent);
  104. if(settings.slideopen)
  105. micToggle.css("display","none");
  106. }
  107. if( settings.dialpad ){
  108. var digitTblHldr = $("<div/>")
  109. .addClass("phono-digit-hldr")
  110. .appendTo(phoneContent);
  111. if(settings.slideopen)
  112. digitTblHldr.css("display","none");
  113. var digitTbl = $( "<table/>" )
  114. .addClass( "phono-digits-tbl" )
  115. .css({
  116. "width": "100%"
  117. })
  118. .appendTo( digitTblHldr );
  119. var digits = [
  120. {key:"1", value:"&nbsp;"},
  121. {key:"2", value:"ABC"},
  122. {key:"3", value:"DEF"},
  123. {key:"4", value:"GHI"},
  124. {key:"5", value:"JKL"},
  125. {key:"6", value:"MNO"},
  126. {key:"7", value:"PQRS"},
  127. {key:"8", value:"TUV"},
  128. {key:"9", value:"WXYZ"},
  129. {key:"*", value:"&nbsp;"},
  130. {key:"0", value:"+"},
  131. {key:"#", value:"&nbsp;"}
  132. ];
  133. var tblRows = $("<tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr>")
  134. .appendTo(digitTbl);
  135. $.each(tblRows.find("td"), function( i, el ) {
  136. var digitObj = digits[i];
  137. $(el).css({
  138. "padding":"1px",
  139. "vertical-align":"top",
  140. "width":"33%"
  141. });
  142. var digit = $( "<a/> ")
  143. .addClass( "phono-digit ui-state-default ui-corner-all" )
  144. .attr("title", digitObj.key)
  145. .attr("href","#")
  146. .css({
  147. "padding":"3px",
  148. "display":"block",
  149. "text-align":"center",
  150. "text-decoration":"none",
  151. "font-size":"90%"
  152. })
  153. .html( digitObj.key )
  154. .appendTo( el );
  155. var digitText = $("<span>")
  156. .css({
  157. "display":"block",
  158. "font-size":"60%"
  159. })
  160. .html(digitObj.value)
  161. .appendTo(digit);
  162. });
  163. }
  164. return phoneHldr;
  165. }
  166. function makeCall(settings, phone){
  167. phoneBtn = phone.find(".phono-phone-button");
  168. phoneBtn.text("Calling...");
  169. if( settings.togglemic && settings.slideopen )
  170. phone.find(".phono-mic-toggle-hldr").slideDown();
  171. if( settings.dialpad && settings.slideopen )
  172. phone.find(".phono-digit-hldr").slideDown();
  173. call = phono.phone.dial(settings.numbertodial, {
  174. tones: true,
  175. onAnswer: function(event) {
  176. phoneBtn.text("Hangup");
  177. },
  178. onHangup: function() {
  179. hangUpCall(settings, phone);
  180. },
  181. onDisconnect: function() {
  182. hangUpCall(settings, phone);
  183. }
  184. });
  185. }
  186. function hangUpCall(settings, phone){
  187. if(call){
  188. call.hangup();
  189. call = null;
  190. }
  191. phone.find(".phono-phone-button").text(settings.buttontextready);
  192. if( settings.togglemic && settings.slideopen )
  193. phone.find(".phono-mic-toggle-hldr").slideUp();
  194. if( settings.dialpad && settings.slideopen )
  195. phone.find(".phono-digit-hldr").slideUp();
  196. }
  197. };
  198. })( jQuery );