function getExtensionById($id, $domain = null)
 {
     global $arrConf;
     $arrExtension = array();
     $where = "";
     if (!preg_match('/^[[:digit:]]+$/', "{$id}")) {
         $this->errMsg = "Extension ID must be numeric";
         return false;
     }
     $param = array($id);
     if (isset($domain)) {
         if (!preg_match("/^(([[:alnum:]-]+)\\.)+([[:alnum:]])+\$/", $domain)) {
             $this->errMsg = "Invalid domain format";
             return false;
         } else {
             $where = " and organization_domain=?";
             $param[] = $domain;
         }
     }
     $query = "SELECT tech, exten, outboundcid, rt, record_in, record_out, organization_domain, voicemail, device, clid_name, clid_number,alias,elxweb_device,enable_chat from extension where id=? {$where}";
     $result = $this->_DB->getFirstRowQuery($query, true, $param);
     if ($result === false) {
         $this->errMsg = $this->_DB->errMsg;
         return false;
     } elseif (count($result) > 0) {
         //get organization_code
         $org_code = $this->getOrganizationCode($result["organization_domain"]);
         if ($org_code === false) {
             return false;
         }
         $arrExtension["technology"] = $result["tech"];
         $arrExtension["exten"] = $result["exten"];
         $arrExtension["clid_name"] = $result["clid_name"];
         $arrExtension["clid_number"] = $result["clid_number"];
         $arrExtension["ring_timer"] = $result["rt"];
         $arrExtension["record_in"] = $result["record_in"];
         $arrExtension["record_out"] = $result["record_out"];
         $arrExtension["out_clid"] = $result["outboundcid"];
         $arrExtension["alias"] = $result["alias"];
         $arrExtension["elxweb_device"] = $result["elxweb_device"];
         $arrExtension["enable_chat"] = $result["enable_chat"];
         //obtenemos las caracteristicas de voicemail de la extension en caso de que este tenga creada uno
         if (isset($result["voicemail"]) && $result["voicemail"] != "novm") {
             $query = "SELECT * from voicemail where mailbox=? and organization_domain=?";
             $voicemail = $this->_DB->getFirstRowQuery($query, true, array($result["exten"], $result["organization_domain"]));
             if ($voicemail == false) {
                 $arrExtension["create_vm"] = "no";
                 if ($voicemail === false) {
                     $this->errMsg .= _tr("Error getting voicemail") . $this->_DB->errMsg;
                 }
             } else {
                 $arrExtension["create_vm"] = "yes";
                 $option = "";
                 foreach ($voicemail as $key => $value) {
                     switch ($key) {
                         case "password":
                             $arrExtension["vmpassword"] = $value;
                             break;
                         case "email":
                             $arrExtension["vmemail"] = $value;
                             break;
                         case "attach":
                             $arrExtension["vmattach"] = $value;
                             break;
                         case "saycid":
                             $arrExtension["vmsaycid"] = $value;
                             break;
                         case "deletevoicemail":
                             $arrExtension["vmdelete"] = $value;
                             break;
                         case "envelope":
                             $arrExtension["vmenvelope"] = $value;
                             break;
                         case "context":
                             $arrExtension["vmcontext"] = substr_replace($value, '', 0, strlen($org_code) + 1);
                             //eliminamos la parte del string que contiene el codigo de la organization
                             break;
                         case "emailsubject":
                             $arrExtension["vmemailsubject"] = $value;
                             break;
                         case "emailbody":
                             $arrExtension["vmemailbody"] = $value;
                             break;
                         case "mailbox":
                             break;
                         case "fullname":
                             break;
                         default:
                             if (isset($value)) {
                                 if ($key != "uniqueid" && $key != "organization_domain" && $key != "stamp" && $key != "dialout" && $key != "callback") {
                                     $option .= "{$key}={$value}|";
                                 }
                                 if ($key == "dialout" || $key == "callback" || $key == "exitcontext") {
                                     $option .= "{$key}=" . substr($arrExten["vmcontext"], 16) . "|";
                                 }
                             }
                     }
                     $arrExtension["vmoptions"] = empty($option) ? "" : substr($option, 0, -1);
                 }
             }
         }
         //obtenemos las otras caracticas de la configuracion del dispositivo
         if ($result["tech"] == "iax2") {
             $queryDev = "SELECT context,dial,host,type,allow,disallow,port,qualify,accountcode,deny,permit,language,amaflags,";
             $queryDev .= "defaultip,username,mohinterpret,mohsuggest,transfer,requirecalltoken,mask,jitterbuffer,forcejitterbuffer,";
             $queryDev .= "codecpriority,qualifysmoothing,qualifyfreqok,qualifyfreqnotok,encryption,timezone,sendani,adsi from iax where name=? and organization_domain=?";
         } elseif ($result["tech"] == "sip") {
             $queryDev = "SELECT context,dial,host,type,allow,disallow,port,qualify,accountcode,deny,permit,language,amaflags,";
             $queryDev .= "defaultip,username,mohinterpret,mohsuggest,dtmfmode,nat,allowtransfer,namedcallgroup,namedpickupgroup,";
             $queryDev .= "mailbox,vmexten,defaultuser,useragent,directmedia,sendrpid,trustrpid,transport,callcounter,busylevel,subscribecontext,videosupport,maxcallbitrate,";
             $queryDev .= "qualifyfreq,rtptimeout,rtpholdtimeout,rtpkeepalive,progressinband,g726nonstandard,vmexten from sip where name=?   and organization_domain=?";
         } else {
             $this->errMsg .= _tr("Invalid Technology");
             return false;
         }
         if (isset($queryDev)) {
             $device = $this->_DB->getFirstRowQuery($queryDev, true, array($result["device"], trim($result["organization_domain"])));
             if ($device == false) {
                 $this->errMsg .= _tr("Error getting device settings") . $this->_DB->errMsg;
                 return false;
             } else {
                 foreach ($device as $key => $value) {
                     if (isset($value)) {
                         if ($key == "namedcallgroup" || $key == "namedpickupgroup" || $key == "context" || $key == 'subscribecontext') {
                             $arrExtension[$key] = substr_replace($value, '', 0, strlen($org_code) + 1);
                         } else {
                             $arrExtension[$key] = $value;
                         }
                     }
                 }
             }
         }
         $arrExtension["domain"] = $result["organization_domain"];
         $arrExtension["device"] = $result["device"];
         $pORGZ = new paloSantoOrganization($arrConf['elastix_dsn']['elastix']);
         $orgTmp = $pORGZ->getOrganizationByDomain_Name($result["organization_domain"]);
         if ($orgTmp != false) {
             $astMang = AsteriskManagerConnect($errorM);
             if ($astMang == false) {
                 $this->errMsg .= $errorM;
                 return false;
             } else {
                 $familia = "EXTUSER/" . $orgTmp["code"] . "/" . $result["exten"];
                 $arrExtension["call_waiting"] = $astMang->database_get("CW/" . $orgTmp["code"], $result["exten"]) == "ENABLED" ? "yes" : "no";
                 $arrExtension["screen"] = $astMang->database_get($familia, "screen");
                 $enDictate = $astMang->database_get($familia . "/dictate", "enabled");
                 $arrExtension["dictate"] = $enDictate == "enabled" ? "yes" : "no";
                 $arrExtension["dictformat"] = $astMang->database_get($familia . "/dictate", "format");
                 $arrExtension["dictemail"] = $astMang->database_get($familia . "/dictate", "email");
                 //vmx_locator options
                 $vmx_unavail = $astMang->database_get("{$familia}/vmx/unavail", "state");
                 $vmx_busy = $astMang->database_get("{$familia}/vmx/busy", "state");
                 if ($vmx_unavail == "enabled" || $vmx_busy == "enabled") {
                     $arrExtension["vmx_locator"] = "enabled";
                 } else {
                     $arrExtension["vmx_locator"] = "disabled";
                 }
                 if ($vmx_unavail == "enabled" && $vmx_busy == "enabled") {
                     $arrExtension["vmx_use"] = "both";
                 } else {
                     if ($vmx_unavail == "enabled") {
                         $arrExtension["vmx_use"] = "unavailable";
                     } else {
                         $arrExtension["vmx_use"] = "busy";
                     }
                 }
                 $arrExtension["vmx_extension_0"] = $astMang->database_get($familia . "/vmx/0", "ext");
                 if (isset($arrExtension["vmx_extension_0"]) && $arrExtension["vmx_extension_0"] != "") {
                     $arrExtension["vmx_operator"] = "off";
                 } else {
                     $arrExtension["vmx_operator"] = "on";
                 }
                 $arrExtension["vmx_extension_1"] = $astMang->database_get($familia . "/vmx/1", "ext");
                 $arrExtension["vmx_extension_2"] = $astMang->database_get($familia . "/vmx/2", "ext");
             }
         }
     }
     return $arrExtension;
 }