/*
 *  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.groups.group.users.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();