/* * File: aadir.js * Purpose: Auto Attendant directory. * Machine: OS: * Author: John Wehle Date: November 6, 2008 * * Copyright (c) 2008 Feith Systems and Software, Inc. * All Rights Reserved */ var digitTimeOut = 3000; var interDigitTimeOut = 1000; var absoluteTimeOut = 10000; var base_dir = session.getVariable ("base_dir"); var domain = session.getVariable ("domain"); var voicemail_path = base_dir + "/storage/voicemail/default/" + domain + "/"; var file_exts = [ ".wav", ".mp3" ]; var extRE = /^1[0-9][0-9][0-9]$/g; var operator = "operator"; var directory; var directory_camelcase; var translations = [ "0", "QZ", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ" ]; var extension = ""; var dtmf_digits = ""; function load_directory () { var i; var name; var number; var dir = apiExecute ("xml_locate", "directory domain name " + domain); var re = /\s+$/g; var length = dir.search (re); if (length == -1) length = dir.length; dir = dir.substring (0, length); var xdir = new XML (dir); directory = new Array (); i = 0; re = /[^A-Z0-9\s]/gi; for each (var variables in xdir.user.variables) { name = ""; number = ""; for each (variable in variables.variable) { if (variable.@name.toString() == "effective_caller_id_name") name = variable.@value.toString(); if (variable.@name.toString() == "effective_caller_id_number") number = variable.@value.toString(); } if (name.length == 0 || number.length == 0 || number.search (extRE) == -1) continue; directory[i] = new Array (2); directory[i][0] = name.replace (re, ""); directory[i][1] = number; i++; } } function build_camelcase_directory () { var i; var fname; var lname; var fre = /^[A-Z0-9]+/gi; var lre = /[A-Z0-9]+$/gi; directory_camelcase = new Array (directory.length); for (i = 0; i < directory.length; i++) { directory_camelcase[i] = new Array (2); directory_camelcase[i][0] = ""; directory_camelcase[i][1] = 0; fname = directory[i][0].match (fre); lname = directory[i][0].match (lre); if (fname.length != 1 || lname.length != 1) { console_log ("err", "Can't parse " + directory[i][0] + " for directory\n"); continue; } directory_camelcase[i][0] = lname[0] + fname[0]; directory_camelcase[i][1] = directory[i][1]; } } function directory_lookup (digits) { var i; var match = ""; var pattern = "^"; var re; if (digits.length && digits[0] == 0) return 0; for (i = 0; i < digits.length; i++) { if (isNaN (parseInt (digits[i], 10))) return -1; pattern += "[" + translations[parseInt (digits[i], 10)] + "]"; } re = new RegExp (pattern, "i"); for (i = 0; i < directory_camelcase.length; i++) if (directory_camelcase[i][0].search (re) != -1) { if (! isNaN (parseInt (match, 10))) return ""; match = directory_camelcase[i][1]; } if (isNaN (parseInt (match, 10))) return -1; return match; } function on_dtmf (session, type, obj, arg) { if (type == "dtmf") { dtmf_digits += obj.digit; extension = directory_lookup (dtmf_digits) return false; } return true; } function directory_prompt () { var choice; var index; var repeat; extension = ""; choice = ""; repeat = 0; while (session.ready () && repeat < 3) { /* play phrase - if digit keyed while playing callback will catch them*/ session.sayPhrase ("feith_aa_directory", "#", "", on_dtmf, ""); choice = dtmf_digits; while ( isNaN (parseInt (extension, 10)) ) { if (! session.ready ()) return ""; dtmf_digits = session.getDigits (1, '#', digitTimeOut, interDigitTimeOut, absoluteTimeOut); choice += dtmf_digits; extension = directory_lookup (choice); } if (parseInt (extension, 10) >= 0) break; session.sayPhrase ("voicemail_invalid_extension", "#", "", on_dtmf, ""); dtmf_digits = ""; extension = ""; choice = ""; repeat++; session.flushDigits (); } return extension; } var choice = ""; var fd; var i; var recorded_name; session.answer (); session.execute("sleep", "1000"); load_directory (); build_camelcase_directory (); dtmf_digits = ""; session.flushDigits (); choice = directory_prompt (); if (! session.ready ()) { session.hangup(); exit(); } if ( isNaN (parseInt (choice, 10)) || parseInt (choice, 10) <= 0) { session.execute ("transfer", operator + " XML default"); exit(); } for (i = 0; i < file_exts.length; i++) { recorded_name = voicemail_path + choice + "/recorded_name" + file_exts[i]; fd = new File (recorded_name); if (fd.exists) { session.streamFile (recorded_name); break; } } session.execute ("phrase", "spell," + choice); session.execute ("transfer", choice + " XML default"); exit();