<?php

/**
  * DirectAdmin API Translate Class
  *
  * This class translates all the DirectAdmin API functions to PHP functions
  *
  * Usage:
  * $da = new DAClass($HTTPSocket)
  * echo $da->CMD_API_ADMIN_STATS();
  *
  * @author Daan van Gorkum <djvg@djvg.net>
  * @package DAClass
  * @version 1.0
  */
  
class DAClass{
    
    private $socket;
    
    public function __construct($HTTPSocket){
        $this->socket = $HTTPSocket;
    }
    
    function CMD_API_ACCOUNT_ADMIN($action = 'create', $username, $email, $passwd, $passwd2, $notify = 'no') {
        if($this->_empty($username) || $this->_empty($email) || $this->_empty($passwd) || $this->_empty($passwd2)) {
            return 'fieldempty';
        }else{
            if($passwd != $passwd2) {
                return 'pwnotequal';
            }else{
                $query = array(
                               'action' => $action,
                               'email' => $email,
                               'username' => $username,
                               'passwd' => $passwd,
                               'passwd2' => $passwd2,
                               'notify' => $notify
                               );
                $this->socket->query('/CMD_API_ACCOUNT_ADMIN', $query);
                $result = $this->socket->fetch_parsed_body();
                if($result['error'] == 0) {
                    return 'succes';
                } else {
                    return 'failed';
                }
            }
        }                               
                
    }
    
    function CMD_API_ACCOUNT_RESELLER_CREATE($username, $email, $passwd, $passwd2, $domain, $package, $ip, $notify = 'no') {
        if($this->_empty($username) || $this->_empty($email) || $this->_empty($passwd) || $this->_empty($passwd2) || $this->_empty($domain) || $this->_empty($package) || $this->_empty($ip)) {
            return 'fieldempty';
        }elseif($passwd != $passwd2) {
            return 'pwnotequal';
        }elseif(strlen($passwd) < 5) {
            return 'pwtoshort';
        }elseif(strlen($username) < 4) {
            return 'untoshort';
        }elseif(strlen($username) > 10) {
            return 'untolong';
        }elseif($this->USERNAME_EXISTS($username)) {
            return 'unexists';
        }elseif(is_numeric(substr($username, 0, -(strlen($username) - 1)))) {
            return 'firstcharisnumeric';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainexists';
        }elseif(!$this->PACKAGE_EXISTS('RESELLER', $package)) {
            return 'pkgnotexists';
        }else{
            $query = array(
                           'action'        =>    'create',
                           'add'        =>    'Submit',
                           'username'    =>    $username,
                           'email'        =>    $email,
                           'passwd'        =>    $passwd,
                           'passwd2'    =>    $passwd2,
                           'domain'        =>    $domain,
                           'package'    =>    $package,
                           'ip'            =>    $ip,
                           'notify'        =>    $notify
                           );
            $this->socket->query('/CMD_API_ACCOUNT_RESELLER', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
                           
    }
    
    function CMD_API_ACCOUNT_RESELLER_CREATE_CUSTOM($username,
                                             $email,
                                             $passwd,
                                             $passwd2,
                                             $domain,
                                             $bandwidth,
                                             $quota,
                                             $vdomains,
                                             $nsubdomains,
                                             $ips,
                                             $nemails,
                                             $nemailf,
                                             $nemailml,
                                             $nemailr,
                                             $mysql,
                                             $domainptr,
                                             $ftp,
                                             $aftp,
                                             $php,
                                             $cgi,
                                             $ssl,
                                             $ssh,
                                             $userssh,
                                             $dnscontrol,
                                             $dns,
                                             $serverip,
                                             $spam,
                                             $catchall,
                                             $oversell,
                                             $cron,
                                             $sysinfo,
                                             $suspend_at_limit,
                                             $ip,
                                             $notify = 'no') {
        
        if($this->_empty($username) || $this->_empty($email) || $this->_empty($passwd) || $this->_empty($passwd2) || $this->_empty($domain) || $this->_empty($bandwidth) || $this->_empty($quota) || $this->_empty($vdomains) || $this->_empty($nsubdomains) || $this->_empty($ips) || $this->_empty($nemails) || $this->_empty($nemailf)|| $this->_empty($nemailml) || $this->_empty($nemailr) || $this->_empty($mysql) || $this->_empty($domainptr) || $this->_empty($ftp) || $this->_empty($aftp) || $this->_empty($php) || $this->_empty($cgi) || $this->_empty($ssl) || $this->_empty($ssh) || $this->_empty($userssh) || $this->_empty($dnscontrol) || $this->_empty($dns) || $this->_empty($serverip) || $this->_empty($spam) || $this->_empty($catchall) || $this->_empty($oversell) || $this->_empty($cron) || $this->_empty($sysinfo) || $this->_empty($suspend_at_limit) || $this->_empty($ip)) {
            return 'fieldempty';
        }elseif($passwd != $passwd2) {
            return 'pwnotequal';
        }elseif(strlen($passwd) < 5) {
            return 'pwtoshort';
        }elseif(strlen($username) < 4) {
            return 'untoshort';
        }elseif(strlen($username) > 10) {
            return 'untolong';
        }elseif($this->USERNAME_EXISTS($username)) {
            return 'unexists';
        }elseif(is_numeric(substr($username, 0, -(strlen($username) - 1)))) {
            return 'firstcharisnumeric';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainexists';
        }
        
        $query = array(
                    'action'    =>    'create',
                    'add'        =>    'Submit',
                       'username'    =>    $username,
                    'email'        =>    $email,
                    'passwd'    =>    $passwd,
                    'passwd2'    =>    $passwd2,
                    'domain'    =>    $domain
                    );
        
        $varnames = array('bandwidth', 'quota', 'vdomains', 'nsubdomains', 'nemails', 'nemailf', 'nemailml', 'nemailr', 'mysql', 'domainptr', 'ftp');
        foreach ($varnames as $varname) {
            if(!is_numeric($$varname)) {
                return $varname . 'nan';       
            }elseif($$varname == 0) {
                $query['u' . $varname] = 'ON';
            }else{
                $query[$varname] = $$varname;
            }
        }
        
        $varnames = array('aftp', 'php', 'cgi', 'ssl', 'ssh', 'userssh', 'dnscontrol', 'serverip', 'spam', 'catchall', 'oversell', 'cron', 'sysinfo', 'suspend_at_limit');
        foreach ($varnames as $varname) {
            if($$varname != 'ON' && $$varname != 'OFF') {
                return $varname . 'invalid';       
            }else{
                $query[$varname] = $$varname;
            }
        }
        
        if(!is_numeric($ips)) {
            return 'ipsinvalid';
        }else{
            $query['ips'] = $ips;
        }
        
        if($dns != 'OFF' && $dns != 'TWO' && $dns != 'THREE') {
            return 'dnsinvalid';
        }else{
            $query['dns'] = $dns;
        }
        
        if($ip != 'shared' && $notify != 'assign') {
            return 'ipinvalid';
        }else{
            $query['ip'] = $ip;
        }
        
        if($notify != 'yes' && $notify != 'no') {
            return 'notifyinvalid';
        }else{
            $query['notify'] = $notify;
        }
        
        $this->socket->query('/CMD_API_ACCOUNT_RESELLER', $query);            
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'succes';
        }else{
            return 'failed';
        }        
    }
    
    function CMD_API_ACCOUNT_USER_CREATE($username, $email, $passwd, $passwd2, $domain, $package, $ip, $notify = 'no') {
        $ips = $this->CMD_API_SHOW_RESELLER_IPS();
        if($this->_empty($username) || $this->_empty($email) || $this->_empty($passwd) || $this->_empty($passwd2) || $this->_empty($domain) || $this->_empty($package) || $this->_empty($ip)) {
            return 'fieldempty';
        }elseif($passwd != $passwd2) {
            return 'pwnotequal';
        }elseif(strlen($passwd) < 5) {
            return 'pwtoshort';
        }elseif(strlen($username) < 4) {
            return 'untoshort';
        }elseif(strlen($username) > 10) {
            return 'untolong';
        }elseif($this->USERNAME_EXISTS($username)) {
            return 'unexists';
        }elseif(is_numeric(substr($username, 0, -(strlen($username) - 1)))) {
            return 'firstcharisnumeric';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainexists';
        }elseif(!$this->PACKAGE_EXISTS('USER', $package)) {
            return 'pkgnotexists';
        }elseif(!in_array($ip, $ips['list'])) {
            return 'ipinvalid';                                    
        }else{
            $query = array(
                           'action'        =>    'create',
                           'add'        =>    'Submit',
                           'username'    =>    $username,
                           'email'        =>    $email,
                           'passwd'        =>    $passwd,
                           'passwd2'    =>    $passwd2,
                           'domain'        =>    $domain,
                           'package'    =>    $package,
                           'ip'            =>    $ip,
                           'notify'        =>    $notify
                           );
            $this->socket->query('/CMD_API_ACCOUNT_USER', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
                           
    }
    
    function CMD_API_ACCOUNT_USER_CREATE_CUSTOM($username,
                                             $email,
                                             $passwd,
                                             $passwd2,
                                             $domain,
                                             $bandwidth,
                                             $quota,
                                             $vdomains,
                                             $nsubdomains,
                                             $nemails,
                                             $nemailf,
                                             $nemailml,
                                             $nemailr,
                                             $mysql,
                                             $domainptr,
                                             $ftp,
                                             $aftp,
                                             $cgi,
                                             $php,
                                             $spam,
                                             $cron,
                                             $catchall,
                                             $ssl,
                                             $ssh,
                                             $sysinfo,
                                             $dnscontrol,
                                             $suspend_at_limit,
                                             $ip,
                                             $notify = 'no') {
        
        $ips = $this->CMD_API_SHOW_RESELLER_IPS();        
        if($this->_empty($username) || $this->_empty($email) || $this->_empty($passwd) || $this->_empty($passwd2) || $this->_empty($domain) || $this->_empty($bandwidth) || $this->_empty($quota) || $this->_empty($vdomains) || $this->_empty($nsubdomains) || $this->_empty($nemails) || $this->_empty($nemailf) || $this->_empty($nemailml) || $this->_empty($nemailr) || $this->_empty($mysql) || $this->_empty($domainptr) || $this->_empty($ftp) || $this->_empty($aftp) || $this->_empty($cgi) || $this->_empty($php) || $this->_empty($spam) || $this->_empty($cron) || $this->_empty($catchall) || $this->_empty($ssl) || $this->_empty($ssh) || $this->_empty($sysinfo) || $this->_empty($dnscontrol) || $this->_empty($suspend_at_limit) || $this->_empty($ip)) {
            return 'fieldempty';
        }elseif($passwd != $passwd2) {
            return 'pwnotequal';
        }elseif(strlen($passwd) < 5) {
            return 'pwtoshort';
        }elseif(strlen($username) < 4) {
            return 'untoshort';
        }elseif(strlen($username) > 10) {
            return 'untolong';
        }elseif($this->USERNAME_EXISTS($username)) {
            return 'unexists';
        }elseif(is_numeric(substr($username, 0, -(strlen($username) - 1)))) {
            return 'firstcharisnumeric';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainexists';
        }elseif(!in_array($ip, $ips['list'])) {
            return 'ipinvalid';                                    
        }    
        
        $query = array(
                'action'    =>    'create',
                'add'        =>    'Submit',
                   'username'    =>    $username,
                'email'        =>    $email,
                'passwd'    =>    $passwd,
                'passwd2'    =>    $passwd2,
                'domain'    =>    $domain,
                'ip'        =>    $ip,
                'notify'    =>    $notify
                );
        
        $varnames = array('bandwidth', 'quota', 'vdomains', 'nsubdomains', 'nemails', 'nemailf', 'nemailml', 'nemailr', 'mysql', 'domainptr', 'ftp');
        foreach ($varnames as $varname) {
            if(!is_numeric($$varname)) {
                return $varname . 'nan';       
            }elseif($$varname == 0) {
                $query['u' . $varname] = 'ON';
            }else{
                $query[$varname] = $$varname;
            }
        }
        
        $varnames = array('aftp', 'php', 'cgi', 'ssl', 'ssh', 'dnscontrol', 'spam', 'catchall', 'cron', 'sysinfo', 'suspend_at_limit');
        foreach ($varnames as $varname) {
            if($$varname != 'ON' && $$varname != 'OFF') {
                return $varname . 'invalid';       
            }else{
                $query[$varname] = $$varname;
            }
        }
            $this->socket->query('/CMD_API_ACCOUNT_USER', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }    
    }
    
    function CMD_API_SHOW_RESELLER_IPS() {
        $this->socket->query('/CMD_API_SHOW_RESELLER_IPS');
        $result = $this->socket->fetch_parsed_body();
        return $result;
    }
    
    function CMD_API_SELECT_USERS($username) {
        if(!$this->USERNAME_EXISTS($username)) {
            return 'unnotexists';
        }else{
            $query = array(
                           'confirmed'     =>    'Confirm',
                           'delete'        =>    'yes',
                           'select0'    =>    $username
                           );
            $this->socket->query('/CMD_API_SELECT_USERS', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_USERS_ACTIVATE($username, $activate) {
        if(!$this->USERNAME_EXISTS($username)) {
            return 'unnotexists';
        }elseif($activate == '1') {
            $action = 'dounsuspend';
        }elseif($activate == '0') {
            $action = 'dosuspend';
        }
        $query = array(
                       $action        =>    '1',
                       'select0'    =>    $username
                       );
        $this->socket->query('/CMD_API_SELECT_USERS', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'succes';
        }else{
            return 'failed';
        }
    }
    
    function CMD_API_SHOW_USERS($reseller = '') {
        if(!$this->_empty($reseller)) {
            if(!$this->USERNAME_EXISTS($reseller)) {
                return 'unnotexists';
            }else{
                $query = array('reseller' => $reseller);
            }
        }else{
            $query = array('' => '');
        }
        
        $this->socket->query('/CMD_API_SHOW_USERS', $query);
        $result = $this->socket->fetch_parsed_body();
        return $result['list'];
    }
    
    function CMD_API_SHOW_RESELLERS() {
        $this->socket->query('/CMD_API_SHOW_RESELLERS');
        $result = $this->socket->fetch_parsed_body();
        return $result['list'];
    }
    
    function CMD_API_SHOW_ADMINS() {
        $this->socket->query('/CMD_API_SHOW_ADMINS');
        $result = $this->socket->fetch_parsed_body();
        return $result['list'];
    }
    
    function CMD_API_SHOW_ALL_USERS() {
        $this->socket->query('/CMD_API_SHOW_ALL_USERS');
        $result = $this->socket->fetch_parsed_body();
        return $result['list'];
    }
    
    function CMD_API_CHANGE_INFO_UPDATE() {
        $query = array('update' =>    '1');
        $this->socket->query('/CMD_API_CHANGE_INFO', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'succes';
        }else{
            return 'failed';
        }
    }
    
    function CMD_API_CHANGE_INFO_EMAIL($email) {
        $query = array(
                       'email'     =>    '1',
                       'evalue' =>    $email
                       );
        $this->socket->query('/CMD_API_CHANGE_INFO', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'succes';
        }else{
            return 'failed';
        }
    }
    
    function CMD_API_CHANGE_INFO_NAME($name) {
        $query = array(
                       'name'     =>    '1',
                       'nvalue' =>    $name
                       );
        $this->socket->query('/CMD_API_CHANGE_INFO', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'succes';
        }else{
            return 'failed';
        }
    }
    
    function CMD_API_CHANGE_INFO_LANG($lang) {
        $query = array(
                       'language'     =>    '1',
                       'lvalue' =>    $lang
                       );
        $this->socket->query('/CMD_API_CHANGE_INFO', $query);
        $result = $this->socket->fetch_parsed_body();
        print_r($result);
        if($result['error'] == 0) {
            return 'succes';
        }else{
            return 'failed';
        }
    }
        
    function CMD_API_TICKET_INDEX() {
        $this->socket->query('/CMD_API_TICKET');
        $result = $this->NVP_TO_ARRAY($this->socket->fetch_parsed_body());
        return $result;
        
    }
    
    function CMD_API_TICKET_VIEW($number) {
        if(!is_numeric($number)) {
            return 'ticketnan';
        }
        $this->socket->query('/CMD_API_TICKET?action=view&type=ticket&number=' . $number);
        $result = $this->NVP_TO_ARRAY($this->socket->fetch_parsed_body());
        return $result;
    }
    
    function CMD_API_TICKET_CREATE($user, $priority, $subject, $message, $email_only = 'no') {
        if($this->_empty($user) || $this->_empty($priority) || $this->_empty($subject) || $this->_empty($message)) {
            return 'fieldempty';
        }elseif($user != 'creator' && $user != 'all' && !$this->USERNAME_EXISTS($user)) {
            return 'userinvalid';
        }elseif($priority != '10' && $priority != '20' && $priority != '30') {
            return 'priorityinvalid';
        }else{
            $query = array(
                       'action'        =>    'create',
                       'type'        =>    'request',
                       'user'        =>    $user,
                       'priority'    =>    $priority,
                       'subject'    =>    $subject,
                       'message'    =>    $message,
                       'email_only'    =>    $email_only
                       );
            $this->socket->query('/CMD_API_TICKET_CREATE', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
            
    }
        
    function CMD_API_TICKET_REPLY_USER($number, $user, $priority, $subject, $message) {
        if($this->_empty($user) || $this->_empty($priority) || $this->_empty($subject) || $this->_empty($message) || $this->_empty($number) ) {
            return 'fieldempty';
        }elseif(!is_numeric($number)) {
            return 'ticketnan';
        }elseif($user != 'creator' && $user != 'all' && !$this->USERNAME_EXISTS($user)) {
            return 'userinvalid';
        }elseif($priority != '10' && $priority != '20' && $priority != '30') {
            return 'priorityinvalid';
        }else{
            $query = array(
                        'action'    =>    'reply',
                        'type'        =>    'reply',
                        'number'    =>    $number,
                        'user'        =>    $user,
                        'priority'    =>    $priority,
                        'subject'    =>    $subject,
                        'message'    =>    $message,
                       );
            $this->socket->query('/CMD_API_TICKET', $query);
            $result = $this->socket->fetch_parsed_body();    
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
            
    }
    
    function CMD_API_TICKET_DELETE($number) {
        if($this->_empty($number)) {
            return  'fieldempty';
        }else{
            $query = array(
                        'action'    =>    'multiple',
                        'select0'    =>    $number,
                        'delete'    =>    '1'
                        );
            $this->socket->query('/CMD_API_TICKET', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_TICKET_SET_EMAIL($email, $on) {
        if($this->_empty($email) || $this->_empty($on)) {
            return 'fieldempty';
        }else{
            $query = array(
                        'action'    =>    'email',
                        'email'        =>    $email,
                        );
            if($on == 'yes') {
                $query['ON'] = $on;
            }
            $this->socket->query('/CMD_API_TICKET', $query);
            $result = $this->socket->fetch_parsed_body();            
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_TICKET_MANAGE_VIEW_SETTINGS_RESELLER() {
        $this->socket->query('/CMD_API_TICKET_MANAGE');
        $result = $this->socket->fetch_parsed_body();
        return $result;
    }
    
    function CMD_API_TICKET_MANAGE_SET_STATUS($active, $link) {
        if($this->_empty($active) || $this->_empty($link)) {
            return 'fieldempty';
        }else{
            $query = array(
                        'action'    =>    'active',
                        'html'        =>    $link
                        );
            if($active == 'yes') {
                $query['active'] = $active;
            }
            $this->socket->query('/CMD_API_TICKET_MANAGE', $query);
            $result = $this->socket->fetch_parsed_body();        
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_TICKET_MANAGE_REPLY_TO_USER($number, $user, $subject, $status, $message) {
        if($this->_empty($number) || $this->_empty($user) || $this->_empty($subject) || $this->_empty($status) || $this->_empty($message)) {
            return 'fieldempty';
        }elseif(!is_numeric($number)) {
            return 'ticketnan';
        }elseif(!$this->USERNAME_EXISTS($user)) {
            return 'userinvalid';
        }elseif($status != 'open' && $status != 'closed') {
            return 'statusivalid';
        }else{
            $query = array(
                        'action'    =>    'reply',
                        'type'        =>    'reply',
                        'number'    =>    $number,
                        'user'        =>    $user,
                        'subject'    =>    $subject,
                        'priority'    =>    'none',
                        'status'    =>    $status,
                        'message'    =>    $message
                        );
            $this->socket->query('/CMD_API_TICKET_MANAGE', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_TICKET_MANAGE_CHANGE_STATUS($number, $status) {
        if($this->_empty($number) || $this->_empty($status)) {
            return 'fieldempty';
        }elseif(!is_numeric($number)) {
            return 'ticketnan';
        }elseif($status != 'open' && $status != 'closed') {
            return 'statusivalid';
        }else{
            $query = array(
                'action'    =>    'status',
                'number'    =>    $number,
                'status'    =>    $status
                );
            $this->socket->query('/CMD_API_TICKET_MANAGE', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_MODIFY_USER($user,
                                $bandwidth,
                                $quota,
                                $vdomains,
                                $nsubdomains,
                                $nemails,
                                $nemailf,
                                $nemailml,
                                $nemailr,
                                $mysql,
                                $domainptr,
                                $ftp,
                                $aftp,
                                $cgi,
                                $php,
                                $spam,
                                $cron,
                                $ssl,
                                $sysinfo,
                                $ssh,
                                $dnscontrol,
                                $catchall,
                                $suspend_at_limit,
                                $skin,
                                $ns1,
                                $ns2) {
        if($this->_empty($user) || $this->_empty($bandwidth) || $this->_empty($quota) || $this->_empty($vdomains) || $this->_empty($nsubdomains) || $this->_empty($nemails) || $this->_empty($nemailf) || $this->_empty($nemailml) || $this->_empty($nemailr) || $this->_empty($mysql) || $this->_empty($domainptr) || $this->_empty($ftp) || $this->_empty($aftp) || $this->_empty($cgi) || $this->_empty($php) || $this->_empty($spam) || $this->_empty($cron) || $this->_empty($ssl) || $this->_empty($sysinfo) || $this->_empty($ssh) || $this->_empty($dnscontrol) || $this->_empty($catchall) || $this->_empty($suspend_at_limit) || $this->_empty($skin) || $this->_empty($ns1) || $this->_empty($ns2)) {
            return 'fieldempty';
        }elseif(!$this->USERNAME_EXISTS($user)) {
            return 'userinvalid';
        }
        
        $query = array(
                        'action'    =>    'customize',
                        'Save'        =>    'Submit',
                        'user'        =>    $user,
                        'skin'        =>    $skin,
                        'ns1'        =>    $ns1,
                        'ns2'        =>    $ns2
                        );
        
        
        $varnames = array('bandwidth', 'quota', 'vdomains', 'nsubdomains', 'nemails', 'nemailf', 'nemailml', 'nemailr', 'mysql', 'domainptr', 'ftp');
        foreach ($varnames as $varname) {
            if(!is_numeric($$varname)) {
                return $varname . 'nan';       
            }elseif($$varname == 0) {
                $query['u' . $varname] = 'ON';
            }else{
                $query[$varname] = $$varname;
            }
        }
        
        $varnames = array('aftp', 'php', 'cgi', 'ssl', 'ssh', 'spam', 'cron', 'dnscontrol', 'sysinfo', 'catchall', 'suspend_at_limit');
        foreach ($varnames as $varname) {
            if($$varname != 'ON' && $$varname != 'OFF') {
                return $varname . 'invalid';       
            }else{
                $query[$varname] = $$varname;
            }
        }
        
        $this->socket->query('/CMD_API_MODIFY_USER', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
        }
    }

    function CMD_API_ADMIN_STATS() {
        $this->socket->query('/CMD_API_ADMIN_STATS');
        $result = $this->socket->fetch_parsed_body();
        return $result;
    }
    
    function CMD_API_SHOW_USER_USAGE($user = NULL) {
        $query = array();
        if(!$this->_empty($user)) {
            if(!$this->USERNAME_EXISTS($user)) {
                return 'userinvalid';
            }else{
                $query['user'] = $user;
            }                
        }
        $this->socket->set_method('GET');
        $this->socket->query('/CMD_API_SHOW_USER_USAGE', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
                return $result;
            }else{
                return 'failed';
        }
    }
    
    function CMD_API_SHOW_USER_CONFIG($user = NULL) {
        $query = array();
        if(!$this->_empty($user)) {
            if(!$this->USERNAME_EXISTS($user)) {
                return 'userinvalid';
            }else{
                $query['user'] = $user;
            }                
        }
        $this->socket->set_method('GET');
        $this->socket->query('/CMD_API_SHOW_USER_CONFIG', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
                return $result;
            }else{
                return 'failed';
        }
    }
    
    function CMD_API_SHOW_USER_DOMAINS($user) {
        if($this->_empty($user)) {
            return 'fieldempty';
        }elseif(!$this->USERNAME_EXISTS($user)) {
            return 'userinvalid';
        }else{
            $query = array(
                        'user' => $user
                        );
            $this->socket->set_method('GET');
            $this->socket->query('/CMD_API_SHOW_USER_DOMAINS', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                    return $result;
                }else{
                    return 'failed';
            }
        }
    }
    
    function CMD_API_PACKAGES_RESELLER_SHOW_ALL() {
        $this->socket->query('/CMD_API_PACKAGES_RESELLER');
        $result = $this->socket->fetch_parsed_body();
        return $result;
    }
    
    function CMD_API_PACKAGES_RESELLER_SHOW($package) {
        if($this->_empty($package)) {
            return 'fieldempty';
        }elseif(!$this->PACKAGE_EXISTS('RESELLER', $package)) {
            return 'packageinvalid';
        }else{
            $query = array(
                        'package' => $package
                        );
            $this->socket->set_method('GET');
            $this->socket->query('/CMD_API_PACKAGES_RESELLER', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                    return $result;
                }else{
                    return 'failed';
            }
        }
    }
    
    function CMD_API_PACKAGES_USER_SHOW_ALL() {
        $this->socket->query('/CMD_API_PACKAGES_USER');
        $result = $this->socket->fetch_parsed_body();
        return $result;
    }
    
    function CMD_API_PACKAGES_USER_SHOW($package) {
        if($this->_empty($package)) {
            return 'fieldempty';
        }elseif(!$this->PACKAGE_EXISTS('USER', $package)) {
            return 'packageinvalid';
        }else{
            $query = array(
                        'package' => $package
                        );
            $this->socket->set_method('GET');
            $this->socket->query('/CMD_API_PACKAGES_USER', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                    return $result;
                }else{
                    return 'failed';
            }
        }
    }
    
    function CMD_API_GET_SESSION($ip, $session_id) {
        if($this->_empty($ip) || $this->_empty($session_id))  {
            return 'fieldempty';
        }else{
            $query = array(
                        'ip'            =>    $ip,
                        'session_id'    => $session_id
                        );
            $this->socket->query('/CMD_API_GET_SESSION', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                    return $result;
                }else{
                    return 'failed';
            }
        }
    }
    
    function CMD_API_SHOW_DOMAINS() {
        $this->socket->query('/CMD_API_SHOW_DOMAINS');
        $result = $this->socket->fetch_parsed_body();
        return $result;
    }
    
    function CMD_API_SHOW_SUBDOMAINS($domain) {
        if($this->_empty($domain))  {
            return 'fieldempty';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainnotexists';
        }else{
            $query = array(
                           'domain'    =>    $domain
                           );
            $this->socket->query('/CMD_API_SUBDOMAINS', $query);
            $result = $this->socket->fetch_parsed_body();
            return $result;
        }
    }
    
    function CMD_API_CREATE_SUBDOMAIN($domain, $subdomain) {
        if($this->_empty($domain) || $this->_empty($subdomain))  {
            return 'fieldempty';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainnotexists';
        }
        
        $query = array(
                       'domain'        =>    $domain,
                       'action'        =>    'create',
                       'subdomain'    =>    $subdomain
                       );
        $this->socket->query('/CMD_API_SUBDOMAINS', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'succes';
        }else{
            return 'failed';
        }
    }
    
    function CMD_API_DELETE_SUBDOMAIN($domain, $subdomain, $contents) {
        if($this->_empty($domain) || $this->_empty($subdomain) || $this->_empty($contents))  {
            return 'fieldempty';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainnotexists';
        }elseif($contents != 'no' && $contents != 'yes') {
            return 'contentsinvalid';
        }
        
        $query = array(
                       'domain'        =>    $domain,
                       'action'        =>    'delete',
                       'select0'    =>    $subdomain,
                       'contents'    =>    $contents
                       );
        $this->socket->query('/CMD_API_SUBDOMAINS', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'succes';
        }else{
            return 'failed';
        }
    }
    
    function CMD_API_SHOW_DATABASES() {
        $this->socket->query('/CMD_API_DATABASES');
        $result = $this->socket->fetch_parsed_body();
        return $result;
    }
    
    function CMD_API_CREATE_DATABASES($dbname, $uname, $passwd1, $passwd2) {
        if($this->_empty($dbname) || $this->_empty($uname) || $this->_empty($passwd1) || $this->_empty($passwd2)) {
            return 'fieldempty';
        }elseif($passwd1 != $passwd2) {
            return 'pwnotequal';
        }else{
            $query = array(
                        'action'    =>    'create',
                        'name'        =>    $dbname,    // username_ will be added
                        'user'        =>    $uname,        // username_ will be added
                        'passwd'    =>    $passwd1,
                        'passwd2'    =>    $passwd2
                        );
            $this->socket->query('/CMD_API_DATABASES', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_DELETE_DATABASES($db) {
        if($this->_empty($db)) {
            return 'fieldempty';
        }else{
            $query = array(
                          'action'    =>    'delete',
                          'select0'    =>    $db
                          );
            $this->socket->query('/CMD_API_DATABASES', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_CHANGE_EMAIL_PASSWORD($email, $oldpass, $passwd1, $passwd2) {
        if($this->_empty($email) || $this->_empty($oldpass) || $this->_empty($passwd1) || $this->_empty($passwd2)) {
            return 'fieldempty';
        }elseif($passwd1 != $passwd2) {
            return 'pwnotequal';
        }else{
            $query = array(
                        'email'            =>    $email,
                        'oldpassword'    =>    $oldpass,
                        'password1'        =>    $passwd1,
                        'password2'        =>    $passwd2,
                        'api'            =>    'yes'
                        );
            $this->socket->query('/CMD_CHANGE_EMAIL_PASSWORD', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_SHOW_POP($domain) {
        if($this->_empty($domain)) {
            return 'fieldempty';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainnotexists';
        }else{
            $query = array(
                        'action'    =>    'list',
                        'domain'    =>    $domain
                           );
            $this->socket->query('/CMD_API_POP', $query);
            $result = $this->socket->fetch_parsed_body();
            return $result;
        }
    }
    
    function CMD_API_CREATE_POP($domain, $user, $passwd, $quota) {
        if($this->_empty($domain) || $this->_empty($user) || $this->_empty($passwd) || $this->_empty($quota)) {
            return 'fieldempty';
        }elseif(!is_numeric($quota)) {
            return 'quotanan';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainnotexists';
        }else{
            $query = array(
                        'action'    =>    'create',
                        'domain'    =>    $domain,
                        'user'        =>    $user,
                        'passwd'    =>    $passwd,
                        'quota'        =>    $quota
                        );
            $this->socket->query('/CMD_API_POP', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_DELETE_POP($domain, $user) {
        if($this->_empty($domain) || $this->_empty($user)) {
            return 'fieldempty';
        }elseif(!$this->DOMAIN_EXISTS($domain)) {
            return 'domainnotexists';
        }else{
            $query = array(
                        'action'    =>    'delete',
                        'domain'    =>    $domain,
                        'user'        =>    $user
                        );
            $this->socket->query('/CMD_API_POP', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    function CMD_API_SHOW_DNS($domain, $urlencoded = FALSE) {
        if($this->_empty($domain)) {
            return 'fieldempty';
        }elseif($this->DOMAIN_EXISTS($domain)) {
            return 'domainnotexists';
        }else{
            $query = array(
                        'domain'    =>    $domain
                        );
            if($urlencoded == TRUE) {
                $query['urlencoded'] = 'yes';
            }
            $this->socket->query('/CMD_API_DNS_ADMIN', $query);
            $result = $this->socket->fetch_body();
            return $result;
        }
    }
    
    function CMD_API_DOMAIN_POINTER_ADD($mdomain, $domain, $alias = NULL) {
        if($this->_empty($domain) || $this->_empty($mdomain)) {
            return 'fieldempty';
        }else{
            $query = array(
                        'domain'    =>    $mdomain,
                        'action'    =>    'add',
                        'from'        =>    $domain
                        );
            if(isset($alias) && $alias == 'yes') {
                $query['alias'] = 'yes';
            }
            $this->socket->query('/CMD_API_DOMAIN_POINTER', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }        
    }    
    
    function CMD_API_DNS_ADMIN_ZONE_ADD($domain, $ip, $ns1, $ns2) {
        if($this->_empty($domain)) {
            return 'fieldempty';
        }else{
            $query = array(
                        'action'    =>    'create',
                        'domain'    =>    $domain,
                        'ip'        =>    $ip,
                        'ns1'        =>    $ns1,
                        'ns2'        =>    $ns2
                        );
            $this->socket->query('/CMD_API_DNS_ADMIN', $query);
            $result = $this->socket->fetch_parsed_body();
            if($result['error'] == 0) {
                return 'succes';
            }else{
                return 'failed';
            }
        }
    }
    
    //Not tested, so check it first!!! ---17-01-2012---
    function CMD_API_DNS_ADMIN_TTL($domain) {
        if($this->_empty($domain)) {
            return 'fieldempty';
        }else{
            $query = array (
                'domain'        => $domain,
                'urlencoded'    => 'yes',
                'ttl'            => 'yes'
            );
            $this->socket->query('/CMD_API_DNS_ADMIN', $query);
            $result = $this->socket->fetch_body();
            return $result;
        }        
    }
    
    function CMD_API_DNS_ADMIN_DELETE($domain, $records) {
        $query = array (
            'domain'     => $domain,
            'action'    => 'select',
        );
        foreach($records as $key => $value) {
            $query[$key] = $value;
        }
        
        
        
        $this->socket->query('/CMD_API_DNS_ADMIN', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'success';
        }else{
            return 'failed';
        }
    }
    
    function CMD_API_DNS_ADMIN_ADD($domain, $name, $type, $value) {
        $query = array(
            'domain'    => $domain,
            'action'    => 'add',
            'type'        => $type,
            'name'        => $name,
            'value'        => $value
            );
        if($type != "TXT") {
            $query['value'] = urldecode($value);
        }
        $this->socket->query('/CMD_API_DNS_ADMIN', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'success';
        }else{
            return 'failed';
        }

    }
    
    function CMD_API_DNS_ADMIN_DELETE_ZONE($domain) {
        $query = array (
            'action'    => 'delete',
            'select0'    => $domain
            );
        $this->socket->query('/CMD_API_DNS_ADMIN', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'success';
        }else{
            return 'failed';
        }            
    }

    function CMD_API_DOMAIN_POINTERS_DOMAINS($domain) {
        $query = array (
            'domain'     => $domain,
        );
        $this->socket->query('/CMD_API_DOMAIN_POINTER', $query);
        $result = $this->socket->fetch_parsed_body();
        if(empty($result)) {
            return false;
        }else{
            return $result;
        }
    }
    
    function CMD_API_DOMAIN_POINTERS_REMOVE($masterDomain, $domain) {
        $query = array (
            'domain'     => $masterDomain,
            'action'    => 'delete',
            'select0'    => $domain
        );
        $this->socket->query('/CMD_API_DOMAIN_POINTER', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'success';
        }else{
            return 'failed';
        }    
    }
    
    function CMD_API_USER_PASSWD($userName, $password) {
        $query = array(
            'username'    => $userName,
            'passwd'    => $password,
            'passwd2'    => $password
            );
        $this->socket->query('/CMD_API_USER_PASSWD', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0) {
            return 'success';
        }else{
            return 'failed';
        }    
            
    }

    // Subfunctions needed by functions:

    function DOMAIN_EXISTS($domain) {
        $domain = ereg_replace('http://', '', $domain);
        $domain = ereg_replace('www.', '', $domain);
        $query = array('domain' => $domain, 'action' => 'exists');
        $this->socket->query('/CMD_API_DNS_ADMIN', $query);
        $result = $this->socket->fetch_parsed_body();
        if($result['error'] == 0 && $result['exists'] == 0) {
            return TRUE;
        }else{
            return FALSE;
        }
    }
    
    function PACKAGE_EXISTS($type, $package) {
        if($type == 'USER') {
            $cmd = '/CMD_API_PACKAGES_USER';
        }elseif($type == 'RESELLER') {
            $cmd = '/CMD_API_PACKAGES_RESELLER';
        }
        $query = array('package' => $package);
        $this->socket->query($cmd, $query);
        $result = $this->socket->fetch_parsed_body();
        if(empty($result)) {
            return FALSE;
        }else{
            return TRUE;
        }
    }
    
    function USERNAME_EXISTS($username) {
        $usernames = '';
        $this->socket->query('/CMD_API_ALL_USER_USAGE');
        $result = explode("\n", $this->socket->fetch_body());
        foreach ($result as $line) {
            $names    = strtok($line, '=');
            $usernames .= $names . "\n";
        }
        $usernames = explode("\n", $usernames);
        if(in_array($username, $usernames)) {
            return TRUE;
        }else{
            return FALSE;
        }            
    }
    
    function NVP_TO_ARRAY($input) {
        $data = array();
        foreach ($input as $i => $str) {
            $data[$i] = array();
            $elements = explode('&', $str);
            foreach ($elements as $namevalue) {
                list($name, $value) = explode('=', $namevalue);
                $data[$i][urldecode($name)] = urldecode($value);
            }
        }
        return $data;
    }

    function _empty($string) {
        $string = trim($string);
        if(!is_numeric($string)) {
            return empty($string);
        }else{
             return FALSE;
        }
    }
}
?>