source: iaddressbook/asterisk/trunk/iaddressbook_1.0__asterisk.patch

Last change on this file was 7, checked in by guillaume, 8 years ago

iaddressbook - asterisk patch -- first import

. patch for the version 1.0 of iaddressbook
. allow calls from iab (contacts phone numbers or *quickcall* field)

File size: 37.8 KB
  • iaddressbook_1.

    diff -urN iaddressbook_1.0/conf/auth.php iaddressbook_1.0__asterisk/conf/auth.php
    old new  
    3939// $auth['fred']['permissions'] = array( 'check' );
    4040// $auth['fred']['groups']      = array('@editor');
    4141// $auth['fred']['fullname']    = 'Fred the Geek';
    42 // $auth['fred']['email']       = 'fred@geeks.com';
     42// $auth['fred']['email']       = 'fred@geeks.com';
     43// $auth['fred']['extension']    = '101';
    4344
    4445// Admin User
    4546//
     
    6263                                        'cat_select', 'cat_add', 'cat_del', 'cat_del_empty', 'cat_add_contacts', 'cat_del_contacts',
    6364                                        'import_vcard', 'import_folder', 'export_vcard', 'export_vcard_cat', 'export_csv_cat', 'export_ldif_cat',
    6465                                        'login', 'logout', 'reset',
    65                                         'debug', 'check', 'info');
     66                                        'debug', 'check', 'info',
     67                                                                                                                                                                'asterisk_docall');
    6668
    6769$auth['@editor']['permissions'] = array('show', 'img', 'search', 'edit', 'new', 'save', 'delete', 'delete_many', 'select_letter', 'select_offset',
    6870                                        'cat_select', 'cat_add', 'cat_del', 'cat_del_empty', 'cat_add_contacts', 'cat_del_contacts',
    6971                                        'import_vcard', 'import_folder', 'export_vcard', 'export_vcard_cat', 'export_csv_cat', 'export_ldif_cat',
    70                                         'login', 'logout', 'reset');
     72                                        'login', 'logout', 'reset',
     73                                                                                                                                                                'asterisk_docall');
    7174
    7275$auth['@guest']['permissions']  = array('show', 'img', 'search', 'select_letter', 'select_offset',
    7376                                        'cat_select',
     
    7881                                        'xml_search', 'xml_search_email', 'xml_get_contact', 'xml_get_contacts', 'xml_count_contacts',
    7982                                        'xml_set_contact', 'xml_delete_contact',
    8083                                        'xml_import_vcard', 'xml_export_vcard');
    81                                        
    82    
    83 ?>
    84  Pas de fin de ligne à la fin du fichier.
     84?>
  • conf/defaults.php

    diff -urN iaddressbook_1.0/conf/defaults.php iaddressbook_1.0__asterisk/conf/defaults.php
    old new  
    8989// Synchronization
    9090$conf['xmlrpc_enable'] = 0;                  // Enable XMLRPC synchronization (not yet implemented)
    9191
     92// Asterisk Options
     93$conf['asterisk_server']                         = '127.0.0.1';
     94$conf['asterisk_port']                           = 5038;
     95$conf['asterisk_username']               = 'admin';
     96$conf['asterisk_password']               = 'admin';
     97
     98$conf['asterisk_protocol']               = 'SIP';                                       // SIP or IAX
     99$conf['asterisk_context']                        = '';                                          // originate calls context ('default' by default)
     100$conf['asterisk_prefix']                         = '';                                          // set a prefix to all phone numbers
     101
    92102?>
  • functions/actions.php

    Les fichiers binaires iaddressbook_1.0/conf/localhost et iaddressbook_1.0__asterisk/conf/localhost sont différents.
    diff -urN iaddressbook_1.0/functions/actions.php iaddressbook_1.0__asterisk/functions/actions.php
    old new  
    1919require_once(AB_INC.'functions/module_csv.php');
    2020require_once(AB_INC.'functions/module_ldif.php');
    2121require_once(AB_INC.'functions/module_birthday.php');
     22require_once(AB_INC.'functions/module_asterisk.php');
    2223
    2324
    2425/**
     
    3233    global $ID;
    3334    global $lang;
    3435    global $conf;
    35 
     36               
    3637    switch($ACT) {
    3738       
    3839        case 'search':
     
    134135        case 'info':
    135136            html_phpinfo();
    136137            break;
     138
     139                                // originate a call
     140                                case 'asterisk_setextension':
     141                                                asterisk_setextension($_REQUEST['extension']);                                         
     142                                                break;
     143
     144                                case 'asterisk_docall':
     145                                                $ret = asterisk_docall($_REQUEST['caller'], $_REQUEST['recipient']);
     146                                                echo $ret;
     147                                                return;
     148
     149                                                break;
    137150       
    138151        case 'check':
    139152            act_check();
     
    610623}
    611624*/
    612625
    613 ?>
    614  Pas de fin de ligne à la fin du fichier.
     626?>
  • functions/meta.php

    diff -urN iaddressbook_1.0/functions/meta.php iaddressbook_1.0__asterisk/functions/meta.php
    old new  
    5858$meta['ldif_base'] = array('textarea');
    5959$meta['ldif_mozilla'] = array('onoff');
    6060$meta['xmlrpc_enable'] = array('onoff');
     61// asterisk patch
     62$meta['asterisk_server'] = array('string');
     63$meta['asterisk_port'] = array('string');
     64$meta['asterisk_username'] = array('string');
     65$meta['asterisk_password'] = array('string');
     66$meta['asterisk_protocol'] = array('multichoice', '_choices' => array('SIP', 'IAX'));
     67$meta['asterisk_context']       = array('string');
     68$meta['asterisk_prefix'] = array('string');
    6169
    6270
    63 ?>
    64  Pas de fin de ligne à la fin du fichier.
     71?>
  • functions/module_asterisk.php

    diff -urN iaddressbook_1.0/functions/module_asterisk.php iaddressbook_1.0__asterisk/functions/module_asterisk.php
    old new  
     1<?php
     2        /*
     3                iaddressbook::asterisk, add call capability to iaddressbook
     4    Copyright (C) 2009  Guillaume Bour <guillaume@bour.cc>
     5
     6    This program is free software: you can redistribute it and/or modify
     7    it under the terms of the GNU General Public License as published by
     8    the Free Software Foundation, either version 3 of the License, or
     9    (at your option) any later version.
     10
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15
     16    You should have received a copy of the GNU General Public License
     17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     18        */
     19
     20 /**
     21  * retrieve asterisk extension.
     22        * This extension is stored in a cookie
     23  *
     24  * @return asterisk extension
     25        */
     26        function asterisk_getextension()
     27        {
     28                global $conf;
     29                global $userinfo;
     30
     31                if($conf['auth_enabled'])
     32                        { return $userinfo['extension']; }
     33                else
     34                        { return $_COOKIE["asterisk_extension"]; }
     35        }
     36
     37 /**
     38  * set asterisk extension.
     39        * This extension is stored in a cookie
     40  *
     41  * @param extension the user asterisk extension
     42        */
     43        function asterisk_setextension($extension)
     44        { setcookie("asterisk_extension", $extension, time()+315360000); /* 10 years = 3600*24*365*10 */ }
     45
     46 /**
     47  * call an asterisk extension.
     48  * the connexion to the asterisk server is done through AGI
     49  *
     50        * @todo: check caller & recipient arguments
     51        *
     52        * @param caller          the caller extension number
     53  * @param recipient the destination extension
     54        */
     55        function asterisk_docall($caller, $recipient)
     56        {
     57                global $conf;
     58                global $lang;           
     59
     60
     61                // 1. connect to the asterisk server
     62                $sock = @fsockopen($conf['asterisk_server'], $conf['asterisk_port'], $errno, $errstr);
     63    if(!$sock)
     64                {
     65                        // error :: unable to connect asterisk manager
     66                        return '400:' . $lang['call-server-unreach'];
     67                }
     68
     69                // read headers
     70                $str = fgets($sock);
     71
     72                // 2. login
     73                $res = _asterisk_send_request(
     74                        $sock,
     75                        'login',
     76                        array('Username' => $conf['asterisk_username'],
     77                                                'Secret' => $conf['asterisk_password'],
     78                                                'Events' => 'off')
     79                );
     80    if($res['Response'] != 'Success')
     81    {
     82                        // error :: auth failed
     83                        return '400:' . $lang['call-app-unauth'] . $res['Data'];
     84                }
     85
     86                // 3. calling recipient
     87                if(strlen($conf['asterisk_prefix']) > 0)
     88                { $recipient = $conf['asterisk_prefix'] . $recipient; }
     89
     90                $params = array(
     91                        'Channel'               => $conf['asterisk_protocol'] . '/' . $caller,
     92                        'Exten'                 => $recipient,
     93                        'Priority'      => '1'
     94                );
     95
     96                if(strlen($conf['asterisk_context']) > 0)
     97                { $params['Context'] = $conf['asterisk_context']; }
     98
     99                $res = _asterisk_send_request($sock, 'Originate', $params);
     100                if($res['Response'] != 'Success')
     101                {
     102                        switch($res['Message']) {
     103                                case 'Permission denied':
     104                                        return '400:' . $lang['call-app-unauth'];
     105
     106                                case 'Originate failed':
     107                                        // asterisk error or you hangup call
     108                                        return '400:' . $lang['call-failed'];
     109
     110                                default:
     111                                        $error = $res['Message'];
     112                                        return '400:' . $lang['call-unknown-err'];
     113                        }
     114                }
     115
     116                return '200:' . $lang['call-ok'];
     117        }
     118
     119  /**
     120   * Send a request to asterisk server
     121   * get from phpagi code (http://phpagi.sourceforge.net/)
     122         *
     123         * @param string $action
     124         * @param array $parameters
     125         * @return array of parameters
     126         */
     127        function _asterisk_send_request($sock, $action, $parameters=array())
     128        {
     129                $req = "Action: $action\r\n";
     130                foreach($parameters as $var=>$val)
     131                { $req .= "$var: $val\r\n"; }
     132                $req .= "\r\n";
     133
     134                fwrite($sock, $req);
     135                return _asterisk_wait_response($sock);
     136        }
     137
     138  /**
     139   * Wait for a response
     140   * get from phpagi code (http://phpagi.sourceforge.net/)
     141   *
     142   * If a request was just sent, this will return the response.
     143   * Otherwise, it will loop forever, handling events.
     144   *
     145   * @param boolean $allow_timeout if the socket times out, return an empty array
     146   * @return array of parameters, empty on timeout
     147   */
     148        function _asterisk_wait_response($sock, $allow_timeout=false)
     149        {
     150                $timeout = false;
     151                do {
     152                        $type = NULL;
     153                        $parameters = array();
     154
     155                        $buffer = trim(fgets($sock, 4096));
     156                        while($buffer != '') {
     157                                $a = strpos($buffer, ':');
     158
     159                                if($a) {
     160                                        if(!count($parameters)) { // first line in a response ?
     161                                                $type = strtolower(substr($buffer, 0, $a));
     162                                                if(substr($buffer, $a + 2) == 'Follows') {
     163                                                        // A follows response means there is a miltiline field that follows.
     164                                                        $parameters['data'] = '';
     165                                                        $buff = fgets($this->socket, 4096);
     166                                                        while(substr($buff, 0, 6) != '--END ') {
     167                                                                $parameters['data'] .= $buff;
     168                                                                $buff = fgets($this->socket, 4096);
     169                                                        }
     170                                                }
     171                                        }
     172
     173                                        // store parameter in $parameters
     174                                        $parameters[substr($buffer, 0, $a)] = substr($buffer, $a + 2);
     175                                }
     176
     177                                $buffer = trim(fgets($sock, 4096));
     178                        }
     179
     180                        // process response
     181                        switch($type) {
     182                                case '': // timeout occured
     183                                        $timeout = $allow_timeout;
     184                                        break;
     185                                case 'event':
     186                                        // skip it
     187                                        break;
     188                                case 'response':
     189                                        break;
     190                                default:
     191                                        // Unhandled response packet from Manager
     192                                        break;
     193                        }
     194                } while($type != 'response' && !$timeout);
     195
     196                return $parameters;
     197        }
     198?>
  • functions/module_auth.php

    diff -urN iaddressbook_1.0/functions/module_auth.php iaddressbook_1.0__asterisk/functions/module_auth.php
    old new  
    200200 *
    201201 * @param   username
    202202 * @param   action
     203 * @param         print
    203204 * @return  boolean isAllowed
    204205 */
    205 function auth_verify_action($username, $action) {
     206function auth_verify_action($username, $action, $print=true) {
    206207    global $conf;
    207208    global $lang;
    208209    global $auth;
    209210   
    210211    if(!is_array($auth)) {
    211         msg("No authentication array found! Access granted. Does conf/auth.php exist?", -1);
     212                                if($print)
     213        { msg("No authentication array found! Access granted. Does conf/auth.php exist?", -1); }
    212214        return true;
    213215    }
    214216   
     
    222224        }
    223225    }
    224226   
    225     msg($lang['action_not_allowed'] . " ($action)", -1);
     227                if($print)
     228    { msg($lang['action_not_allowed'] . " ($action)", -1); }
    226229   
    227230    return false;
    228231}
     
    235238        $ui['username'] = $username;
    236239        $ui['fullname'] = $auth[$username]['fullname'];
    237240        $ui['email']    = $auth[$username]['email'];
     241        $ui['extension']= $auth[$username]['extension'];
    238242    }
    239243
    240244    return $ui;
     
    268272}
    269273
    270274
    271 ?>
    272  Pas de fin de ligne à la fin du fichier.
     275?>
  • functions/template.php

    diff -urN iaddressbook_1.0/functions/template.php iaddressbook_1.0__asterisk/functions/template.php
    old new  
    149149function tpl_phones($limit = 0) {
    150150    global $ID;
    151151    global $contact;
     152    global $conf;
     153    global $lang;
     154    global $userinfo;
    152155    $color = 1;
    153156    $count = 0;
    154157   
     
    163166function tpl_emails($limit = 0) {
    164167    global $ID;
    165168    global $contact;
     169    global $conf;
     170    global $lang;
    166171    $color = 1;
    167172    $count = 0;
    168173   
     
    177182function tpl_chathandles($limit = 0) {
    178183    global $ID;
    179184    global $contact;
     185    global $conf;
     186    global $lang;
    180187    $color = 1;
    181188    $count = 0;
    182189   
     
    191198function tpl_urls($limit = 0) {
    192199    global $ID;
    193200    global $contact;
     201    global $conf;
     202    global $lang;
    194203    $color = 1;
    195204    $count = 0;
    196205   
     
    205214function tpl_relatednames($limit = 0) {
    206215    global $ID;
    207216    global $contact;
     217    global $conf;
     218    global $lang;
    208219    $color = 1;
    209220    $count = 0;
    210221   
     
    218229
    219230function tpl_label($string) {
    220231    global $lang;
    221     
     232   
    222233    if(strtoupper($string) == 'WORK') return $lang['label_work'];
    223234    if(strtoupper($string) == 'HOME') return $lang['label_home'];
    224235
  • lang/en/lang.php

    diff -urN iaddressbook_1.0/lang/en/lang.php iaddressbook_1.0__asterisk/lang/en/lang.php
    old new  
    340340                                    conf/config.php and the database.
    341341                                    <p style="text-align: right;">&#8212; Clemens Wacha</p>';
    342342   
     343// iaddressbook :: asterisk
     344$lang['extension']                                                       = 'Extension';
     345$lang['extension-change']                                = 'Click to set/change extension';
     346$lang['no-extension']                                            = '[not set]';
     347$lang['clicktocall']                                             = 'Click to call';
     348$lang['quickcall-title']                                 = 'enter phone number then press [enter] key';
     349$lang['quickcall-motto']                                 = 'enter phone n°...';
     350$lang['call-ok']                                                                 = 'Call originate';
     351$lang['call-server-unreach']             = 'Phone switchboard is unreacheable';
     352$lang['call-app-unauth']                                 = 'This application is not authorized to originate calls';
     353$lang['call-failed']                                             = 'Invalid extension or you did not pickup your phone';
     354$lang['call-unknown-err']                                = 'Call failed (error= $error)';
     355$lang['call-user-unauth']                                = 'You are not authorized to originate calls';
     356$lang['invalid-number']                                  = 'Phone number is incorrect';
     357
     358$lang['asterisk_server']                                 = 'Asterisk server';
     359$lang['asterisk_server_help']    = 'Must be an IP or a DNS';
     360$lang['asterisk_port']                                   = 'Asterisk manager port';
     361$lang['asterisk_port_help']                      = 'Manager port';
     362$lang['asterisk_username']                       = 'Asterisk manager username';
     363$lang['asterisk_username_help']  = 'Manager username';
     364$lang['asterisk_password']                       = 'Asterisk manager password';
     365$lang['asterisk_password_help']  = 'Manager password';
     366$lang['asterisk_protocol']                       = 'Extensions VoIP protocol';
     367$lang['asterisk_protocol_help']  = 'Used by iAddressbook users phone';
     368$lang['asterisk_context']                                = 'Asterisk calls context';
     369$lang['asterisk_context_help']   = 'extension.conf context for calling recipients (leave empty for using
     370                                                                                                                                                asterisk default context)';
     371$lang['asterisk_prefix']                                 = 'Prefix number';
     372$lang['asterisk_prefix_help']            = 'Always prepend to called numbers';
    343373
    344374?>
  • lang/fr/lang.php

    diff -urN iaddressbook_1.0/lang/fr/lang.php iaddressbook_1.0__asterisk/lang/fr/lang.php
    old new  
    106106$lang['month']['11']                    = 'novembre';
    107107$lang['month']['12']                    = 'decembre';
    108108
     109// iaddressbook :: asterisk
     110$lang['extension']                                                       = 'Extension';
     111$lang['extension-change']                                = 'Cliquez pour définir/changer l\'extension';
     112$lang['no-extension']                                            = '[non défini]';
     113$lang['clicktocall']                                             = 'Cliquez pour appeler';
     114$lang['quickcall-title']                                 = 'saisissez le numéro de téléphone et appuyez sur [entrée]';
     115$lang['quickcall-motto']                                 = 'entrez un n° de tel';
     116$lang['call-ok']                                                                 = 'Appel en cours...';
     117$lang['call-server-unreach']             = 'Votre standard téléphonique n\'est pas joignable';
     118$lang['call-app-unauth']                                 = 'Cette application n\'est pas autorisée à effectuer des appels';
     119$lang['call-failed']                                             = 'Numéro d\'extension incorrect, ou vous n\'avez pas décroché votre combiné';
     120$lang['call-unknown-err']                                = 'L\'appel a échoué (erreur= $error)';
     121$lang['call-user-unauth']                                = 'Vous n\'êtes pas autorisé à appeler';
     122$lang['invalid-number']                                  = 'Le numéro de téléphone est incorrect';
    109123
    110124?>
  • README.asterisk.txt

    diff -urN iaddressbook_1.0/README.asterisk.txt iaddressbook_1.0__asterisk/README.asterisk.txt
    old new  
     1                                                                                -:| PHP iAddressbook asterisk patch |:-
     2
     3
     41) What is it
     5«asterisk patch» allow call origination from iaddressbook using an asterisk server.
     6Using this patch, you can either make a call from contacts numbers, or using
     7*quickcall* field.
     8
     92) Requirements
     10        . a operational asterisk service (can be hosted on the same/another server),
     11                with manager enabled
     12        . at least a shoft/hard phone associated with an extension number
     13        . a javascript-enabled browser (see compatibility list below)
     14
     153) Install
     16        . patch PHP iaddressbook using the patchset
     17        . untar images archive (iaddressbook_1.0__asterisk_images.tar.gz)
     18        . configure iaddressbook asterisk part (file conf/defaults.php)
     19                        asterisk_server                         : ip address/url of your asterisk server
     20                                                                                                                        (default= localhost)
     21                        asterisk_port                                   : asterisk manager port  (default= 5038)
     22                        asterisk_username                       : asterisk manager user  (default= admin)
     23                        asterisk_password                       : manager user password  (default= admin)
     24
     25                        asterisk_protocol                       : protocol used to call recipients (default= SIP)
     26                        asterisk_context                        : extension context for calls originate
     27                                                                                                                        (default empty == use asterisk default context)
     28                        asterisk_prefix                         : number to prepend called recipients with
     29                                                                                                                        (default= none)
     30
     31                NOTE: it is recommended to write your local configuration in
     32                                  conf/config.php
     33
     34        . allow manager access in asterisk configuration
     35                (see /etc/asterisk/manager.conf)
     36                NOTE: in asterisk v1.6, you must add the 'originate' right (read/write)
     37
     38
     394) Use
     40        a. "authentification disabled" mode (configuration key *auth_enabled* == 0)
     41                 each iaddressbook user must define his extension number in iaddressbook
     42                 (right-top of the screen).
     43                 value is stored in a cookie, so if you change computer or browser,
     44                 you must reentered your extension.
     45
     46                 You can made a call by entering recipient number in the quickcall field
     47                         then pressing enter key
     48                 Or you can click on contact phone numbers
     49
     50  b. "authentification enabled" mode
     51           this patch introduce a new user value and a new acl right
     52
     53                 user value:
     54                                . 'extension' = the user phone extension (see fred sample)
     55
     56                 acl right :
     57                                . 'asterisk_docall' = group members are allowed to originate calls
     58                                (set for @admin and @editor groups by default)
     59
     60
     61                 Once a user is logged, and if it own the *asterisk_docall* right, he can
     62                 originate calls as described for the 'auth disabled' mode.
     63
     64
     65NOTE: you don't see *quickcall* field and clickable phone numbers until
     66        extension number is set
     67
     685) Valid phones numbers format
     69        your phones numbers can contains dots, parenthesis, minus, plus, and spaces
     70        i.e: (555) +47 456.553
     71
     726) Compatibility
     73        . This patch as been developped for the iAddressbook 1.0 version.
     74        . It as been tested with following browsers:
     75                        - firefox (3.0.14),
     76                        - opera (10.0),
     77                        - konqueror (4.3.2)
     78
     79                Please report if you test it with another browser (succesfully or not)
     80
     81
     82
     83                                                                                                                                                                                Guillaume Bour <guillaume@bour.cc>
     84                                                                                                                                                                                2009/10
  • tpl/default/asterisk/asterisk.css

    diff -urN iaddressbook_1.0/tpl/default/asterisk/asterisk.css iaddressbook_1.0__asterisk/tpl/default/asterisk/asterisk.css
    old new  
     1/*
     2                iaddressbook::asterisk, add call capability to iaddressbook
     3    Copyright (C) 2009  Guillaume Bour <guillaume@bour.cc>
     4
     5    This program is free software: you can redistribute it and/or modify
     6    it under the terms of the GNU General Public License as published by
     7    the Free Software Foundation, either version 3 of the License, or
     8    (at your option) any later version.
     9
     10    This program is distributed in the hope that it will be useful,
     11    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17*/
     18
     19div#asterisk-set {
     20    color: #bebebe;
     21    font-size: 85%;
     22    font-weight: normal;
     23    font-style: normal;
     24    text-align: right;
     25    padding: 0;
     26    margin: 0;
     27}
     28
     29div.offcall:after {
     30        content: url('smallphone_r.png');
     31        position: relative;
     32        display: inline;
     33        top: 2px;
     34}
     35
     36div.oncall:after {
     37        content: url('loading_m.gif');
     38        position: relative;
     39        display: inline;
     40        top: 3px;
     41}
     42
  • tpl/default/asterisk/asterisk.js

    diff -urN iaddressbook_1.0/tpl/default/asterisk/asterisk.js iaddressbook_1.0__asterisk/tpl/default/asterisk/asterisk.js
    old new  
     1/*
     2                iadressbook::asterisk, add call capability to iaddressbook
     3    Copyright (C) 2009  Guillaume Bour
     4
     5    This program is free software: you can redistribute it and/or modify
     6    it under the terms of the GNU General Public License as published by
     7    the Free Software Foundation, either version 3 of the License, or
     8    (at your option) any later version.
     9
     10    This program is distributed in the hope that it will be useful,
     11    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17*/
     18
     19// astman is a singleton
     20if (!astman)      var astman    = {};
     21
     22astman.extension = undefined;
     23astman.init = function(basedir, extension, root, qk, i18n)
     24{
     25        this.basedir                    = basedir;
     26        this.extension          = extension;
     27        this.root                               = document.getElementById(root);
     28        this.qk                                         = document.getElementById(qk);
     29
     30        this.i18n                                       = i18n;
     31}
     32
     33/*
     34        auth disabled mode.
     35        When extension is changed
     36*/
     37astman.onChangeExtension = function ()
     38{
     39        _exten = document.getElementById('exten').value;
     40        if(!_exten)
     41        { this.changeExtensionDisplay('view'); return; }
     42
     43        req = new xmlhttp(
     44                function(req) {
     45                        if(req.readyState == 4 && req.status == 200) {
     46                                //!! 'this' is not visible in this context
     47                                astman.extension = _exten;
     48                                astman.changeExtensionDisplay('view');
     49                        }
     50                }
     51        );
     52
     53        req.get('?do=asterisk_setextension&extension=' + _exten);
     54}
     55
     56/*
     57        auth disabled mode.
     58        Update extension display (editable <> non editable)
     59*/
     60astman.changeExtensionDisplay = function (mode)
     61{
     62        switch(mode) {
     63                case 'edit':
     64                        this.root.innerHTML = 'Extension: ' +
     65                                '<form onsubmit="astman.onChangeExtension(); return(false);">' +
     66                                        '<input type="text" id="exten" size="6" onblur="astman.onChangeExtension()">' +
     67                                '</form>';
     68                        document.getElementById('exten').focus();
     69                        break;
     70
     71                case 'view':
     72                default:
     73                        this.root.innerHTML = 'Extension: ' +
     74                                '<a href="#" onclick="astman.changeExtensionDisplay(\'edit\')"' +
     75                                         'title="click to set/change extension">' +
     76                                 (this.extension?this.extension:this.i18n.noextension) +
     77                                '</a>';
     78
     79                        this.qk.className = this.extension?'visible':'hidden';
     80        }       
     81}
     82
     83/** quickcal :: initiate a call from value entered in quickcall input field */
     84astman.quickCall = function(inputfld, clearfld)
     85{
     86        input   = document.getElementById(inputfld),
     87        number  = input.value.replace(/[\s.()+-]/g, "");
     88        //alert(input.value + ':' + number + ',' + this.extension);
     89
     90        if(!new RegExp(/^\d+$/).test(number))
     91        { alert(this.i18n.invalidnumber); return; }
     92
     93        clear           = document.getElementById(clearfld);
     94        clear.style.background = "white url('" + this.basedir + "srch_r_load.gif') no-repeat top left";
     95
     96        req = new xmlhttp(
     97                function(_req) {
     98                        if(_req.readyState == 4 && _req.status == 200) {
     99                                //alert(req.responseText); return;
     100                                ret = _req.responseText.split(':');
     101
     102                                switch(ret[0]) {
     103                                        case '200':
     104                                                astman.doQkClear(input, clear);
     105                                                break;
     106                                        case '400':
     107                                                clear.style.background = "white url('" + astman.basedir + "srch_r_f2.gif') no-repeat top left";         
     108                                                break;
     109                       
     110                                        default:
     111                                                clear.style.background = "white url('" + astman.basedir + "srch_r_f2.gif') no-repeat top left";         
     112                                                ret = new Array(0, astman.i18n.usernoauth);
     113                                }
     114
     115                                alert(ret[1]);
     116                        }
     117                }
     118        );
     119
     120        req.get('?do=asterisk_docall&caller=' + this.extension + '&recipient=' + number);
     121}
     122
     123/** quickcall :: reset button */
     124/* show reset button when text entered in inputfield */
     125astman.initQkClear = function(inputfld, clearfld)
     126{
     127        // check whether to show delete button
     128        input = document.getElementById(inputfld);
     129        btn = document.getElementById(clearfld);
     130
     131        if(input.value.length > 0 && !this.cleardone) {
     132                btn.style.background = "white url('" + this.basedir + "srch_r_f2.gif') no-repeat top left";
     133
     134                _local = this;
     135                btn.onclick = function() { _local.doQkClear(input, btn); }
     136                this.cleardone = true;
     137        }
     138}
     139
     140/* on reset button click, empty quickcall inputfield */
     141astman.doQkClear = function(input, btn)
     142{
     143        input.value                              = '';
     144
     145        btn.style.background = "white url('" + _local.basedir + "srch_r.gif') no-repeat top left";
     146
     147        this.cleardone = false;
     148        input.focus();
     149}
     150
     151/** quickcall :: motto */
     152/* when inputfield gain focus, we clear the motto */
     153astman.doClear = function(inputfld)
     154{
     155        input = document.getElementById(inputfld);
     156        input.value = ''
     157        input.style.color = 'black';
     158
     159        input.onfocus = undefined;
     160}
     161
     162/* when inputfield lost focus and is empty, when re-set the motto */
     163astman.doMotto = function(inputfld)
     164{
     165        input = document.getElementById(inputfld);
     166        if(input.value.length > 0)
     167        { return; }
     168
     169        input.value = 'enter phone n°...';
     170        input.style.color = '#C8C8C8';
     171
     172        input.onfocus                    = function() { astman.doClear(inputfld); }
     173}
     174
     175astman.doCall = function(atag)
     176{
     177        number  = atag.firstChild.nodeValue.replace(/[\s.()+-]/g, "");
     178
     179        if(!new RegExp(/^\d+$/).test(number))
     180        { alert(this.i18n.invalidnumber); return; }
     181
     182        atag.parentNode.className = 'person_text oncall';
     183
     184        req = new xmlhttp(
     185                function(_req) {
     186                        if(_req.readyState == 4 && _req.status == 200) {
     187                                //alert(req.responseText); return;
     188                                ret = _req.responseText.split(':');
     189                                atag.parentNode.className = 'person_text offcall';
     190
     191                                switch(ret[0]) {
     192                                        case '200':
     193                                        case '400':
     194                                                break;
     195                       
     196                                        default:
     197                                                ret = new Array(0, astman.i18n.usernoauth);
     198                                }
     199
     200                                alert(ret[1]);
     201                        }
     202                }
     203        );
     204
     205        req.get('?do=asterisk_docall&caller=' + this.extension + '&recipient=' + number);
     206}
     207
     208
  • tpl/default/asterisk/asterisk.tpl

    diff -urN iaddressbook_1.0/tpl/default/asterisk/asterisk.tpl iaddressbook_1.0__asterisk/tpl/default/asterisk/asterisk.tpl
    old new  
     1<?php
     2        /*
     3                iaddressbook::asterisk, add call capability to iaddressbook
     4    Copyright (C) 2009  Guillaume Bour <guillaume@bour.cc>
     5
     6    This program is free software: you can redistribute it and/or modify
     7    it under the terms of the GNU General Public License as published by
     8    the Free Software Foundation, either version 3 of the License, or
     9    (at your option) any later version.
     10
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15
     16    You should have received a copy of the GNU General Public License
     17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     18*/
     19?>
     20<?php           
     21        $extension = asterisk_getextension();
     22
     23        if(!$conf['auth_enabled']) {
     24?>
     25        <div id='asterisk-set'>
     26                <?= $lang['extension'] ?>:
     27                <a href="#" title="<?= $lang['extension-change']?>"
     28                         onclick="astman.changeExtensionDisplay('edit')">
     29                        <?= $extension?$extension:$lang['no-extension']?>
     30                </a>
     31        </div>
     32<?php
     33 }
     34
     35 if(!$conf['auth_enabled'] ||
     36                auth_verify_action($userinfo['username'], 'asterisk_docall', false))
     37 {             
     38                echo $conf['auth_enabled']?'<br/><br/>':'';
     39?>
     40
     41        <div id="quickcall" class="<?= $extension?'visible':'hidden'?>">
     42                <span class="sbox_l"></span>
     43                <span class="sbox">
     44                        <form onsubmit="astman.quickCall('qk_fld', 'qk_clear'); return false;">
     45                                <input type="text" id="qk_fld" title="<?= $lang['quickcall-title']?>"
     46                                        value="<?= $lang['quickcall-motto']?>" accesskey="f"
     47                                        onkeyup="astman.initQkClear('qk_fld', 'qk_clear')"
     48                                        onfocus="astman.doClear('qk_fld')"
     49                                        onblur ="astman.doMotto('qk_fld')"
     50                                        />
     51                        </form>
     52                </span>
     53                <span class="sbox_r" id="qk_clear"></span>
     54        </div>
     55<?php } ?>
     56
     57
  • tpl/default/asterisk/quickcall.css

    Les fichiers binaires iaddressbook_1.0/tpl/default/asterisk/loading_m.gif et iaddressbook_1.0__asterisk/tpl/default/asterisk/loading_m.gif sont différents.
    diff -urN iaddressbook_1.0/tpl/default/asterisk/quickcall.css iaddressbook_1.0__asterisk/tpl/default/asterisk/quickcall.css
    old new  
     1/*
     2                iaddressbook::asterisk, add call capability to iaddressbook
     3    Copyright (C) 2009  Guillaume Bour <guillaume@bour.cc>
     4
     5    This program is free software: you can redistribute it and/or modify
     6    it under the terms of the GNU General Public License as published by
     7    the Free Software Foundation, either version 3 of the License, or
     8    (at your option) any later version.
     9
     10    This program is distributed in the hope that it will be useful,
     11    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17*/
     18
     19#quickcall {
     20        float: right;
     21        margin: 5px 0px;
     22}
     23
     24#quickcall.visible {
     25        visibility: visible;
     26}
     27
     28#quickcall.hidden  {
     29        visibility: hidden;
     30}
     31
     32
     33#quickcall .sbox_l  {
     34        background: white url('srch_l.gif') no-repeat top left;
     35        float: left;
     36        width: 19px; height: 19px;
     37}
     38
     39#quickcall .sbox_r  {
     40        background: white url('srch_r.gif') no-repeat top left;
     41        float: left;
     42        width: 19px; height: 19px;
     43}
     44
     45#quickcall .sbox input {
     46        background: white url('srch_bg.gif') repeat-x top left;
     47        float: left;
     48        border: 0;
     49                height: 19px; width: 100px;
     50        padding: 3px;
     51        font: 11px/13px arial;
     52        color: #000;
     53}
     54
     55#quickcall #qk_fld {
     56        color: #C8C8C8;
     57}
  • tpl/default/asterisk/xmlhttprequest.js

    diff -urN iaddressbook_1.0/tpl/default/asterisk/xmlhttprequest.js iaddressbook_1.0__asterisk/tpl/default/asterisk/xmlhttprequest.js
    old new  
     1/*
     2                iaddressbook::asterisk, add call capability to iaddressbook
     3    Copyright (C) 2009  Guillaume Bour <guillaume@bour.cc>
     4
     5    This program is free software: you can redistribute it and/or modify
     6    it under the terms of the GNU General Public License as published by
     7    the Free Software Foundation, either version 3 of the License, or
     8    (at your option) any later version.
     9
     10    This program is distributed in the hope that it will be useful,
     11    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17*/
     18
     19function xmlhttp(callback) {
     20        this._xmlhttp = undefined;
     21        if (window.XMLHttpRequest) { // Mozilla, Safari, ...
     22                this._xmlhttp = new XMLHttpRequest();
     23        } else if (window.ActiveXObject) { // IE
     24                this._xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     25        }
     26                               
     27        _xmlhttp = this._xmlhttp;
     28        this._xmlhttp.onreadystatechange = function() { callback(_xmlhttp); };
     29
     30
     31        this.get = function (url)
     32                {
     33                        this._xmlhttp.open('GET', url, true);
     34                        this._xmlhttp.send(null);
     35                }
     36}
  • tpl/default/design.css

    diff -urN iaddressbook_1.0/tpl/default/design.css iaddressbook_1.0__asterisk/tpl/default/design.css
    old new  
    8989
    9090.mainview {
    9191    background-color: white;
    92 //    width: 76%;
     92/*    width: 76%;*/
    9393    width: 100%;
    9494    min-width: 570px;
    9595    margin: 0 auto 0 auto;
     
    460460}
    461461
    462462.login_box {
    463     width: 220px;
     463    min-width: 220px;
    464464    padding: 0;
    465465    margin: 10px;
    466466    margin-bottom: 40px;
  • tpl/default/main.tpl

    diff -urN iaddressbook_1.0/tpl/default/main.tpl iaddressbook_1.0__asterisk/tpl/default/main.tpl
    old new  
    2525
    2626        <link rel="stylesheet" type="text/css" href="<?= AB_TPL ?>applesearch/default.css" id="default"  />
    2727        <link rel="stylesheet" type="text/css" href="<?= AB_TPL ?>applesearch/dummy.css" id="dummy_css"  />
     28        <link rel="stylesheet" type="text/css" href="<?= AB_TPL ?>asterisk/asterisk.css" />
     29        <link rel="stylesheet" type="text/css" href="<?= AB_TPL ?>asterisk/quickcall.css" />
     30
    2831        <script type="text/javascript" src="<?= AB_TPL ?>applesearch/applesearch.js"></script>
     32        <script type="text/javascript" src="<?= AB_TPL ?>asterisk/xmlhttprequest.js"></script>
     33        <script type="text/javascript" src="<?= AB_TPL ?>asterisk/asterisk.js"></script>
    2934
    3035    <script type="text/javascript">
    31     <!--
     36    <!--
    3237    window.onload = function () {
    3338        applesearch.init('<?= AB_TPL ?>applesearch/');
    3439        applesearch.onChange('srch_fld','srch_clear');
     40
     41                                <?php $extension = asterisk_getextension(); ?>
     42
     43                                i18n = new Object();
     44                                i18n.noextension                = '<?= addslashes($lang['no-extension']) ?>';
     45                                i18n.invalidnumber      = '<?= addslashes($lang['invalid-number']) ?>';
     46                                i18n.usernoauth         = '<?= addslashes($lang['call-user-unauth']) ?>';
     47
     48                                astman.init(
     49                                        /* asterisk basedir  */'<?= AB_TPL ?>asterisk/',
     50                                        /* current extension */<?= $extension?"'$extension'":'undefined' ?>,
     51                                        /* root element id   */'asterisk-set',
     52                                        /* quickcall elt id      */'quickcall',
     53                                        /* i18n              */i18n
     54                                );
     55
    3556        document.search.q.focus();
    36         document.search.q.select();
     57        document.search.q.select();                     
    3758    }
    3859    -->
    3960    </script>
     
    6182                <div class="login_box">
    6283                    <?php if($conf['auth_enabled']) {
    6384                            if($userinfo['logged_in'] == true) {
    64                                 echo "<div class='person_smalltext'>" . $lang['logged_in_as'] . " " . $userinfo['fullname'] . "</div>";
     85                                echo "<div class='person_smalltext'>" . $lang['logged_in_as'] . " " . $userinfo['fullname'];
     86
     87                                                                                                                                if($userinfo['extension'])
     88                                                                                                                                { echo " (".$lang['extension'].": ".$userinfo['extension'].")"; }
     89                                                                                                                                echo "</div>";
    6590                                echo "<a href='?do=logout'>". $lang['btn_logout'] ."</a>";
    6691                            } else {
    6792                                echo "<a href='?do=login'>". $lang['btn_login'] ."</a>";
    6893                            }
    6994                        }
    7095                    ?>
     96
     97                                                                        <?php tpl_include('asterisk/asterisk.tpl') ?>
    7198                </div>
    7299       
    73100                <div class="birthday_box">
  • tpl/default/phone.tpl

    diff -urN iaddressbook_1.0/tpl/default/phone.tpl iaddressbook_1.0__asterisk/tpl/default/phone.tpl
    old new  
    55        </div>
    66    </td>
    77    <td class="person_right">
    8         <div class="person_text">
    9             <?= $phone['phone'] ?>
     8<?php
     9        $extension = asterisk_getextension();
     10
     11        if($extension && (!$conf['auth_enabled'] ||
     12                 auth_verify_action($userinfo['username'], 'asterisk_docall', false)))
     13        {
     14?>
     15        <div class="person_text offcall">
     16            <a href="#" onclick="astman.doCall(this)"
     17                                                         title="<?= $lang['clicktocall'] ?>"><?= $phone['phone'] ?></a>
    1018        </div>
     19<?php
     20        } else {
     21?>
     22        <div class="person_text"><?= $phone['phone'] ?></div>
     23<?php   } ?>
    1124    </td>
    12 </tr>
    13  Pas de fin de ligne à la fin du fichier.
     25</tr>
Note: See TracBrowser for help on using the repository browser.