<?php
		
/**
 * AgileBill - Open Billing Software
 *
 * This body of work is free software; you can redistribute it and/or
 * modify it under the terms of the Open AgileBill License
 * License as published at http://www.agileco.com/agilebill/license1-4.txt
 * 
 * For questions, help, comments, discussion, etc., please join the
 * Agileco community forums at http://forum.agileco.com/ 
 *
 * @link http://www.agileco.com/
 * @copyright 2004-2008 Agileco, LLC.
 * @license http://www.agileco.com/agilebill/license1-4.txt
 * @author Tony Landis <tony@agileco.com> and Thralling Penguin, LLC <http://www.thrallingpenguin.com>
 * @package AgileBill
 * @version 1.4.93
 */
	
require_once PATH_MODULES.'voip/base_voip_plugin.inc.php';

class voipDID
{
	var $data;
	var $plugin_id = 0;
	var $has_callwaiting = 1;
	
	function load($did)
	{
		$db =& DB();
		$rs = $db->Execute($sql=sqlSelect($db,"voip_did","*","did=::$did::"));
		#echo $sql."<BR />";
		$this->data = $rs->fields;
	}
	
	function save()
	{
		if(!is_array($this->data)) {
			echo "Invalid state to save voipDID.";
			return;
		}
		$db =& DB();
		$sql = sqlUpdate($db,"voip_did",$this->data,"id=::".$this->data['id']."::");
		#echo $sql."<BR />";
		$db->Execute($sql);
	}
	
	function insert()
	{
		if(!is_array($this->data)) {
			echo "Invalid state to insert voipDID.";
			return;
		}	
		$db =& DB();
		$sql = sqlInsert($db,"voip_did",$this->data);
		#echo $sql."<BR />";		
		if(!$db->Execute($sql)) {
			echo $db->ErrorMsg();
		}
	}
	
	function delete()
	{
		if(!is_array($this->data)) {
			echo "Invalid state to delete voipDID.";
			return;
		}	
		$db =& DB();
		$db->Execute(sqlDelete($db,"voip_did","id=::".$this->data['id']."::"));
	}
	
	function getPluginID()
	{
		if($this->plugin_id) return $this->plugin_id;
		
		require_once PATH_MODULES."voip/voip.inc.php";
		$v = new voip;
		$didtable = $v->get_did_e164($this->data['did']);
		$this->plugin_id = $didtable['voip_did_plugin_id'];
		return $this->plugin_id;
	}
	
	function getDID()
	{
		return $this->data['did'];
	}
	
	function setDID($did)
	{
		$this->data['did'] = $did;
	}
	
	function getID()
	{
		return $this->data['id'];
	}
	
	function getAccountID()
	{
		return $this->data['account_id'];
	}
	
	function setAccountID($id)
	{
		$this->data['account_id'] = $id;
	}
	
	function getActive()
	{
		return $this->data['active'];
	}
	
	function setActive($v)
	{
		$this->data['active'] = $v;
	}
	
	function setServiceID($v)
	{
		$this->data['service_id'] = $v;
	}
	
	function setServiceParentID($v)
	{
		$this->data['service_parent_id'] = $v;
	}
	
	function setCNAM($v)
	{
		$this->data['cnam'] = $v;
	}
	
	function setBlacklist($v)
	{
		$this->data['blacklist'] = $v;
	}
	
	function setANIRouting($v)
	{
		$this->data['anirouting'] = $v;
	}
	
	function setVoicemail($v)
	{
		$this->data['voicemailenabled'] = $v;
		$this->data['voicemailafter'] = 30;
	}
	
	function setFailover($v)
	{
		$this->data['failover'] = $v;
	}
	
	function setRemoteCallForwarding($v)
	{
		$this->data['remotecallforward'] = $v;
	}
	
	function setFax($v, $email)
	{
		$this->data['rxfax'] = $v;
		$this->data['faxemail'] = $email;
	}
	
	function setConference($v, $lim)
	{
		$this->data['conf'] = $v;
		$this->data['conflimit'] = $lim;
	}
	
	function setFaxDetection($v, $email)
	{
		$this->data['faxdetection'] = $v;
		$this->data['faxemail'] = $email;
	}
	
	function setBusyCallForward($v)
	{
		$this->data['busycallforwardenabled'] = $v;
	}
	
	function setCallForward($v)
	{
		$this->data['callforwardingenabled'] = $v;
	}
	
	function setChannel($v)
	{
		$this->data['channel'] = $v;
	}
	
	function setChannelArg($v)
	{
		$this->data['channelarg'] = $v;
	}
	
	function setCallWaiting($v)
	{
		$this->has_callwaiting = $v;
	}
	
	function getCallWaiting()
	{
		return $this->has_callwaiting;
	}
}

/**
 * Parent class for VoIP provisioning
 */ 
class voip_provisioning
{
	/**
	 * The default voicemail PIN code
	 */
	var $voip_vm_passwd;
	
	/**
	 * The method of password generation
	 */
	var $voip_secret_gen;
	
	/**
	 * Reference to underlying product plugin
	 */	 	
	var $prod_plugin;
	
	/**
	 * Authorized domain
	 */	 	
	var $voip_domain;
	
	function voip_provisioning(&$prod_plugin)
	{
		$this->prod_plugin =& $prod_plugin;
	}
	
	function load_config()
	{
    $db =& DB();
		$sql = sqlSelect($db, "voip", "voip_vm_passwd, voip_secret_gen, auth_domain", "");
		$rs = $db->Execute($sql);
		$this->voip_vm_passwd = $rs->fields['voip_vm_passwd'];
		$this->voip_secret_gen = $rs->fields['voip_secret_gen'];
		$this->voip_domain = $rs->fields['auth_domain'];
	}
	
	function generate_secret(&$didClass)
	{
		$this->load_config();
		switch ($this->voip_secret_gen) {
			case 0:
				$secret = substr(ereg_replace("[^0-9]","",microtime()),0,7);
				break;
			case 1:
				$secret = strrev($didClass->getDID());
				break;
			case 2:
				$secret = $didClass->getDID();
				break;
			default:
				$secret = strrev($didClass->getDID());
				break;
		}
		return $secret;
	}

	function call_did_plugin(&$didClass, $method)
	{
		$db =& DB();
		if(!is_a($didClass,'voipDID')) {
			echo 'First parameter was not a voipDID class.';
			exit;
		}
		$plugin_id = $didClass->getPluginID();
		
		$rs = & $db->Execute(sqlSelect($db,"voip_did_plugin","plugin,avail_countries","id = $plugin_id"));
		if($rs && $rs->RecordCount() > 0) {
		 	$plugin = $rs->fields['plugin']; 			 
		} else {
			return false;
		}
		
		// load the plugin and call purchase(); 
		$file = PATH_PLUGINS.'voip_did/'.$plugin.'.php';
		if(is_file($file)) {
			include_once($file);
			eval('$plg = new plgn_voip_did_'.$plugin.';'); 
			if(is_object($plg)) {
				if(is_callable(array($plg, $method))) {
					$plg->id = $plugin_id;
					$plg->did = $didClass->getDID(); 		
					$plg->did_id = $didClass->getID();
					$plg->account_id = $didClass->getAccountID(); 
					eval('$plg->'.$method.'();');
					return true;
				}
			}  
		}
		return false;
	}
	
	function add_in_network(&$didClass)
	{
		if(!is_a($didClass,'voipDID'))
			die('Parameter must be a voipDID');
		$db =& DB();
		$f = array( 
			'did'		=> $didClass->getDID(),
			'site_id'	=> DEFAULT_SITE
		);
		$sql = sqlInsert($db,"voip_in_network",$f);
		#echo $sql."<BR />";		
		$db->Execute($sql);
	}
	
	function delete_in_network(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die('Parameter must be of voipDID');
		$db =& DB();
		$sql = sqlDelete($db,"voip_in_network","did=::".$didClass->getDID()."::");
		#echo $sql."<BR />";
		$db->Execute($sql);
	}
	
	function add_voicemail(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die('parameter must be of voipDID');
			
		$db =& DB();
		$this->load_config();

		# get the account information
		$account = $db->Execute(sqlSelect($db,"account","first_name,last_name,email","id=::".$didClass->getAccountID()."::"));
		
		$f = array(
			'account_id'		=> $didClass->getAccountID(),
			'context'				=> 'default',
			'mailbox'				=> $didClass->getDID(),
			'password'			=> $this->voip_vm_passwd,
			'fullname'			=> $account->fields['first_name']." ".$account->fields['last_name'],
			'email'					=> $account->fields['email']
		);
		$db->Execute($sql=sqlInsert($db,"voip_vm",$f));
		#echo $sql."<BR />";
	}
	
	function delete_voicemail(&$didClass)
	{
		$db =& DB();
		if(!is_a($didClass,'voipDID')) die('parameter must be of voipDID');
		$db->Execute($sql=sqlDelete($db,"voip_vm","context=::default:: and mailbox=::".$didClass->getDID()."::"));
		#echo $sql."<BR />";
	}
}


class ser_voip_provisioning extends voip_provisioning
{
	var $ser_host = 'localhost';
	var $ser_type = 'mysql';
	var $ser_name = 'serdb';
	var $ser_user = '';
	var $ser_pass = '';
	var $tbl_subscriber = 'subscriber';
	var $tbl_alias = 'aliases';
	var $tbl_group = 'grp';
	var $tbl_acc = 'acc';
	var $ser_ip	= 'localhost';

	function & DBFactory()
	{
		static $dbc;
		
		if(!is_resource($dbc)) {
			$dbc = NewADOConnection($this->ser_type);
			$dbc->Connect($this->ser_host, $this->ser_user, $this->ser_pass, $this->ser_name);
		}
		return $dbc; 
	}
		
	function ser_voip_provisioning(&$prod_plugin)
	{
		parent::voip_provisioning($prod_plugin);
		
		# Load our needed configuration items
		$this->ser_ip = $prod_plugin->plugin_data['ser_ip'];
		$this->ser_host = $prod_plugin->plugin_data['ser_db_host'];
		$this->ser_name = $prod_plugin->plugin_data['ser_db_name'];
		$this->ser_user = $prod_plugin->plugin_data['ser_db_user'];
		$this->ser_pass = $prod_plugin->plugin_data['ser_db_pass'];
		$this->tbl_subscriber = $prod_plugin->plugin_data['ser_db_subscriber'];
		$this->tbl_alias = $prod_plugin->plugin_data['ser_db_alias'];
		$this->tbl_group = $prod_plugin->plugin_data['ser_db_grp'];
		$this->tbl_acc = $prod_plugin->plugin_data['ser_db_acc'];
	}
		
	function addCustom(&$didClass)
	{
	}
	
	function removeCustom(&$didClass)
	{
	}
	
	function addDID(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die('parameter must of voipDID');

		$this->load_config();
		$db =& DB();
		
		$account = $db->Execute(sqlSelect($db,"account","*","id=::".$didClass->getAccountID()."::"));
		$pw = $this->generate_secret($didClass);
		
		$dbs =& $this->DBFactory();
		$f = array(
			'phplib_id'				=> md5($didClass->getDID()),
			'username'				=> $didClass->getDID(),
			'domain'					=> $this->voip_domain,
			'password'				=> $pw,
			'first_name'			=> $account->fields['first_name'],
			'last_name'				=> $account->fields['last_name'],
			'flag'						=> 'o',
			'ha1'							=> md5($didClass->getDID().":".$this->voip_domain.":".$pw),
			'ha1b'						=> md5($didClass->getDID()."@".$this->voip_domain.":".$this->voip_domain.":".$pw)
		);
		$fsql = ""; $vsql = "";
		foreach($f as $fld => $val) {
			$fsql .= $fld.",";
			$vsql .= $db->qstr($val).",";
		}
		$fsql = substr($fsql,0,strlen($fsql)-1);
		$vsql = substr($vsql,0,strlen($vsql)-1);
		$sql = "INSERT INTO ".$this->tbl_subscriber." ($fsql) VALUES ($vsql)";
		#echo $sql."<br>";
		if(!$dbs->Execute($sql)) echo $dbs->ErrorMsg();
		
		# store off the group permissions
		$grps = explode(",",str_replace(" ","",$this->prod_plugin->plugin_data['context']));
		foreach($grps as $group) {
			$f = array(
				'username'			=>	$db->qstr($didClass->getDID()),
				'domain'				=>	$db->qstr($this->voip_domain),
				'grp'						=>	$db->qstr($group),
				'last_modified'	=> 'NOW()'
			);
			$fsql = ""; $vsql = "";
			foreach($f as $fld => $val) {
				$fsql .= $fld.",";
				$vsql .= $val.",";
			}
			$fsql = substr($fsql,0,strlen($fsql)-1);
			$vsql = substr($vsql,0,strlen($vsql)-1);
			$sql = "INSERT INTO ".$this->tbl_group." ($fsql) VALUES ($vsql)";
			#echo $sql."<br />";
			if(!$dbs->Execute($sql)) echo $dbs->ErrorMsg();
		}
	}
	
	function addVirtualDID(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die("Parameter is not a voipDID class.");
		
		$this->load_config();
		$db =& DB();
				
		$parent_did = $this->prod_plugin->get_parent_did($this->prod_plugin->prod_attr_cart['parent_service_id']);
		$contact = 'sip:'.$parent_did.'@'.$this->ser_ip;
		
		$dbs =& $this->DBFactory();
		$f = array(
			'username'			=>	$dbs->qstr($didClass->getDID()),
			'domain'				=>	$dbs->qstr($this->voip_domain),
			'contact'				=>	$dbs->qstr($contact),
			'expires'				=>	$dbs->qstr('2010-12-25 01:01:01'),
			'q'							=>	'1',
			'callid'				=>	$dbs->qstr('The-Answer-To-The-Ultimate-Question-Of-Life-Universe-And-Everything'),
			'cseq'					=>	'42',
			'last_modified'	=>	'NOW()',
			'replicate'			=>	'0',
			'state'					=>	'0',
			'flags'					=>	'128',
			'user_agent'		=>	$dbs->qstr('AgileVoice')
		);
		$fsql = ""; $vsql = "";
		foreach($f as $fld => $val) {
			$fsql .= $fld.",";
			$vsql .= $val.",";
		}
		$fsql = substr($fsql,0,strlen($fsql)-1);
		$vsql = substr($vsql,0,strlen($vsql)-1);
		$sql = "INSERT INTO ".$this->tbl_alias." ($fsql) VALUES ($vsql)";
		#echo $sql."<br>";
		if(!$dbs->Execute($sql)) echo $dbs->ErrorMsg();		
	}
	
	function deleteDID(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die('parameter must be of voipDID');
		$this->load_config();
		
		$dbs =& $this->DBFactory();
		$sql = "DELETE FROM ".$this->tbl_subscriber." WHERE username=".$dbs->qstr($didClass->getDID())." AND
			domain=".$dbs->qstr($this->voip_domain);
		#echo $sql."<br>";
		$dbs->Execute($sql);
	}
	
	function deleteVirtualDID(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die('parameter must be of voipDID');
		$this->load_config();
		
		$dbs =& $this->DBFactory();
		$sql = "DELETE FROM ".$this->tbl_alias." WHERE username=".$dbs->qstr($didClass->getDID())." AND
			domain=".$dbs->qstr($this->voip_domain);
		#echo $sql."<br>";
		$dbs->Execute($sql);
	}
}

class asterisk_voip_provisioning extends voip_provisioning
{
	function asterisk_voip_provisioning(&$prod_plugin)
	{
		parent::voip_provisioning($prod_plugin);
	}
	
	function addCustom(&$didClass)
	{
		;
	}
	
	function removeCustom(&$didClass)
	{
		;
	}
	
	function addDID(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die('parameter must of voipDID');

		$this->load_config();
		$db =& DB();
		
		$account = $db->Execute(sqlSelect($db,"account","*","id=::".$didClass->getAccountID()."::"));
		$pw = $this->generate_secret($didClass);
		$fullname = trim($account->fields['first_name']." ".$account->fields['last_name']);
		
		$channel = 'SIP';
		$channel_table = 'voip_sip';
		$channel_key = 'sip';
		if(@$this->prod_plugin->plugin_data['provision_channel'] == 1) {
			$channel = 'IAX2';
			$channel_table = 'voip_iax';
			$channel_key = 'iax';
		}
		
		$sql = "delete from ".AGILE_DB_PREFIX.$channel_table." WHERE 
			$channel_key=".$db->qstr($didClass->getDID())." and site_id=".$db->qstr(DEFAULT_SITE);
		#echo $sql."<br>";
		$db->Execute($sql);
					
		$f = array(
			'account'				=> $didClass->getDID(),
			'canreinvite'		=> 'no',
			'insecure'			=> 'very',
			'dtmfmode'			=> 'rfc2833',
			'host'					=> 'dynamic',
			'nat'						=> 'yes',
			'qualify'				=> '5000',
			'secret'				=> $pw,
			'type'					=> 'friend',
			'username'			=> $didClass->getDID(),
			'context'				=> 'default',
			'callerid'			=> sprintf("\"%s\" <%s>", $fullname, $didClass->getDID())
		);
		if(strlen($this->prod_plugin->plugin_data['context']))
			$f['context'] = $this->prod_plugin->plugin_data['context'];
		if($this->prod_plugin->plugin_data['voicemail_enabled'])
			$f['mailbox'] = $didClass->getDID();
		if($didClass->getCallWaiting() == 0)
			$f['incominglimit'] = '1';
			
		foreach($f as $fld => $val) {
			$flds = array(
				$channel_key	=> $didClass->getDID(),
				'keyword'			=> $fld,
				'data'				=> $val,
				'flags'				=> ''	
			);
			$sql = sqlInsert($db,$channel_table,$flds);
			#echo $sql."<br />";
			$db->Execute($sql);
		}
	}
	
	function addVirtualDID(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die("Parameter is not a voipDID class.");
		
		$this->load_config();
		$db =& DB();
		
		# A virtual DID is just a regular DID that has a channelarg set to the parent DIDs number
		$parent_did = $this->prod_plugin->get_parent_did($this->prod_plugin->prod_attr_cart['parent_service_id']);
		$didClass->setChannelArg($parent_did);
	}
	
	function deleteDID(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die('parameter must be of voipDID');
	}
	
	function deleteVirtualDID(&$didClass)
	{
		if(!is_a($didClass,'voipDID')) die('parameter must be of voipDID');
	}
}

class plgn_prov_VOIP extends base_voip_plugin
{
  function plgn_prov_VOIP()
  { 
    $this->name             = 'VOIP';
    $this->task_based       = false;
    $this->remote_based     = true;
  }
    
	function delete_cart($VAR, $cart)
	{
		parent::delete_cart($VAR, $cart, false);
	}
    
  function validate_cart($VAR,$product) 
  { 
		// verify that attr['station'] is defined and numeric
		@$did = $VAR['attr']['station'];
		$ported = 0;
		if (@$VAR['attr']['ported']) {
			$did = $VAR['attr']['ported'];
			$ported = 1;
		}
		
		$db =& DB();
		$rs = $db->Execute(sqlSelect($db,"product","prod_plugin_data","id=::".$VAR['product_id']));
		$prod_plugin_data = unserialize($rs->fields['prod_plugin_data']);
		if(!empty($VAR['attr']['parent_service_id']) || $prod_plugin_data['rate_accountcode'] == 1)
			return true;
		if((empty($did) || !is_numeric($did))) 
			return "Sorry, the DID format specified is incorrect.";

		return parent::validate_cart($VAR, $product, $did, $ported);
	}	

	function getDID(&$ported)
	{
		$did = str_replace("-","",@$this->prod_attr_cart['station']);
		if (strlen(@$this->prod_attr_cart['ported'])) {
			$did = $this->prod_attr_cart['ported'];
			$ported = true;
		}
		return $did;	
	}
	
  # add new service
  function p_new()
  {
  	#echo 'p_new<br />';
		$db = &DB();
		if (empty($this->prod_attr_cart['parent_service_id'])) {
			$this->prod_attr_cart['parent_service_id'] = 0;
		}
		#echo 'Retrieving did.<br />';
		$ported = false;
		$did = $this->getDID($ported);
		#echo 'DID is: '.$did.'<br />';
				
		switch(@$this->plugin_data['voip_platform']) {
			case 'ser':
				$vp = new ser_voip_provisioning($this);
				#echo 'Created ser<br />';
				break;
			case 'asterisk':
			default:
				$vp = new asterisk_voip_provisioning($this);
				#echo 'Created asterisk<br />';
		}

		if($this->plugin_data['rate_accountcode'])
			return true;

		# figure out which object to load
		#echo 'Creating voipDID.<br />';
		$didClass = new voipDID;
		if($this->prod_attr_cart['parent_service_id'] && !$this->plugin_data['virtual_number']) {
			$didClass->load($this->get_parent_did($this->prod_attr_cart['parent_service_id']));
    	} else {
			# new did needs create
			$didClass->setDID($did);
			$didClass->setAccountID($this->account['id']);
			$didClass->setServiceID($this->service['id']);
			$didClass->setServiceParentID($this->prod_attr_cart['parent_service_id']);
			$didClass->setActive(1);
			$didClass->insert();
			#echo 'Loading didClass.<br />';
			$didClass->load($did);
			
    		# go ahead and call the did plugin's purchase method,
    		# if the number isn't ported
    		if($ported==false && $vp->call_did_plugin($didClass,'purchase') == false) {
    			# purchase method failed. Post an error message and bomb out
    			$didClass->delete();
    			return false;
    		}
		
			if($this->plugin_data['virtual_number']) {	
				# provision a virtual number
				$vp->addVirtualDID($didClass);	
			} else {
				# provision a regular number
				$vp->addDID($didClass);
			}
		}
		#echo 'Set channel and features.<br />';
		
		# set the channel type
		$didClass->setChannel('SIP');
		if(@$this->plugin_data['provision_channel'] == 1)
			$didClass->setChannel('IAX2');
			
		# set all of the features entailed with this account
		if(@$this->plugin_data['cnam_enabled'])
			$didClass->setCNAM(1);
		if(@$this->plugin_data['blacklist_enabled'])
			$didClass->setBlacklist(1);
		if(@$this->plugin_data['anirouting_enabled'])
			$didClass->setANIRouting(1);
		if(@$this->plugin_data['can_failover'])
			$didClass->setFailover(1);
		if(@$this->plugin_data['remote_call_forwarding'])
			$didClass->setRemoteCallForwarding(1);
		if(@$this->plugin_data['fax_account'])
			$didClass->setFax(1,$this->account['email']);
		if(@$this->plugin_data['meetme_account'])
			$didClass->setConference(1, $this->plugin_data['meetme_min_limit']);
		if(@$this->plugin_data['faxdetection_enabled'])
			$didClass->setFaxDetection(1,$this->account['email']);
		if(@$this->plugin_data['callwaiting_enabled'])
			$didClass->setCallWaiting(1);
				
		# Callforward and Busycallforward are missing!
				
		if(@$this->plugin_data['voicemail_enabled']) {
			# provision voicemail to this account
			$didClass->setVoicemail(1);
			$vp->add_voicemail($didClass);
		}

		# Call custom handler
		# SER -> add entries to 'group' table
		$vp->addCustom($didClass);
		
		$didClass->save();
		#echo 'Called save voipDID.<br />';
		
		if($this->plugin_data['innetwork_enabled']) {
			# set this number to innetwork
			$vp->add_in_network($didClass);
		}
		
		# send the user the details
		include_once(PATH_MODULES.'email_template/email_template.inc.php');
		$email = new email_template;
		$email->send('voip_new_service', $this->account['id'], $this->service_id, $did, $did);			
		
		# send the admin the provisioning details
		include_once(PATH_MODULES.'email_template/email_template.inc.php');
		$email = new email_template;
		$email->send('admin->voip_manual', $this->account['id'], $this->service_id, $did, 'Provision VoIP Adaptor');	

		return true;		
	}

	function p_inactive()
	{
		$db = &DB();
		if (empty($this->prod_attr_cart['parent_service_id'])) {
			$this->prod_attr_cart['parent_service_id'] = 0;
		}
		$ported = false;
		$did = $this->getDID($ported);
		
		switch(@$this->plugin_data['voip_platform']) {
			case 'ser':
				$vp = new ser_voip_provisioning($this);
				break;
			case 'asterisk':
			default:
				$vp = new asterisk_voip_provisioning($this);
		}

		# figure out which didVOIP object to load
		$didClass = new voipDID;
		$didClass->load($this->get_parent_did($this->prod_attr_cart['parent_service_id']));
		$didClass->setActive(0);
		$didClass->save();
		return true;
	}

	function p_active()
	{
		$db = &DB();
		if (empty($this->prod_attr_cart['parent_service_id'])) {
			$this->prod_attr_cart['parent_service_id'] = 0;
		}
		$ported = false;
		$did = $this->getDID($ported);
		
		switch(@$this->plugin_data['voip_platform']) {
			case 'ser':
				$vp = new ser_voip_provisioning($this);
				break;
			case 'asterisk':
			default:
				$vp = new asterisk_voip_provisioning($this);
		}

		# figure out which didVOIP object to load
		$didClass = new voipDID;
		$didClass->load($this->get_parent_did($this->prod_attr_cart['parent_service_id']));
		$didClass->setActive(1);
		$didClass->save();
		return true;
	}

	function p_delete()
	{
		$db = &DB();
		if (empty($this->prod_attr_cart['parent_service_id'])) {
			$this->prod_attr_cart['parent_service_id'] = 0;
		}
		$debug = "";
		$ported = false;
		$did = $this->getDID($ported);
		
		switch(@$this->plugin_data['voip_platform']) {
			case 'ser':
				$vp = new ser_voip_provisioning($this);
				break;
			case 'asterisk':
			default:
				$vp = new asterisk_voip_provisioning($this);
		}

		# figure out which object to load
		$didClass = new voipDID;
		if($this->prod_attr_cart['parent_service_id'] && $this->plugin_data['virtual_number'] != 1) {
			$didClass->load($this->get_parent_did($this->prod_attr_cart['parent_service_id']));
		} else {
			$didClass->load($did);
		}

		# set all of the features entailed with this account
		if(@$this->plugin_data['cnam_enabled'])
			$didClass->setCNAM(0);
		if(@$this->plugin_data['blacklist_enabled'])
			$didClass->setBlacklist(0);
		if(@$this->plugin_data['anirouting_enabled'])
			$didClass->setANIRouting(0);
		if(@$this->plugin_data['can_failover'])
			$didClass->setFailover(0);
		if(@$this->plugin_data['remote_call_forwarding'])
			$didClass->setRemoteCallForwarding(0);
		if(@$this->plugin_data['fax_account'])
			$didClass->setFax(0,$this->account['email']);
		if(@$this->plugin_data['meetme_account'])
			$didClass->setConference(0, $this->plugin_data['meetme_min_limit']);
		if(@$this->plugin_data['faxdetection_enabled'])
			$didClass->setFaxDetection(0, $this->account['email']);
			
		# Callforward and Busycallforward are missing!
				
		if(@$this->plugin_data['voicemail_enabled']) {
			# provision voicemail to this account
			$vp->delete_voicemail($didClass);
		}
				
		if(@$this->plugin_data['provision_enabled']) {
			$didClass->setActive(0);
			if($this->plugin_data['virtual_number']) {	
				# have ser provision a virtual number
				$vp->deleteVirtualDID($didClass);	
			} else {
				# have ser provision a regular number
				$vp->deleteDID($didClass);
			}
			if($this->plugin_data['innetwork_enabled']) {
				$vp->delete_in_network($didClass);
			}
			# go ahead and call the did plugin's release method,
			# if the number wasn't ported
			if($ported == false && $vp->call_did_plugin($didClass,'release') == false) {
				# Post an error message
				;
			}
			$didClass->delete();
		} else {
			$didClass->save();
		}
		return true;
	}

	function p_one($id)
	{
		$db =& DB();
	
		# Get the asterisk global configuration
		$sql = sqlSelect($db, "voip", "voip_vm_passwd, voip_secret_gen", "");
		$rs = $db->Execute($sql);
		$this->voip_vm_passwd = $rs->fields['voip_vm_passwd'];
		$this->voip_secret_gen = $rs->fields['voip_secret_gen'];
		
		# pass onto the parent class
		parent::p_one($id);
	}

	# send a debugging email
	function sendDebug($defined_vars, $d = 'Nothing')
	{
		$ignorelist=array("HTTP_POST_VARS","HTTP_GET_VARS",
			"HTTP_COOKIE_VARS","HTTP_SERVER_VARS","_SERVER",
			"HTTP_ENV_VARS","HTTP_SESSION_VARS",
			"_ENV","PHPSESSID","SESS_DBUSER",
			"SESS_DBPASS","HTTP_COOKIE");

		$timestamp=date("m/d/Y h:j:s");
		$message="Debug report created $timestamp\n";
		$message .= "\n\nLocally generated messages:\n\n";
		$message .= $d;
		if (defined('PROVISIONING_DEBUG')) {
			mail('me@me.com','VOIP Plugin Debug for '.URL,$message);
		}
	}
}

?>